diff --git a/Aaru.Decoders/.editorconfig b/Aaru.Decoders/.editorconfig new file mode 100644 index 000000000..103a5d927 --- /dev/null +++ b/Aaru.Decoders/.editorconfig @@ -0,0 +1,1342 @@ +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = false +max_line_length = 120 +tab_width = 2 +trim_trailing_whitespace = false +ij_continuation_indent_size = 4 +ij_formatter_off_tag = @formatter:off +ij_formatter_on_tag = @formatter:on +ij_formatter_tags_enabled = true +ij_smart_tabs = false +ij_visual_guides = +ij_wrap_on_typing = false + +# Microsoft .NET properties +csharp_preferred_modifier_order = public, private, protected, internal, file, new, static, abstract, virtual, sealed, readonly, override, extern, unsafe, volatile, async, required:suggestion +csharp_space_after_keywords_in_control_flow_statements = false +csharp_style_namespace_declarations = file_scoped:warning +csharp_style_prefer_utf8_string_literals = true:warning +csharp_style_var_elsewhere = false:suggestion +csharp_style_var_for_built_in_types = false:suggestion +csharp_style_var_when_type_is_apparent = true:suggestion +csharp_using_directive_placement = outside_namespace:silent +dotnet_naming_rule.private_constants_rule.import_to_resharper = as_predefined +dotnet_naming_rule.private_constants_rule.severity = warning +dotnet_naming_rule.private_constants_rule.style = all_upper_style +dotnet_naming_rule.private_constants_rule.symbols = private_constants_symbols +dotnet_naming_rule.unity_serialized_field_rule.import_to_resharper = True +dotnet_naming_rule.unity_serialized_field_rule.resharper_description = Unity serialized field +dotnet_naming_rule.unity_serialized_field_rule.resharper_guid = 5f0fdb63-c892-4d2c-9324-15c80b22a7ef +dotnet_naming_rule.unity_serialized_field_rule.severity = warning +dotnet_naming_rule.unity_serialized_field_rule.style = lower_camel_case_style +dotnet_naming_rule.unity_serialized_field_rule.symbols = unity_serialized_field_symbols +dotnet_naming_style.all_upper_style.capitalization = all_upper +dotnet_naming_style.all_upper_style.word_separator = _ +dotnet_naming_style.lower_camel_case_style.capitalization = camel_case +dotnet_naming_symbols.private_constants_symbols.applicable_accessibilities = private +dotnet_naming_symbols.private_constants_symbols.applicable_kinds = field +dotnet_naming_symbols.private_constants_symbols.required_modifiers = const +dotnet_naming_symbols.unity_serialized_field_symbols.applicable_accessibilities = * +dotnet_naming_symbols.unity_serialized_field_symbols.applicable_kinds = +dotnet_naming_symbols.unity_serialized_field_symbols.resharper_applicable_kinds = unity_serialised_field +dotnet_naming_symbols.unity_serialized_field_symbols.resharper_required_modifiers = instance +dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary:warning +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:warning +dotnet_style_parentheses_in_relational_binary_operators = never_if_unnecessary:warning +dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion +dotnet_style_predefined_type_for_member_access = true:suggestion +dotnet_style_qualification_for_event = false:suggestion +dotnet_style_qualification_for_field = false:suggestion +dotnet_style_qualification_for_method = false:suggestion +dotnet_style_qualification_for_property = false:suggestion +dotnet_style_require_accessibility_modifiers = never:suggestion + +# ReSharper properties +resharper_align_first_arg_by_paren = false +resharper_align_linq_query = true +resharper_align_multiline_argument = true +resharper_align_multiline_array_and_object_initializer = false +resharper_align_multiline_binary_expressions_chain = true +resharper_align_multiline_binary_patterns = true +resharper_align_multiline_calls_chain = true +resharper_align_multiline_expression = true +resharper_align_multiline_expression_braces = true +resharper_align_multiline_extends_list = true +resharper_align_multiline_for_stmt = true +resharper_align_multiline_list_pattern = true +resharper_align_multiline_parameter = true +resharper_align_multiline_property_pattern = true +resharper_align_multiline_switch_expression = true +resharper_align_multiple_declaration = true +resharper_align_multline_type_parameter_constrains = true +resharper_align_multline_type_parameter_list = true +resharper_align_ternary = align_all +resharper_align_tuple_components = true +resharper_autodetect_indent_settings = true +resharper_braces_for_for = required_for_multiline +resharper_braces_for_foreach = required_for_multiline +resharper_braces_for_ifelse = required_for_multiline +resharper_braces_for_while = required_for_multiline +resharper_builtin_type_apply_to_native_integer = false +resharper_constructor_or_destructor_body = expression_body +resharper_csharp_align_first_arg_by_paren = true +resharper_csharp_empty_block_style = together_same_line +resharper_csharp_place_comments_at_first_column = true +resharper_csharp_prefer_qualified_reference = false +resharper_default_value_when_type_not_evident = default_expression +resharper_enforce_line_ending_style = true +resharper_formatter_off_tag = @formatter:off +resharper_formatter_on_tag = @formatter:on +resharper_formatter_tags_enabled = true +resharper_for_built_in_types = use_var_when_evident +resharper_function_declaration_return_type_style = on_single_line +resharper_function_definition_return_type_style = on_single_line +resharper_html_pi_attribute_style = first_attribute_on_single_line +resharper_indent_anonymous_method_block = false +resharper_indent_preprocessor_if = outdent +resharper_indent_preprocessor_other = outdent +resharper_indent_preprocessor_region = outdent +resharper_int_align = true +resharper_int_align_bitfield_sizes = true +resharper_int_align_comments = true +resharper_int_align_declaration_names = true +resharper_int_align_enum_initializers = true +resharper_int_align_eq = true +resharper_keep_existing_embedded_arrangement = false +resharper_keep_existing_initializer_arrangement = false +resharper_keep_existing_linebreaks = false +resharper_keep_existing_list_patterns_arrangement = false +resharper_keep_existing_property_patterns_arrangement = false +resharper_keep_existing_switch_expression_arrangement = false +resharper_line_break_after_colon_in_member_initializer_lists = on_single_line +resharper_line_break_before_requires_clause = on_single_line +resharper_linkage_specification_indentation = all +resharper_local_function_body = expression_body +resharper_member_initializer_list_style = on_single_line +resharper_method_or_operator_body = expression_body +resharper_outdent_binary_ops = true +resharper_outdent_binary_pattern_ops = true +resharper_outdent_commas = true +resharper_outdent_dots = true +resharper_outdent_statement_labels = true +resharper_parentheses_redundancy_style = remove +resharper_place_attribute_on_same_line = false +resharper_place_simple_embedded_statement_on_same_line = false +resharper_place_simple_initializer_on_single_line = false +resharper_qualified_using_at_nested_scope = true +resharper_show_autodetect_configure_formatting_tip = false +resharper_simple_block_style = on_single_line +resharper_simple_case_statement_style = line_break +resharper_simple_embedded_statement_style = on_single_line +resharper_space_after_ptr_in_data_member = false +resharper_space_after_ptr_in_method = false +resharper_space_after_ref_in_data_member = false +resharper_space_after_ref_in_method = false +resharper_space_before_ptr_in_data_member = true +resharper_space_before_ptr_in_method = true +resharper_space_before_ref_in_data_member = true +resharper_space_before_ref_in_method = true +resharper_space_before_template_params = false +resharper_space_within_empty_braces = false +resharper_toplevel_function_declaration_return_type_style = on_single_line +resharper_toplevel_function_definition_return_type_style = on_single_line +resharper_use_indent_from_vs = false +resharper_wrap_after_dot_in_method_calls = true +resharper_wrap_base_clause_style = chop_if_long +resharper_wrap_braced_init_list_style = chop_if_long +resharper_wrap_chained_binary_expressions = chop_if_long +resharper_wrap_chained_method_calls = chop_if_long +resharper_wrap_ctor_initializer_style = chop_if_long +resharper_wrap_lines = true +resharper_xmldoc_attribute_indent = align_by_first_attribute +resharper_xmldoc_attribute_style = first_attribute_on_single_line +resharper_xmldoc_pi_attribute_style = first_attribute_on_single_line + +# ReSharper inspection severities +resharper_annotate_can_be_null_parameter_highlighting = warning +resharper_annotate_can_be_null_type_member_highlighting = warning +resharper_annotate_not_null_parameter_highlighting = warning +resharper_annotate_not_null_type_member_highlighting = warning +resharper_arguments_style_anonymous_function_highlighting = warning +resharper_arguments_style_literal_highlighting = warning +resharper_arguments_style_named_expression_highlighting = warning +resharper_arguments_style_other_highlighting = warning +resharper_arguments_style_string_literal_highlighting = warning +resharper_arrange_accessor_owner_body_highlighting = warning +resharper_arrange_constructor_or_destructor_body_highlighting = warning +resharper_arrange_local_function_body_highlighting = warning +resharper_arrange_method_or_operator_body_highlighting = warning +resharper_arrange_redundant_parentheses_highlighting = hint +resharper_arrange_static_member_qualifier_highlighting = warning +resharper_arrange_this_qualifier_highlighting = hint +resharper_arrange_trailing_comma_in_multiline_lists_highlighting = warning +resharper_arrange_trailing_comma_in_singleline_lists_highlighting = warning +resharper_arrange_type_member_modifiers_highlighting = hint +resharper_arrange_type_modifiers_highlighting = hint +resharper_arrange_var_keywords_in_deconstructing_declaration_highlighting = warning +resharper_async_void_method_highlighting = warning +resharper_auto_property_can_be_made_get_only_global_highlighting = warning +resharper_auto_property_can_be_made_get_only_local_highlighting = warning +resharper_bad_attribute_brackets_spaces_highlighting = warning +resharper_bad_braces_spaces_highlighting = warning +resharper_bad_colon_spaces_highlighting = warning +resharper_bad_comma_spaces_highlighting = warning +resharper_bad_control_braces_indent_highlighting = warning +resharper_bad_control_braces_line_breaks_highlighting = warning +resharper_bad_declaration_braces_indent_highlighting = warning +resharper_bad_declaration_braces_line_breaks_highlighting = warning +resharper_bad_empty_braces_line_breaks_highlighting = warning +resharper_bad_expression_braces_indent_highlighting = warning +resharper_bad_expression_braces_line_breaks_highlighting = warning +resharper_bad_generic_brackets_spaces_highlighting = warning +resharper_bad_indent_highlighting = warning +resharper_bad_linq_line_breaks_highlighting = warning +resharper_bad_member_access_spaces_highlighting = warning +resharper_bad_namespace_braces_indent_highlighting = warning +resharper_bad_parens_line_breaks_highlighting = warning +resharper_bad_parens_spaces_highlighting = warning +resharper_bad_preprocessor_indent_highlighting = warning +resharper_bad_semicolon_spaces_highlighting = warning +resharper_bad_spaces_after_keyword_highlighting = warning +resharper_bad_square_brackets_spaces_highlighting = warning +resharper_bad_switch_braces_indent_highlighting = warning +resharper_bad_symbol_spaces_highlighting = warning +resharper_built_in_type_reference_style_for_member_access_highlighting = hint +resharper_built_in_type_reference_style_highlighting = hint +resharper_check_for_reference_equality_instead_1_highlighting = warning +resharper_check_for_reference_equality_instead_2_highlighting = warning +resharper_check_for_reference_equality_instead_3_highlighting = warning +resharper_check_for_reference_equality_instead_4_highlighting = warning +resharper_class_can_be_sealed_global_highlighting = warning +resharper_class_can_be_sealed_local_highlighting = warning +resharper_class_never_instantiated_global_highlighting = warning +resharper_class_never_instantiated_local_highlighting = warning +resharper_class_with_virtual_members_never_inherited_global_highlighting = warning +resharper_class_with_virtual_members_never_inherited_local_highlighting = warning +resharper_comment_typo_highlighting = none +resharper_compare_non_constrained_generic_with_null_highlighting = warning +resharper_convert_closure_to_method_group_highlighting = warning +resharper_convert_conditional_ternary_expression_to_switch_expression_highlighting = warning +resharper_convert_if_do_to_while_highlighting = warning +resharper_convert_if_statement_to_conditional_ternary_expression_highlighting = warning +resharper_convert_if_statement_to_null_coalescing_assignment_highlighting = warning +resharper_convert_if_statement_to_null_coalescing_expression_highlighting = warning +resharper_convert_if_statement_to_return_statement_highlighting = warning +resharper_convert_if_statement_to_switch_statement_highlighting = warning +resharper_convert_if_to_or_expression_highlighting = warning +resharper_convert_nullable_to_short_form_highlighting = warning +resharper_convert_switch_statement_to_switch_expression_highlighting = warning +resharper_convert_to_auto_property_highlighting = warning +resharper_convert_to_auto_property_when_possible_highlighting = warning +resharper_convert_to_auto_property_with_private_setter_highlighting = warning +resharper_convert_to_compound_assignment_highlighting = warning +resharper_convert_to_constant_global_highlighting = warning +resharper_convert_to_constant_local_highlighting = warning +resharper_convert_to_lambda_expression_highlighting = warning +resharper_convert_to_local_function_highlighting = warning +resharper_convert_to_null_coalescing_compound_assignment_highlighting = warning +resharper_convert_to_primary_constructor_highlighting = warning +resharper_convert_to_static_class_highlighting = warning +resharper_convert_to_using_declaration_highlighting = warning +resharper_cpp_enforce_cv_qualifiers_order_highlighting = hint +resharper_cpp_enforce_cv_qualifiers_placement_highlighting = hint +resharper_cpp_enforce_do_statement_braces_highlighting = hint +resharper_cpp_enforce_for_statement_braces_highlighting = hint +resharper_cpp_enforce_function_declaration_style_highlighting = hint +resharper_cpp_enforce_if_statement_braces_highlighting = hint +resharper_cpp_enforce_type_alias_code_style_highlighting = hint +resharper_cpp_enforce_while_statement_braces_highlighting = hint +resharper_cpp_remove_redundant_braces_highlighting = hint +resharper_double_negation_in_pattern_highlighting = warning +resharper_double_negation_operator_highlighting = warning +resharper_event_never_invoked_global_highlighting = warning +resharper_event_never_subscribed_to_global_highlighting = warning +resharper_event_never_subscribed_to_local_highlighting = warning +resharper_field_can_be_made_read_only_global_highlighting = warning +resharper_field_can_be_made_read_only_local_highlighting = warning +resharper_foreach_can_be_converted_to_query_using_another_get_enumerator_highlighting = warning +resharper_foreach_can_be_partly_converted_to_query_using_another_get_enumerator_highlighting = none +resharper_for_can_be_converted_to_foreach_highlighting = warning +resharper_heap_view_boxing_allocation_highlighting = none +resharper_heap_view_closure_allocation_highlighting = none +resharper_heap_view_delegate_allocation_highlighting = none +resharper_heap_view_object_allocation_evident_highlighting = none +resharper_heap_view_object_allocation_highlighting = none +resharper_identifier_typo_highlighting = none +resharper_incorrect_blank_lines_near_braces_highlighting = warning +resharper_inheritdoc_consider_usage_highlighting = warning +resharper_inline_out_variable_declaration_highlighting = warning +resharper_inline_temporary_variable_highlighting = warning +resharper_introduce_optional_parameters_global_highlighting = warning +resharper_introduce_optional_parameters_local_highlighting = warning +resharper_invert_condition_1_highlighting = warning +resharper_invert_if_highlighting = warning +resharper_invocation_is_skipped_highlighting = warning +resharper_invoke_as_extension_method_highlighting = warning +resharper_join_declaration_and_initializer_highlighting = warning +resharper_join_null_check_with_usage_highlighting = warning +resharper_lambda_expression_must_be_static_highlighting = warning +resharper_local_function_can_be_made_static_highlighting = warning +resharper_loop_can_be_converted_to_query_highlighting = warning +resharper_loop_can_be_partly_converted_to_query_highlighting = warning +resharper_member_can_be_file_local_highlighting = warning +resharper_member_can_be_internal_highlighting = warning +resharper_member_can_be_made_static_global_highlighting = warning +resharper_member_can_be_made_static_local_highlighting = warning +resharper_member_can_be_private_global_highlighting = warning +resharper_member_can_be_private_local_highlighting = warning +resharper_member_can_be_protected_global_highlighting = warning +resharper_member_can_be_protected_local_highlighting = warning +resharper_merge_and_pattern_highlighting = warning +resharper_merge_cast_with_type_check_highlighting = warning +resharper_merge_conditional_expression_highlighting = warning +resharper_merge_into_logical_pattern_highlighting = warning +resharper_merge_into_negated_pattern_highlighting = warning +resharper_merge_into_pattern_highlighting = warning +resharper_merge_nested_property_patterns_highlighting = warning +resharper_merge_sequential_checks_highlighting = warning +resharper_method_has_async_overload_highlighting = warning +resharper_method_has_async_overload_with_cancellation_highlighting = warning +resharper_method_supports_cancellation_highlighting = warning +resharper_missing_blank_lines_highlighting = warning +resharper_missing_linebreak_highlighting = warning +resharper_missing_space_highlighting = warning +resharper_more_specific_foreach_variable_type_available_highlighting = warning +resharper_move_to_existing_positional_deconstruction_pattern_highlighting = warning +resharper_move_variable_declaration_inside_loop_condition_highlighting = warning +resharper_multiple_spaces_highlighting = warning +resharper_multiple_statements_on_one_line_highlighting = warning +resharper_multiple_type_members_on_one_line_highlighting = warning +resharper_negation_of_relational_pattern_highlighting = warning +resharper_negative_equality_expression_highlighting = warning +resharper_nested_string_interpolation_highlighting = warning +resharper_not_accessed_field_global_highlighting = warning +resharper_nullable_warning_suppression_is_used_highlighting = warning +resharper_outdent_is_off_prev_level_highlighting = warning +resharper_out_parameter_value_is_always_discarded_global_highlighting = warning +resharper_parameter_only_used_for_precondition_check_global_highlighting = warning +resharper_parameter_type_can_be_enumerable_global_highlighting = warning +resharper_parameter_type_can_be_enumerable_local_highlighting = warning +resharper_pass_string_interpolation_highlighting = warning +resharper_possible_unintended_queryable_as_enumerable_highlighting = warning +resharper_property_can_be_made_init_only_global_highlighting = warning +resharper_property_can_be_made_init_only_local_highlighting = warning +resharper_public_constructor_in_abstract_class_highlighting = warning +resharper_raw_string_can_be_simplified_highlighting = warning +resharper_redundant_accessor_body_highlighting = warning +resharper_redundant_always_match_subpattern_highlighting = warning +resharper_redundant_array_creation_expression_highlighting = warning +resharper_redundant_attribute_parentheses_highlighting = warning +resharper_redundant_attribute_usage_property_highlighting = warning +resharper_redundant_base_qualifier_highlighting = warning +resharper_redundant_blank_lines_highlighting = warning +resharper_redundant_collection_initializer_element_braces_highlighting = warning +resharper_redundant_configure_await_highlighting = warning +resharper_redundant_declaration_semicolon_highlighting = warning +resharper_redundant_discard_designation_highlighting = warning +resharper_redundant_empty_object_creation_argument_list_highlighting = warning +resharper_redundant_enum_case_label_for_default_section_highlighting = warning +resharper_redundant_explicit_params_array_creation_highlighting = warning +resharper_redundant_fixed_pointer_declaration_highlighting = warning +resharper_redundant_if_else_block_highlighting = warning +resharper_redundant_immediate_delegate_invocation_highlighting = warning +resharper_redundant_is_before_relational_pattern_highlighting = warning +resharper_redundant_lambda_signature_parentheses_highlighting = warning +resharper_redundant_overload_global_highlighting = warning +resharper_redundant_overload_local_highlighting = warning +resharper_redundant_pattern_parentheses_highlighting = warning +resharper_redundant_property_pattern_clause_highlighting = warning +resharper_redundant_query_order_by_ascending_keyword_highlighting = warning +resharper_redundant_range_bound_highlighting = warning +resharper_redundant_readonly_modifier_highlighting = warning +resharper_redundant_space_highlighting = warning +resharper_redundant_string_interpolation_highlighting = warning +resharper_redundant_to_string_call_for_value_type_highlighting = warning +resharper_redundant_verbatim_prefix_highlighting = warning +resharper_redundant_verbatim_string_prefix_highlighting = warning +resharper_redundant_with_expression_highlighting = warning +resharper_remove_constructor_invocation_highlighting = warning +resharper_remove_redundant_braces_highlighting = warning +resharper_remove_redundant_or_statement_false_highlighting = warning +resharper_remove_redundant_or_statement_true_highlighting = warning +resharper_remove_to_list_1_highlighting = warning +resharper_remove_to_list_2_highlighting = warning +resharper_replace_auto_property_with_computed_property_highlighting = warning +resharper_replace_conditional_expression_with_null_coalescing_highlighting = warning +resharper_replace_object_pattern_with_var_pattern_highlighting = warning +resharper_replace_slice_with_range_indexer_highlighting = warning +resharper_replace_substring_with_range_indexer_highlighting = warning +resharper_replace_with_field_keyword_highlighting = warning +resharper_replace_with_first_or_default_1_highlighting = warning +resharper_replace_with_first_or_default_2_highlighting = warning +resharper_replace_with_first_or_default_3_highlighting = warning +resharper_replace_with_first_or_default_4_highlighting = warning +resharper_replace_with_last_or_default_1_highlighting = warning +resharper_replace_with_last_or_default_2_highlighting = warning +resharper_replace_with_last_or_default_3_highlighting = warning +resharper_replace_with_last_or_default_4_highlighting = warning +resharper_replace_with_of_type_1_highlighting = warning +resharper_replace_with_of_type_2_highlighting = warning +resharper_replace_with_of_type_3_highlighting = warning +resharper_replace_with_of_type_any_1_highlighting = warning +resharper_replace_with_of_type_any_2_highlighting = warning +resharper_replace_with_of_type_count_1_highlighting = warning +resharper_replace_with_of_type_count_2_highlighting = warning +resharper_replace_with_of_type_first_1_highlighting = warning +resharper_replace_with_of_type_first_2_highlighting = warning +resharper_replace_with_of_type_first_or_default_1_highlighting = warning +resharper_replace_with_of_type_first_or_default_2_highlighting = warning +resharper_replace_with_of_type_last_1_highlighting = warning +resharper_replace_with_of_type_last_2_highlighting = warning +resharper_replace_with_of_type_last_or_default_1_highlighting = warning +resharper_replace_with_of_type_last_or_default_2_highlighting = warning +resharper_replace_with_of_type_long_count_highlighting = warning +resharper_replace_with_of_type_single_1_highlighting = warning +resharper_replace_with_of_type_single_2_highlighting = warning +resharper_replace_with_of_type_single_or_default_1_highlighting = warning +resharper_replace_with_of_type_single_or_default_2_highlighting = warning +resharper_replace_with_of_type_where_highlighting = warning +resharper_replace_with_simple_assignment_false_highlighting = warning +resharper_replace_with_simple_assignment_true_highlighting = warning +resharper_replace_with_single_assignment_false_highlighting = warning +resharper_replace_with_single_assignment_true_highlighting = warning +resharper_replace_with_single_call_to_any_highlighting = warning +resharper_replace_with_single_call_to_count_highlighting = warning +resharper_replace_with_single_call_to_first_highlighting = warning +resharper_replace_with_single_call_to_first_or_default_highlighting = warning +resharper_replace_with_single_call_to_last_highlighting = warning +resharper_replace_with_single_call_to_last_or_default_highlighting = warning +resharper_replace_with_single_call_to_single_highlighting = warning +resharper_replace_with_single_call_to_single_or_default_highlighting = warning +resharper_replace_with_single_or_default_1_highlighting = warning +resharper_replace_with_single_or_default_2_highlighting = warning +resharper_replace_with_single_or_default_3_highlighting = warning +resharper_replace_with_single_or_default_4_highlighting = warning +resharper_replace_with_string_is_null_or_empty_highlighting = warning +resharper_return_type_can_be_enumerable_global_highlighting = warning +resharper_return_type_can_be_enumerable_local_highlighting = warning +resharper_safe_cast_is_used_as_type_check_highlighting = warning +resharper_separate_control_transfer_statement_highlighting = warning +resharper_similar_anonymous_type_nearby_highlighting = warning +resharper_simplify_conditional_ternary_expression_highlighting = warning +resharper_simplify_linq_expression_use_all_highlighting = warning +resharper_simplify_linq_expression_use_any_highlighting = warning +resharper_simplify_linq_expression_use_min_by_and_max_by_highlighting = warning +resharper_simplify_string_interpolation_highlighting = warning +resharper_specify_string_comparison_highlighting = warning +resharper_string_ends_with_is_culture_specific_highlighting = warning +resharper_string_literal_as_interpolation_argument_highlighting = warning +resharper_string_literal_typo_highlighting = warning +resharper_string_starts_with_is_culture_specific_highlighting = warning +resharper_struct_can_be_made_read_only_highlighting = warning +resharper_struct_member_can_be_made_read_only_highlighting = warning +resharper_suggest_base_type_for_parameter_highlighting = none +resharper_suggest_base_type_for_parameter_in_constructor_highlighting = warning +resharper_suggest_var_or_type_built_in_types_highlighting = hint +resharper_suggest_var_or_type_deconstruction_declarations_highlighting = warning +resharper_suggest_var_or_type_elsewhere_highlighting = hint +resharper_suggest_var_or_type_simple_types_highlighting = hint +resharper_swap_via_deconstruction_highlighting = warning +resharper_switch_expression_handles_some_known_enum_values_with_exception_in_default_highlighting = warning +resharper_switch_statement_handles_some_known_enum_values_with_default_highlighting = none +resharper_switch_statement_missing_some_enum_cases_no_default_highlighting = none +resharper_tabs_and_spaces_mismatch_highlighting = warning +resharper_tabs_are_disallowed_highlighting = warning +resharper_tabs_outside_indent_highlighting = warning +resharper_tail_recursive_call_highlighting = warning +resharper_too_wide_local_variable_scope_highlighting = warning +resharper_try_cast_always_succeeds_highlighting = warning +resharper_try_statements_can_be_merged_highlighting = warning +resharper_type_parameter_can_be_variant_highlighting = warning +resharper_unnecessary_whitespace_highlighting = warning +resharper_unused_member_global_highlighting = warning +resharper_unused_member_hierarchy_global_highlighting = warning +resharper_unused_member_in_super_global_highlighting = warning +resharper_unused_method_return_value_global_highlighting = warning +resharper_unused_parameter_global_highlighting = warning +resharper_unused_type_global_highlighting = warning +resharper_use_array_creation_expression_1_highlighting = warning +resharper_use_array_creation_expression_2_highlighting = warning +resharper_use_array_empty_method_highlighting = warning +resharper_use_await_using_highlighting = warning +resharper_use_cancellation_token_for_i_async_enumerable_highlighting = warning +resharper_use_collection_count_property_highlighting = warning +resharper_use_configure_await_false_highlighting = warning +resharper_use_deconstruction_highlighting = warning +resharper_use_empty_types_field_highlighting = warning +resharper_use_event_args_empty_field_highlighting = warning +resharper_use_format_specifier_in_format_string_highlighting = warning +resharper_use_indexed_property_highlighting = warning +resharper_use_index_from_end_expression_highlighting = warning +resharper_use_is_operator_1_highlighting = warning +resharper_use_is_operator_2_highlighting = warning +resharper_use_method_any_0_highlighting = warning +resharper_use_method_any_1_highlighting = warning +resharper_use_method_any_2_highlighting = warning +resharper_use_method_any_3_highlighting = warning +resharper_use_method_any_4_highlighting = warning +resharper_use_method_is_instance_of_type_highlighting = warning +resharper_use_nameof_expression_for_part_of_the_string_highlighting = warning +resharper_use_nameof_expression_highlighting = warning +resharper_use_nameof_for_dependency_property_highlighting = warning +resharper_use_name_of_instead_of_type_of_highlighting = warning +resharper_use_negated_pattern_in_is_expression_highlighting = warning +resharper_use_negated_pattern_matching_highlighting = warning +resharper_use_nullable_annotation_instead_of_attribute_highlighting = warning +resharper_use_nullable_attributes_supported_by_compiler_highlighting = warning +resharper_use_null_propagation_highlighting = warning +resharper_use_object_or_collection_initializer_highlighting = warning +resharper_use_pattern_matching_highlighting = warning +resharper_use_positional_deconstruction_pattern_highlighting = warning +resharper_use_raw_string_highlighting = warning +resharper_use_string_interpolation_highlighting = warning +resharper_use_switch_case_pattern_variable_highlighting = warning +resharper_use_throw_if_null_method_highlighting = warning +resharper_use_unsigned_right_shift_operator_highlighting = warning +resharper_use_verbatim_string_highlighting = warning +resharper_use_with_expression_to_copy_anonymous_object_highlighting = warning +resharper_use_with_expression_to_copy_record_highlighting = warning +resharper_use_with_expression_to_copy_struct_highlighting = warning +resharper_use_with_expression_to_copy_tuple_highlighting = warning +resharper_virtual_member_never_overridden_global_highlighting = warning +resharper_virtual_member_never_overridden_local_highlighting = warning +resharper_web_config_module_not_resolved_highlighting = warning +resharper_web_config_type_not_resolved_highlighting = warning +resharper_web_config_wrong_module_highlighting = warning +resharper_with_expression_instead_of_initializer_highlighting = warning +resharper_wrong_indent_size_highlighting = warning + +[*.css] +ij_css_align_closing_brace_with_properties = false +ij_css_blank_lines_around_nested_selector = 1 +ij_css_blank_lines_between_blocks = 1 +ij_css_block_comment_add_space = false +ij_css_brace_placement = end_of_line +ij_css_enforce_quotes_on_format = false +ij_css_hex_color_long_format = false +ij_css_hex_color_lower_case = false +ij_css_hex_color_short_format = false +ij_css_hex_color_upper_case = false +ij_css_keep_blank_lines_in_code = 2 +ij_css_keep_indents_on_empty_lines = false +ij_css_keep_single_line_blocks = false +ij_css_properties_order = font, font-family, font-size, font-weight, font-style, font-variant, font-size-adjust, font-stretch, line-height, position, z-index, top, right, bottom, left, display, visibility, float, clear, overflow, overflow-x, overflow-y, clip, zoom, align-content, align-items, align-self, flex, flex-flow, flex-basis, flex-direction, flex-grow, flex-shrink, flex-wrap, justify-content, order, box-sizing, width, min-width, max-width, height, min-height, max-height, margin, margin-top, margin-right, margin-bottom, margin-left, padding, padding-top, padding-right, padding-bottom, padding-left, table-layout, empty-cells, caption-side, border-spacing, border-collapse, list-style, list-style-position, list-style-type, list-style-image, content, quotes, counter-reset, counter-increment, resize, cursor, user-select, nav-index, nav-up, nav-right, nav-down, nav-left, transition, transition-delay, transition-timing-function, transition-duration, transition-property, transform, transform-origin, animation, animation-name, animation-duration, animation-play-state, animation-timing-function, animation-delay, animation-iteration-count, animation-direction, text-align, text-align-last, vertical-align, white-space, text-decoration, text-emphasis, text-emphasis-color, text-emphasis-style, text-emphasis-position, text-indent, text-justify, letter-spacing, word-spacing, text-outline, text-transform, text-wrap, text-overflow, text-overflow-ellipsis, text-overflow-mode, word-wrap, word-break, tab-size, hyphens, pointer-events, opacity, color, border, border-width, border-style, border-color, border-top, border-top-width, border-top-style, border-top-color, border-right, border-right-width, border-right-style, border-right-color, border-bottom, border-bottom-width, border-bottom-style, border-bottom-color, border-left, border-left-width, border-left-style, border-left-color, border-radius, border-top-left-radius, border-top-right-radius, border-bottom-right-radius, border-bottom-left-radius, border-image, border-image-source, border-image-slice, border-image-width, border-image-outset, border-image-repeat, outline, outline-width, outline-style, outline-color, outline-offset, background, background-color, background-image, background-repeat, background-attachment, background-position, background-position-x, background-position-y, background-clip, background-origin, background-size, box-decoration-break, box-shadow, text-shadow +ij_css_space_after_colon = true +ij_css_space_before_opening_brace = true +ij_css_use_double_quotes = true +ij_css_value_alignment = do_not_align + +[*.csv] +max_line_length = 2147483647 +ij_csv_wrap_long_lines = false +indent_style = tab +tab_width = 1 + +[*.dart] +max_line_length = 80 + +[*.less] +indent_size = 2 +ij_less_align_closing_brace_with_properties = false +ij_less_blank_lines_around_nested_selector = 1 +ij_less_blank_lines_between_blocks = 1 +ij_less_block_comment_add_space = false +ij_less_brace_placement = 0 +ij_less_enforce_quotes_on_format = false +ij_less_hex_color_long_format = false +ij_less_hex_color_lower_case = false +ij_less_hex_color_short_format = false +ij_less_hex_color_upper_case = false +ij_less_keep_blank_lines_in_code = 2 +ij_less_keep_indents_on_empty_lines = false +ij_less_keep_single_line_blocks = false +ij_less_line_comment_add_space = false +ij_less_line_comment_at_first_column = false +ij_less_properties_order = font, font-family, font-size, font-weight, font-style, font-variant, font-size-adjust, font-stretch, line-height, position, z-index, top, right, bottom, left, display, visibility, float, clear, overflow, overflow-x, overflow-y, clip, zoom, align-content, align-items, align-self, flex, flex-flow, flex-basis, flex-direction, flex-grow, flex-shrink, flex-wrap, justify-content, order, box-sizing, width, min-width, max-width, height, min-height, max-height, margin, margin-top, margin-right, margin-bottom, margin-left, padding, padding-top, padding-right, padding-bottom, padding-left, table-layout, empty-cells, caption-side, border-spacing, border-collapse, list-style, list-style-position, list-style-type, list-style-image, content, quotes, counter-reset, counter-increment, resize, cursor, user-select, nav-index, nav-up, nav-right, nav-down, nav-left, transition, transition-delay, transition-timing-function, transition-duration, transition-property, transform, transform-origin, animation, animation-name, animation-duration, animation-play-state, animation-timing-function, animation-delay, animation-iteration-count, animation-direction, text-align, text-align-last, vertical-align, white-space, text-decoration, text-emphasis, text-emphasis-color, text-emphasis-style, text-emphasis-position, text-indent, text-justify, letter-spacing, word-spacing, text-outline, text-transform, text-wrap, text-overflow, text-overflow-ellipsis, text-overflow-mode, word-wrap, word-break, tab-size, hyphens, pointer-events, opacity, color, border, border-width, border-style, border-color, border-top, border-top-width, border-top-style, border-top-color, border-right, border-right-width, border-right-style, border-right-color, border-bottom, border-bottom-width, border-bottom-style, border-bottom-color, border-left, border-left-width, border-left-style, border-left-color, border-radius, border-top-left-radius, border-top-right-radius, border-bottom-right-radius, border-bottom-left-radius, border-image, border-image-source, border-image-slice, border-image-width, border-image-outset, border-image-repeat, outline, outline-width, outline-style, outline-color, outline-offset, background, background-color, background-image, background-repeat, background-attachment, background-position, background-position-x, background-position-y, background-clip, background-origin, background-size, box-decoration-break, box-shadow, text-shadow +ij_less_space_after_colon = true +ij_less_space_before_opening_brace = true +ij_less_use_double_quotes = true +ij_less_value_alignment = 0 + +[*.pp] +indent_size = 2 +tab_width = 2 +ij_continuation_indent_size = 2 +ij_puppet_keep_indents_on_empty_lines = false + +[*.properties] +ij_properties_align_group_field_declarations = true +ij_properties_keep_blank_lines = false +ij_properties_key_value_delimiter = equals +ij_properties_spaces_around_key_value_delimiter = true + +[*.sass] +indent_size = 2 +ij_sass_align_closing_brace_with_properties = false +ij_sass_blank_lines_around_nested_selector = 1 +ij_sass_blank_lines_between_blocks = 1 +ij_sass_brace_placement = 0 +ij_sass_enforce_quotes_on_format = false +ij_sass_hex_color_long_format = false +ij_sass_hex_color_lower_case = false +ij_sass_hex_color_short_format = false +ij_sass_hex_color_upper_case = false +ij_sass_keep_blank_lines_in_code = 2 +ij_sass_keep_indents_on_empty_lines = false +ij_sass_keep_single_line_blocks = false +ij_sass_line_comment_add_space = false +ij_sass_line_comment_at_first_column = false +ij_sass_properties_order = font, font-family, font-size, font-weight, font-style, font-variant, font-size-adjust, font-stretch, line-height, position, z-index, top, right, bottom, left, display, visibility, float, clear, overflow, overflow-x, overflow-y, clip, zoom, align-content, align-items, align-self, flex, flex-flow, flex-basis, flex-direction, flex-grow, flex-shrink, flex-wrap, justify-content, order, box-sizing, width, min-width, max-width, height, min-height, max-height, margin, margin-top, margin-right, margin-bottom, margin-left, padding, padding-top, padding-right, padding-bottom, padding-left, table-layout, empty-cells, caption-side, border-spacing, border-collapse, list-style, list-style-position, list-style-type, list-style-image, content, quotes, counter-reset, counter-increment, resize, cursor, user-select, nav-index, nav-up, nav-right, nav-down, nav-left, transition, transition-delay, transition-timing-function, transition-duration, transition-property, transform, transform-origin, animation, animation-name, animation-duration, animation-play-state, animation-timing-function, animation-delay, animation-iteration-count, animation-direction, text-align, text-align-last, vertical-align, white-space, text-decoration, text-emphasis, text-emphasis-color, text-emphasis-style, text-emphasis-position, text-indent, text-justify, letter-spacing, word-spacing, text-outline, text-transform, text-wrap, text-overflow, text-overflow-ellipsis, text-overflow-mode, word-wrap, word-break, tab-size, hyphens, pointer-events, opacity, color, border, border-width, border-style, border-color, border-top, border-top-width, border-top-style, border-top-color, border-right, border-right-width, border-right-style, border-right-color, border-bottom, border-bottom-width, border-bottom-style, border-bottom-color, border-left, border-left-width, border-left-style, border-left-color, border-radius, border-top-left-radius, border-top-right-radius, border-bottom-right-radius, border-bottom-left-radius, border-image, border-image-source, border-image-slice, border-image-width, border-image-outset, border-image-repeat, outline, outline-width, outline-style, outline-color, outline-offset, background, background-color, background-image, background-repeat, background-attachment, background-position, background-position-x, background-position-y, background-clip, background-origin, background-size, box-decoration-break, box-shadow, text-shadow +ij_sass_space_after_colon = true +ij_sass_space_before_opening_brace = true +ij_sass_use_double_quotes = true +ij_sass_value_alignment = 0 + +[*.scss] +indent_size = 2 +ij_scss_align_closing_brace_with_properties = false +ij_scss_blank_lines_around_nested_selector = 1 +ij_scss_blank_lines_between_blocks = 1 +ij_scss_block_comment_add_space = false +ij_scss_brace_placement = 0 +ij_scss_enforce_quotes_on_format = false +ij_scss_hex_color_long_format = false +ij_scss_hex_color_lower_case = false +ij_scss_hex_color_short_format = false +ij_scss_hex_color_upper_case = false +ij_scss_keep_blank_lines_in_code = 2 +ij_scss_keep_indents_on_empty_lines = false +ij_scss_keep_single_line_blocks = false +ij_scss_line_comment_add_space = false +ij_scss_line_comment_at_first_column = false +ij_scss_properties_order = font, font-family, font-size, font-weight, font-style, font-variant, font-size-adjust, font-stretch, line-height, position, z-index, top, right, bottom, left, display, visibility, float, clear, overflow, overflow-x, overflow-y, clip, zoom, align-content, align-items, align-self, flex, flex-flow, flex-basis, flex-direction, flex-grow, flex-shrink, flex-wrap, justify-content, order, box-sizing, width, min-width, max-width, height, min-height, max-height, margin, margin-top, margin-right, margin-bottom, margin-left, padding, padding-top, padding-right, padding-bottom, padding-left, table-layout, empty-cells, caption-side, border-spacing, border-collapse, list-style, list-style-position, list-style-type, list-style-image, content, quotes, counter-reset, counter-increment, resize, cursor, user-select, nav-index, nav-up, nav-right, nav-down, nav-left, transition, transition-delay, transition-timing-function, transition-duration, transition-property, transform, transform-origin, animation, animation-name, animation-duration, animation-play-state, animation-timing-function, animation-delay, animation-iteration-count, animation-direction, text-align, text-align-last, vertical-align, white-space, text-decoration, text-emphasis, text-emphasis-color, text-emphasis-style, text-emphasis-position, text-indent, text-justify, letter-spacing, word-spacing, text-outline, text-transform, text-wrap, text-overflow, text-overflow-ellipsis, text-overflow-mode, word-wrap, word-break, tab-size, hyphens, pointer-events, opacity, color, border, border-width, border-style, border-color, border-top, border-top-width, border-top-style, border-top-color, border-right, border-right-width, border-right-style, border-right-color, border-bottom, border-bottom-width, border-bottom-style, border-bottom-color, border-left, border-left-width, border-left-style, border-left-color, border-radius, border-top-left-radius, border-top-right-radius, border-bottom-right-radius, border-bottom-left-radius, border-image, border-image-source, border-image-slice, border-image-width, border-image-outset, border-image-repeat, outline, outline-width, outline-style, outline-color, outline-offset, background, background-color, background-image, background-repeat, background-attachment, background-position, background-position-x, background-position-y, background-clip, background-origin, background-size, box-decoration-break, box-shadow, text-shadow +ij_scss_space_after_colon = true +ij_scss_space_before_opening_brace = true +ij_scss_use_double_quotes = true +ij_scss_value_alignment = 0 + +[*.slim] +indent_size = 2 +ij_slim_keep_indents_on_empty_lines = false + +[*.twig] +ij_twig_keep_indents_on_empty_lines = false +ij_twig_spaces_inside_comments_delimiters = true +ij_twig_spaces_inside_delimiters = true +ij_twig_spaces_inside_variable_delimiters = true + +[*.vue] +indent_size = 2 +tab_width = 2 +ij_continuation_indent_size = 4 +ij_vue_indent_children_of_top_level = template +ij_vue_interpolation_new_line_after_start_delimiter = true +ij_vue_interpolation_new_line_before_end_delimiter = true +ij_vue_interpolation_wrap = off +ij_vue_keep_indents_on_empty_lines = false +ij_vue_spaces_within_interpolation_expressions = true + +[.editorconfig] +ij_editorconfig_align_group_field_declarations = true +ij_editorconfig_space_after_colon = false +ij_editorconfig_space_after_comma = true +ij_editorconfig_space_before_colon = false +ij_editorconfig_space_before_comma = false +ij_editorconfig_spaces_around_assignment_operators = true + +[{*.ad,*.adoc,*.asciidoc,.asciidoctorconfig}] +ij_asciidoc_blank_lines_after_header = 1 +ij_asciidoc_blank_lines_keep_after_header = 1 +ij_asciidoc_formatting_enabled = true +ij_asciidoc_one_sentence_per_line = true + +[{*.ant,*.appxmanifest,*.axml,*.cscfg,*.csdef,*.disco,*.dotsettings,*.filelayout,*.fxml,*.jhm,*.jnlp,*.jrxml,*.manifest,*.myapp,*.nuspec,*.rng,*.sdef,*.stylecop,*.svcmap,*.tld,*.wadcfgx,*.webref,*.wsdl,*.xml,*.xsd,*.xsl,*.xslt,*.xul,StyleCop.Cache}] +ij_xml_align_attributes = true +ij_xml_align_text = false +ij_xml_attribute_wrap = on_every_item +ij_xml_block_comment_add_space = false +ij_xml_block_comment_at_first_column = true +ij_xml_keep_blank_lines = 2 +ij_xml_keep_indents_on_empty_lines = false +ij_xml_keep_line_breaks = true +ij_xml_keep_line_breaks_in_text = true +ij_xml_keep_whitespaces = false +ij_xml_keep_whitespaces_around_cdata = preserve +ij_xml_keep_whitespaces_inside_cdata = false +ij_xml_line_comment_at_first_column = true +ij_xml_space_after_tag_name = false +ij_xml_space_around_equals_in_attribute = false +ij_xml_space_inside_empty_tag = false +ij_xml_text_wrap = normal +ij_xml_use_custom_settings = false +indent_size = 2 +tab_width = 2 +ij_continuation_indent_size = 4 + +[{*.applescript,*.scpt}] +indent_size = 2 +tab_width = 2 +ij_continuation_indent_size = 4 +ij_applescript_align_multiline_binary_operation = true +ij_applescript_align_multiline_parameters = true +ij_applescript_align_multiline_parameters_in_calls = true +ij_applescript_binary_operation_sign_on_next_line = false +ij_applescript_binary_operation_wrap = off +ij_applescript_block_brace_style = next_line +ij_applescript_call_parameters_new_line_after_left_paren = false +ij_applescript_call_parameters_right_paren_on_new_line = false +ij_applescript_call_parameters_wrap = off +ij_applescript_else_on_new_line = true +ij_applescript_keep_blank_lines_in_code = 2 +ij_applescript_keep_first_column_comment = true +ij_applescript_keep_indents_on_empty_lines = false +ij_applescript_keep_line_breaks = true +ij_applescript_method_brace_style = next_line +ij_applescript_method_parameters_new_line_after_left_paren = false +ij_applescript_method_parameters_right_paren_on_new_line = false +ij_applescript_method_parameters_wrap = off +ij_applescript_parentheses_expression_new_line_after_left_paren = false +ij_applescript_parentheses_expression_right_paren_on_new_line = false +ij_applescript_space_after_colon = true +ij_applescript_space_after_comma = true +ij_applescript_space_after_comma_in_type_arguments = true +ij_applescript_space_before_colon = true +ij_applescript_space_before_comma = false +ij_applescript_space_before_else_keyword = true +ij_applescript_space_before_else_left_brace = true +ij_applescript_space_before_if_parentheses = false +ij_applescript_space_before_method_call_parentheses = false +ij_applescript_space_before_method_left_brace = true +ij_applescript_space_before_method_parentheses = false +ij_applescript_space_before_while_keyword = true +ij_applescript_spaces_around_additive_operators = true +ij_applescript_spaces_around_assignment_operators = true +ij_applescript_spaces_around_equality_operators = true +ij_applescript_spaces_around_logical_operators = true +ij_applescript_spaces_around_multiplicative_operators = true +ij_applescript_spaces_around_relational_operators = true +ij_applescript_spaces_around_shift_operators = true +ij_applescript_spaces_around_unary_operator = false +ij_applescript_spaces_within_if_parentheses = false +ij_applescript_spaces_within_method_call_parentheses = false +ij_applescript_spaces_within_method_parentheses = false +ij_applescript_special_else_if_treatment = true + +[{*.ats,*.cts,*.mts,*.ts}] +ij_continuation_indent_size = 4 +ij_typescript_align_imports = true +ij_typescript_align_multiline_array_initializer_expression = true +ij_typescript_align_multiline_binary_operation = true +ij_typescript_align_multiline_chained_methods = true +ij_typescript_align_multiline_extends_list = false +ij_typescript_align_multiline_for = true +ij_typescript_align_multiline_parameters = true +ij_typescript_align_multiline_parameters_in_calls = true +ij_typescript_align_multiline_ternary_operation = true +ij_typescript_align_object_properties = 1 +ij_typescript_align_union_types = true +ij_typescript_align_var_statements = 2 +ij_typescript_array_initializer_new_line_after_left_brace = false +ij_typescript_array_initializer_right_brace_on_new_line = false +ij_typescript_array_initializer_wrap = on_every_item +ij_typescript_assignment_wrap = on_every_item +ij_typescript_binary_operation_sign_on_next_line = false +ij_typescript_binary_operation_wrap = on_every_item +ij_typescript_blacklist_imports = rxjs/Rx, node_modules/**, **/node_modules/**, @angular/material, @angular/material/typings/** +ij_typescript_blank_lines_after_imports = 1 +ij_typescript_blank_lines_around_class = 1 +ij_typescript_blank_lines_around_field = 0 +ij_typescript_blank_lines_around_field_in_interface = 0 +ij_typescript_blank_lines_around_function = 1 +ij_typescript_blank_lines_around_method = 1 +ij_typescript_blank_lines_around_method_in_interface = 1 +ij_typescript_block_brace_style = next_line +ij_typescript_block_comment_add_space = false +ij_typescript_block_comment_at_first_column = true +ij_typescript_call_parameters_new_line_after_left_paren = false +ij_typescript_call_parameters_right_paren_on_new_line = false +ij_typescript_call_parameters_wrap = on_every_item +ij_typescript_catch_on_new_line = true +ij_typescript_chained_call_dot_on_new_line = true +ij_typescript_class_brace_style = next_line +ij_typescript_comma_on_new_line = false +ij_typescript_do_while_brace_force = always +ij_typescript_else_on_new_line = false +ij_typescript_enforce_trailing_comma = keep +ij_typescript_enum_constants_wrap = on_every_item +ij_typescript_extends_keyword_wrap = normal +ij_typescript_extends_list_wrap = on_every_item +ij_typescript_field_prefix = _ +ij_typescript_file_name_style = relaxed +ij_typescript_finally_on_new_line = true +ij_typescript_for_brace_force = if_multiline +ij_typescript_for_statement_new_line_after_left_paren = false +ij_typescript_for_statement_right_paren_on_new_line = false +ij_typescript_for_statement_wrap = on_every_item +ij_typescript_force_quote_style = true +ij_typescript_force_semicolon_style = true +ij_typescript_function_expression_brace_style = next_line +ij_typescript_if_brace_force = never +ij_typescript_import_merge_members = global +ij_typescript_import_prefer_absolute_path = true +ij_typescript_import_sort_members = true +ij_typescript_import_sort_module_name = true +ij_typescript_import_use_node_resolution = true +ij_typescript_imports_wrap = on_every_item +ij_typescript_indent_case_from_switch = true +ij_typescript_indent_chained_calls = true +ij_typescript_indent_package_children = 0 +ij_typescript_jsdoc_include_types = false +ij_typescript_jsx_attribute_value = braces +ij_typescript_keep_blank_lines_in_code = 2 +ij_typescript_keep_first_column_comment = true +ij_typescript_keep_indents_on_empty_lines = false +ij_typescript_keep_line_breaks = true +ij_typescript_keep_simple_blocks_in_one_line = false +ij_typescript_keep_simple_methods_in_one_line = false +ij_typescript_line_comment_add_space = true +ij_typescript_line_comment_at_first_column = false +ij_typescript_method_brace_style = next_line +ij_typescript_method_call_chain_wrap = on_every_item +ij_typescript_method_parameters_new_line_after_left_paren = false +ij_typescript_method_parameters_right_paren_on_new_line = false +ij_typescript_method_parameters_wrap = on_every_item +ij_typescript_object_literal_wrap = on_every_item +ij_typescript_object_types_wrap = on_every_item +ij_typescript_parentheses_expression_new_line_after_left_paren = false +ij_typescript_parentheses_expression_right_paren_on_new_line = false +ij_typescript_place_assignment_sign_on_next_line = false +ij_typescript_prefer_as_type_cast = false +ij_typescript_prefer_explicit_types_function_expression_returns = false +ij_typescript_prefer_explicit_types_function_returns = false +ij_typescript_prefer_explicit_types_vars_fields = false +ij_typescript_prefer_parameters_wrap = false +ij_typescript_property_prefix = +ij_typescript_reformat_c_style_comments = false +ij_typescript_space_after_colon = true +ij_typescript_space_after_comma = true +ij_typescript_space_after_dots_in_rest_parameter = false +ij_typescript_space_after_generator_mult = true +ij_typescript_space_after_property_colon = true +ij_typescript_space_after_quest = true +ij_typescript_space_after_type_colon = true +ij_typescript_space_after_unary_not = false +ij_typescript_space_before_async_arrow_lparen = false +ij_typescript_space_before_catch_keyword = true +ij_typescript_space_before_catch_left_brace = false +ij_typescript_space_before_catch_parentheses = false +ij_typescript_space_before_class_lbrace = false +ij_typescript_space_before_class_left_brace = true +ij_typescript_space_before_colon = true +ij_typescript_space_before_comma = false +ij_typescript_space_before_do_left_brace = false +ij_typescript_space_before_else_keyword = true +ij_typescript_space_before_else_left_brace = false +ij_typescript_space_before_finally_keyword = true +ij_typescript_space_before_finally_left_brace = false +ij_typescript_space_before_for_left_brace = false +ij_typescript_space_before_for_parentheses = false +ij_typescript_space_before_for_semicolon = false +ij_typescript_space_before_function_left_parenth = false +ij_typescript_space_before_generator_mult = false +ij_typescript_space_before_if_left_brace = false +ij_typescript_space_before_if_parentheses = false +ij_typescript_space_before_method_call_parentheses = false +ij_typescript_space_before_method_left_brace = false +ij_typescript_space_before_method_parentheses = false +ij_typescript_space_before_property_colon = false +ij_typescript_space_before_quest = true +ij_typescript_space_before_switch_left_brace = false +ij_typescript_space_before_switch_parentheses = false +ij_typescript_space_before_try_left_brace = false +ij_typescript_space_before_type_colon = false +ij_typescript_space_before_unary_not = false +ij_typescript_space_before_while_keyword = true +ij_typescript_space_before_while_left_brace = false +ij_typescript_space_before_while_parentheses = false +ij_typescript_spaces_around_additive_operators = true +ij_typescript_spaces_around_arrow_function_operator = true +ij_typescript_spaces_around_assignment_operators = true +ij_typescript_spaces_around_bitwise_operators = true +ij_typescript_spaces_around_equality_operators = true +ij_typescript_spaces_around_logical_operators = true +ij_typescript_spaces_around_multiplicative_operators = true +ij_typescript_spaces_around_relational_operators = true +ij_typescript_spaces_around_shift_operators = true +ij_typescript_spaces_around_unary_operator = false +ij_typescript_spaces_within_array_initializer_brackets = false +ij_typescript_spaces_within_brackets = false +ij_typescript_spaces_within_catch_parentheses = false +ij_typescript_spaces_within_for_parentheses = false +ij_typescript_spaces_within_if_parentheses = false +ij_typescript_spaces_within_imports = false +ij_typescript_spaces_within_interpolation_expressions = false +ij_typescript_spaces_within_method_call_parentheses = false +ij_typescript_spaces_within_method_parentheses = false +ij_typescript_spaces_within_object_literal_braces = false +ij_typescript_spaces_within_object_type_braces = true +ij_typescript_spaces_within_parentheses = false +ij_typescript_spaces_within_switch_parentheses = false +ij_typescript_spaces_within_type_assertion = false +ij_typescript_spaces_within_union_types = true +ij_typescript_spaces_within_while_parentheses = false +ij_typescript_special_else_if_treatment = true +ij_typescript_ternary_operation_signs_on_next_line = false +ij_typescript_ternary_operation_wrap = on_every_item +ij_typescript_union_types_wrap = on_every_item +ij_typescript_use_chained_calls_group_indents = false +ij_typescript_use_double_quotes = true +ij_typescript_use_explicit_js_extension = auto +ij_typescript_use_path_mapping = always +ij_typescript_use_public_modifier = false +ij_typescript_use_semicolon_after_statement = true +ij_typescript_var_declaration_wrap = normal +ij_typescript_while_brace_force = always +ij_typescript_while_on_new_line = false +ij_typescript_wrap_comments = false + +[{*.bash,*.sh,*.zsh}] +indent_size = 2 +tab_width = 2 +ij_shell_binary_ops_start_line = false +ij_shell_keep_column_alignment_padding = false +ij_shell_minify_program = false +ij_shell_redirect_followed_by_space = false +ij_shell_switch_cases_indented = true +ij_shell_use_unix_line_separator = true +indent_style = space + +[{*.cjs,*.js}] +ij_continuation_indent_size = 4 +ij_javascript_align_imports = true +ij_javascript_align_multiline_array_initializer_expression = true +ij_javascript_align_multiline_binary_operation = true +ij_javascript_align_multiline_chained_methods = false +ij_javascript_align_multiline_extends_list = true +ij_javascript_align_multiline_for = true +ij_javascript_align_multiline_parameters = true +ij_javascript_align_multiline_parameters_in_calls = true +ij_javascript_align_multiline_ternary_operation = true +ij_javascript_align_object_properties = 1 +ij_javascript_align_union_types = false +ij_javascript_align_var_statements = 2 +ij_javascript_array_initializer_new_line_after_left_brace = false +ij_javascript_array_initializer_right_brace_on_new_line = false +ij_javascript_array_initializer_wrap = on_every_item +ij_javascript_assignment_wrap = on_every_item +ij_javascript_binary_operation_sign_on_next_line = false +ij_javascript_binary_operation_wrap = on_every_item +ij_javascript_blacklist_imports = rxjs/Rx, node_modules/**, **/node_modules/**, @angular/material, @angular/material/typings/** +ij_javascript_blank_lines_after_imports = 1 +ij_javascript_blank_lines_around_class = 1 +ij_javascript_blank_lines_around_field = 0 +ij_javascript_blank_lines_around_function = 1 +ij_javascript_blank_lines_around_method = 1 +ij_javascript_block_brace_style = next_line +ij_javascript_block_comment_add_space = false +ij_javascript_block_comment_at_first_column = true +ij_javascript_call_parameters_new_line_after_left_paren = false +ij_javascript_call_parameters_right_paren_on_new_line = false +ij_javascript_call_parameters_wrap = on_every_item +ij_javascript_catch_on_new_line = true +ij_javascript_chained_call_dot_on_new_line = true +ij_javascript_class_brace_style = next_line +ij_javascript_comma_on_new_line = false +ij_javascript_do_while_brace_force = always +ij_javascript_else_on_new_line = true +ij_javascript_enforce_trailing_comma = remove +ij_javascript_extends_keyword_wrap = normal +ij_javascript_extends_list_wrap = on_every_item +ij_javascript_field_prefix = _ +ij_javascript_file_name_style = relaxed +ij_javascript_finally_on_new_line = true +ij_javascript_for_brace_force = if_multiline +ij_javascript_for_statement_new_line_after_left_paren = false +ij_javascript_for_statement_right_paren_on_new_line = false +ij_javascript_for_statement_wrap = on_every_item +ij_javascript_force_quote_style = true +ij_javascript_force_semicolon_style = true +ij_javascript_function_expression_brace_style = next_line +ij_javascript_if_brace_force = if_multiline +ij_javascript_import_merge_members = global +ij_javascript_import_prefer_absolute_path = true +ij_javascript_import_sort_members = true +ij_javascript_import_sort_module_name = true +ij_javascript_import_use_node_resolution = true +ij_javascript_imports_wrap = on_every_item +ij_javascript_indent_case_from_switch = true +ij_javascript_indent_chained_calls = true +ij_javascript_indent_package_children = 0 +ij_javascript_jsx_attribute_value = braces +ij_javascript_keep_blank_lines_in_code = 2 +ij_javascript_keep_first_column_comment = true +ij_javascript_keep_indents_on_empty_lines = false +ij_javascript_keep_line_breaks = true +ij_javascript_keep_simple_blocks_in_one_line = false +ij_javascript_keep_simple_methods_in_one_line = false +ij_javascript_line_comment_add_space = true +ij_javascript_line_comment_at_first_column = false +ij_javascript_method_brace_style = next_line +ij_javascript_method_call_chain_wrap = on_every_item +ij_javascript_method_parameters_new_line_after_left_paren = false +ij_javascript_method_parameters_right_paren_on_new_line = false +ij_javascript_method_parameters_wrap = on_every_item +ij_javascript_object_literal_wrap = on_every_item +ij_javascript_object_types_wrap = on_every_item +ij_javascript_parentheses_expression_new_line_after_left_paren = false +ij_javascript_parentheses_expression_right_paren_on_new_line = false +ij_javascript_place_assignment_sign_on_next_line = true +ij_javascript_prefer_as_type_cast = false +ij_javascript_prefer_explicit_types_function_expression_returns = false +ij_javascript_prefer_explicit_types_function_returns = false +ij_javascript_prefer_explicit_types_vars_fields = false +ij_javascript_prefer_parameters_wrap = false +ij_javascript_property_prefix = +ij_javascript_reformat_c_style_comments = true +ij_javascript_space_after_colon = true +ij_javascript_space_after_comma = true +ij_javascript_space_after_dots_in_rest_parameter = false +ij_javascript_space_after_generator_mult = true +ij_javascript_space_after_property_colon = true +ij_javascript_space_after_quest = true +ij_javascript_space_after_type_colon = true +ij_javascript_space_after_unary_not = false +ij_javascript_space_before_async_arrow_lparen = false +ij_javascript_space_before_catch_keyword = true +ij_javascript_space_before_catch_left_brace = false +ij_javascript_space_before_catch_parentheses = false +ij_javascript_space_before_class_lbrace = false +ij_javascript_space_before_class_left_brace = true +ij_javascript_space_before_colon = true +ij_javascript_space_before_comma = false +ij_javascript_space_before_do_left_brace = false +ij_javascript_space_before_else_keyword = true +ij_javascript_space_before_else_left_brace = false +ij_javascript_space_before_finally_keyword = true +ij_javascript_space_before_finally_left_brace = false +ij_javascript_space_before_for_left_brace = false +ij_javascript_space_before_for_parentheses = false +ij_javascript_space_before_for_semicolon = false +ij_javascript_space_before_function_left_parenth = false +ij_javascript_space_before_generator_mult = false +ij_javascript_space_before_if_left_brace = false +ij_javascript_space_before_if_parentheses = false +ij_javascript_space_before_method_call_parentheses = false +ij_javascript_space_before_method_left_brace = false +ij_javascript_space_before_method_parentheses = false +ij_javascript_space_before_property_colon = false +ij_javascript_space_before_quest = true +ij_javascript_space_before_switch_left_brace = false +ij_javascript_space_before_switch_parentheses = false +ij_javascript_space_before_try_left_brace = false +ij_javascript_space_before_type_colon = false +ij_javascript_space_before_unary_not = false +ij_javascript_space_before_while_keyword = true +ij_javascript_space_before_while_left_brace = false +ij_javascript_space_before_while_parentheses = false +ij_javascript_spaces_around_additive_operators = true +ij_javascript_spaces_around_arrow_function_operator = true +ij_javascript_spaces_around_assignment_operators = true +ij_javascript_spaces_around_bitwise_operators = true +ij_javascript_spaces_around_equality_operators = true +ij_javascript_spaces_around_logical_operators = true +ij_javascript_spaces_around_multiplicative_operators = true +ij_javascript_spaces_around_relational_operators = true +ij_javascript_spaces_around_shift_operators = true +ij_javascript_spaces_around_unary_operator = false +ij_javascript_spaces_within_array_initializer_brackets = false +ij_javascript_spaces_within_brackets = false +ij_javascript_spaces_within_catch_parentheses = false +ij_javascript_spaces_within_for_parentheses = false +ij_javascript_spaces_within_if_parentheses = false +ij_javascript_spaces_within_imports = false +ij_javascript_spaces_within_interpolation_expressions = false +ij_javascript_spaces_within_method_call_parentheses = false +ij_javascript_spaces_within_method_parentheses = false +ij_javascript_spaces_within_object_literal_braces = false +ij_javascript_spaces_within_object_type_braces = true +ij_javascript_spaces_within_parentheses = false +ij_javascript_spaces_within_switch_parentheses = false +ij_javascript_spaces_within_type_assertion = false +ij_javascript_spaces_within_union_types = true +ij_javascript_spaces_within_while_parentheses = false +ij_javascript_special_else_if_treatment = true +ij_javascript_ternary_operation_signs_on_next_line = false +ij_javascript_ternary_operation_wrap = on_every_item +ij_javascript_union_types_wrap = on_every_item +ij_javascript_use_chained_calls_group_indents = true +ij_javascript_use_double_quotes = true +ij_javascript_use_explicit_js_extension = auto +ij_javascript_use_path_mapping = always +ij_javascript_use_public_modifier = false +ij_javascript_use_semicolon_after_statement = true +ij_javascript_var_declaration_wrap = normal +ij_javascript_while_brace_force = always +ij_javascript_while_on_new_line = false +ij_javascript_wrap_comments = false + +[{*.comp,*.frag,*.fsh,*.geom,*.glsl,*.tesc,*.tese,*.vert,*.vsh}] +ij_glsl_keep_indents_on_empty_lines = false + +[{*.har,*.jsb2,*.jsb3,*.json,*.jsonc,.babelrc,.eslintrc,.prettierrc,.stylelintrc,bowerrc,jest.config}] +indent_size = 2 +ij_json_array_wrapping = normal +ij_json_keep_blank_lines_in_code = 0 +ij_json_keep_indents_on_empty_lines = false +ij_json_keep_line_breaks = true +ij_json_keep_trailing_comma = false +ij_json_object_wrapping = normal +ij_json_property_alignment = align_on_value +ij_json_space_after_colon = true +ij_json_space_after_comma = true +ij_json_space_before_colon = false +ij_json_space_before_comma = false +ij_json_spaces_within_braces = false +ij_json_spaces_within_brackets = false +ij_json_wrap_long_lines = false +indent_style = space + +[{*.htm,*.html,*.ng,*.sht,*.shtm,*.shtml}] +ij_html_add_new_line_before_tags = body, div, p, form, h1, h2, h3 +ij_html_align_attributes = true +ij_html_align_text = false +ij_html_attribute_wrap = normal +ij_html_block_comment_add_space = false +ij_html_block_comment_at_first_column = true +ij_html_do_not_align_children_of_min_lines = 0 +ij_html_do_not_break_if_inline_tags = title, h1, h2, h3, h4, h5, h6, p +ij_html_do_not_indent_children_of_tags = html, body, thead, tbody, tfoot +ij_html_enforce_quotes = false +ij_html_inline_tags = a, abbr, acronym, b, basefont, bdo, big, br, cite, cite, code, dfn, em, font, i, img, input, kbd, label, q, s, samp, select, small, span, strike, strong, sub, sup, textarea, tt, u, var +ij_html_keep_blank_lines = 2 +ij_html_keep_indents_on_empty_lines = false +ij_html_keep_line_breaks = true +ij_html_keep_line_breaks_in_text = true +ij_html_keep_whitespaces = false +ij_html_keep_whitespaces_inside = span, pre, textarea +ij_html_line_comment_at_first_column = true +ij_html_new_line_after_last_attribute = never +ij_html_new_line_before_first_attribute = never +ij_html_quote_style = double +ij_html_remove_new_line_before_tags = br +ij_html_space_after_tag_name = false +ij_html_space_around_equality_in_attribute = false +ij_html_space_inside_empty_tag = false +ij_html_text_wrap = normal + +[{*.http,*.rest}] +indent_size = 0 +ij_continuation_indent_size = 4 +ij_http-request_call_parameters_wrap = normal +ij_http-request_method_parameters_wrap = split_into_lines +ij_http-request_space_before_comma = true +ij_http-request_spaces_around_assignment_operators = true + +[{*.markdown,*.md}] +ij_markdown_force_one_space_after_blockquote_symbol = true +ij_markdown_force_one_space_after_header_symbol = true +ij_markdown_force_one_space_after_list_bullet = true +ij_markdown_force_one_space_between_words = true +ij_markdown_format_tables = true +ij_markdown_insert_quote_arrows_on_wrap = true +ij_markdown_keep_indents_on_empty_lines = false +ij_markdown_keep_line_breaks_inside_text_blocks = true +ij_markdown_max_lines_around_block_elements = 1 +ij_markdown_max_lines_around_header = 1 +ij_markdown_max_lines_between_paragraphs = 1 +ij_markdown_min_lines_around_block_elements = 1 +ij_markdown_min_lines_around_header = 1 +ij_markdown_min_lines_between_paragraphs = 1 +ij_markdown_wrap_text_if_long = true +ij_markdown_wrap_text_inside_blockquotes = true + +[{*.ps1,*.psd1,*.psm1}] +max_line_length = 115 +ij_powershell_align_multiline_binary_operation = true +ij_powershell_align_multiline_chained_methods = false +ij_powershell_align_multiline_for = true +ij_powershell_align_multiline_parameters = true +ij_powershell_align_multiline_parameters_in_calls = false +ij_powershell_binary_operation_wrap = on_every_item +ij_powershell_block_brace_style = next_line +ij_powershell_call_parameters_new_line_after_left_paren = false +ij_powershell_call_parameters_right_paren_on_new_line = false +ij_powershell_call_parameters_wrap = on_every_item +ij_powershell_catch_on_new_line = true +ij_powershell_class_annotation_wrap = split_into_lines +ij_powershell_class_brace_style = next_line +ij_powershell_else_on_new_line = true +ij_powershell_field_annotation_wrap = off +ij_powershell_finally_on_new_line = true +ij_powershell_for_statement_new_line_after_left_paren = false +ij_powershell_for_statement_right_paren_on_new_line = false +ij_powershell_for_statement_wrap = on_every_item +ij_powershell_keep_blank_lines_in_code = 2 +ij_powershell_keep_first_column_comment = true +ij_powershell_keep_line_breaks = true +ij_powershell_keep_simple_blocks_in_one_line = true +ij_powershell_keep_simple_classes_in_one_line = false +ij_powershell_keep_simple_lambdas_in_one_line = true +ij_powershell_keep_simple_methods_in_one_line = true +ij_powershell_method_annotation_wrap = split_into_lines +ij_powershell_method_brace_style = next_line +ij_powershell_method_call_chain_wrap = on_every_item +ij_powershell_method_parameters_new_line_after_left_paren = false +ij_powershell_method_parameters_right_paren_on_new_line = false +ij_powershell_method_parameters_wrap = on_every_item +ij_powershell_parameter_annotation_wrap = off +ij_powershell_parentheses_expression_new_line_after_left_paren = false +ij_powershell_parentheses_expression_right_paren_on_new_line = false +ij_powershell_space_after_colon = true +ij_powershell_space_after_comma = true +ij_powershell_space_after_for_semicolon = true +ij_powershell_space_after_type_cast = false +ij_powershell_space_before_annotation_parameter_list = false +ij_powershell_space_before_array_initializer_left_brace = false +ij_powershell_space_before_catch_keyword = true +ij_powershell_space_before_catch_left_brace = false +ij_powershell_space_before_class_left_brace = false +ij_powershell_space_before_colon = true +ij_powershell_space_before_comma = false +ij_powershell_space_before_do_left_brace = false +ij_powershell_space_before_else_keyword = true +ij_powershell_space_before_else_left_brace = false +ij_powershell_space_before_finally_keyword = true +ij_powershell_space_before_finally_left_brace = false +ij_powershell_space_before_for_left_brace = false +ij_powershell_space_before_for_parentheses = false +ij_powershell_space_before_for_semicolon = false +ij_powershell_space_before_if_left_brace = false +ij_powershell_space_before_if_parentheses = false +ij_powershell_space_before_method_call_parentheses = false +ij_powershell_space_before_method_left_brace = false +ij_powershell_space_before_method_parentheses = false +ij_powershell_space_before_switch_left_brace = false +ij_powershell_space_before_switch_parentheses = false +ij_powershell_space_before_try_left_brace = false +ij_powershell_space_before_while_keyword = true +ij_powershell_space_before_while_left_brace = false +ij_powershell_space_before_while_parentheses = false +ij_powershell_space_within_empty_method_call_parentheses = false +ij_powershell_space_within_empty_method_parentheses = false +ij_powershell_spaces_around_additive_operators = true +ij_powershell_spaces_around_assignment_operators = true +ij_powershell_spaces_around_bitwise_operators = true +ij_powershell_spaces_around_logical_operators = true +ij_powershell_spaces_around_method_ref_dbl_colon = false +ij_powershell_spaces_around_multiplicative_operators = true +ij_powershell_spaces_around_relational_operators = true +ij_powershell_spaces_around_unary_operator = false +ij_powershell_spaces_within_annotation_parentheses = false +ij_powershell_spaces_within_braces = true +ij_powershell_spaces_within_brackets = false +ij_powershell_spaces_within_cast_parentheses = false +ij_powershell_spaces_within_for_parentheses = false +ij_powershell_spaces_within_if_parentheses = false +ij_powershell_spaces_within_method_call_parentheses = false +ij_powershell_spaces_within_method_parentheses = false +ij_powershell_spaces_within_parentheses = false +ij_powershell_spaces_within_switch_parentheses = false +ij_powershell_spaces_within_while_parentheses = false +ij_powershell_special_else_if_treatment = true +ij_powershell_while_on_new_line = false +ij_powershell_wrap_first_method_in_call_chain = false +ij_powershell_wrap_long_lines = false + +[{*.py,*.pyw}] +ij_python_align_collections_and_comprehensions = true +ij_python_align_multiline_imports = true +ij_python_align_multiline_parameters = true +ij_python_align_multiline_parameters_in_calls = true +ij_python_blank_line_at_file_end = false +ij_python_blank_lines_after_imports = 1 +ij_python_blank_lines_after_local_imports = 0 +ij_python_blank_lines_around_class = 1 +ij_python_blank_lines_around_method = 1 +ij_python_blank_lines_around_top_level_classes_functions = 2 +ij_python_blank_lines_before_first_method = 0 +ij_python_call_parameters_new_line_after_left_paren = false +ij_python_call_parameters_right_paren_on_new_line = false +ij_python_call_parameters_wrap = on_every_item +ij_python_dict_alignment = 0 +ij_python_dict_new_line_after_left_brace = false +ij_python_dict_new_line_before_right_brace = false +ij_python_dict_wrapping = 5 +ij_python_from_import_new_line_after_left_parenthesis = false +ij_python_from_import_new_line_before_right_parenthesis = false +ij_python_from_import_parentheses_force_if_multiline = false +ij_python_from_import_trailing_comma_if_multiline = false +ij_python_from_import_wrapping = 5 +ij_python_hang_closing_brackets = true +ij_python_keep_blank_lines_in_code = 1 +ij_python_keep_blank_lines_in_declarations = 1 +ij_python_keep_indents_on_empty_lines = false +ij_python_keep_line_breaks = true +ij_python_method_parameters_new_line_after_left_paren = false +ij_python_method_parameters_right_paren_on_new_line = false +ij_python_method_parameters_wrap = on_every_item +ij_python_new_line_after_colon = false +ij_python_new_line_after_colon_multi_clause = true +ij_python_optimize_imports_always_split_from_imports = false +ij_python_optimize_imports_case_insensitive_order = true +ij_python_optimize_imports_join_from_imports_with_same_source = false +ij_python_optimize_imports_sort_by_type_first = true +ij_python_optimize_imports_sort_imports = true +ij_python_optimize_imports_sort_names_in_from_imports = true +ij_python_space_after_comma = true +ij_python_space_after_number_sign = true +ij_python_space_after_py_colon = true +ij_python_space_before_backslash = true +ij_python_space_before_comma = false +ij_python_space_before_for_semicolon = false +ij_python_space_before_lbracket = false +ij_python_space_before_method_call_parentheses = false +ij_python_space_before_method_parentheses = false +ij_python_space_before_number_sign = true +ij_python_space_before_py_colon = false +ij_python_space_within_empty_method_call_parentheses = false +ij_python_space_within_empty_method_parentheses = false +ij_python_spaces_around_additive_operators = true +ij_python_spaces_around_assignment_operators = true +ij_python_spaces_around_bitwise_operators = true +ij_python_spaces_around_eq_in_keyword_argument = false +ij_python_spaces_around_eq_in_named_parameter = false +ij_python_spaces_around_equality_operators = true +ij_python_spaces_around_multiplicative_operators = true +ij_python_spaces_around_power_operator = true +ij_python_spaces_around_relational_operators = true +ij_python_spaces_around_shift_operators = true +ij_python_spaces_within_braces = false +ij_python_spaces_within_brackets = false +ij_python_spaces_within_method_call_parentheses = false +ij_python_spaces_within_method_parentheses = false +ij_python_use_continuation_indent_for_arguments = false +ij_python_use_continuation_indent_for_collection_and_comprehensions = false +ij_python_use_continuation_indent_for_parameters = true +ij_python_wrap_long_lines = false + +[{*.toml,Cargo.lock,Cargo.toml.orig,Gopkg.lock,Pipfile,poetry.lock}] +ij_toml_keep_indents_on_empty_lines = false + +[{*.yaml,*.yml,pubspec.lock}] +indent_size = 2 +ij_yaml_align_values_properties = on_value +ij_yaml_autoinsert_sequence_marker = true +ij_yaml_block_mapping_on_new_line = false +ij_yaml_indent_sequence_value = true +ij_yaml_keep_indents_on_empty_lines = false +ij_yaml_keep_line_breaks = true +ij_yaml_sequence_on_new_line = false +ij_yaml_space_before_colon = false +ij_yaml_spaces_within_braces = true +ij_yaml_spaces_within_brackets = true +indent_style = space + +[*.{appxmanifest,asax,ascx,aspx,axaml,build,c,c++,cc,cginc,compute,cp,cpp,cppm,cs,cshtml,cu,cuh,cxx,dtd,fs,fsi,fsscript,fsx,fx,fxh,h,hh,hlsl,hlsli,hlslinc,hpp,hxx,inc,inl,ino,ipp,ixx,master,ml,mli,mpp,mq4,mq5,mqh,nuspec,paml,razor,resw,resx,shader,skin,tpp,usf,ush,uxml,vb,xaml,xamlx,xoml,xsd}] +indent_style = space +indent_size = 4 +tab_width = 4 diff --git a/Aaru.Decoders/.gitignore b/Aaru.Decoders/.gitignore new file mode 100644 index 000000000..05c540d38 --- /dev/null +++ b/Aaru.Decoders/.gitignore @@ -0,0 +1,595 @@ +### VisualStudio template +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ +### Linux template + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* +### Xcode template +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## User settings +xcuserdata/ + +## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) +*.xcscmblueprint +*.xccheckout + +## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) +build/ +DerivedData/ +*.moved-aside +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +### VisualStudioCode template +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +### C++ template +# Prerequisites +*.d + +# Compiled Object files +*.slo +*.lo +*.o + +# Precompiled Headers +*.gch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app +### MonoDevelop template +#User Specific +*.usertasks + +#Mono Project Files +*.resources +test-results/ +### GPG template +secring.* + +### JetBrains template +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/modules.xml +# .idea/*.iml +# .idea/modules + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests +### CMake template +CMakeCache.txt +CMakeFiles +CMakeScripts +Testing +Makefile +cmake_install.cmake +install_manifest.txt +compile_commands.json +CTestTestfile.cmake +### C template +# Object files +*.ko +*.elf + +# Linker output +*.map +*.exp + +*.so.* + +# Executables +*.i*86 +*.x86_64 +*.hex + +# Debug files +*.dSYM/ +*.su +*.idb + +# Kernel Module Compile Results +*.mod* +*.cmd +.tmp_versions/ +modules.order +Module.symvers +Mkfile.old +dkms.conf +### Windows template +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# NuGet Packages Directory +packages/ +## TODO: If the tool you use requires repositories.config uncomment the next line +#!packages/repositories.config + +# Enable "build/" folder in the NuGet Packages folder since NuGet packages use it for MSBuild targets +# This line needs to be after the ignore of the build folder (and the packages folder if the line above has been uncommented) +!packages/build/ + + +# Others +sql/ +*.Cache + +# Visual Studio 2017 +.vs + +workspace.xml +cmake-build-debug +### macOS template +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +pkg/**/pkg +pkg/**/src +pkg/**/*.asc +pkg/**/*.sig +pkg/**/*.tar.xz +pkg/**/*.zip +pkg/**/aaru + +.sonarqube \ No newline at end of file diff --git a/Aaru.Decoders/ATA/Identify.cs b/Aaru.Decoders/ATA/Identify.cs new file mode 100644 index 000000000..7514b4c2f --- /dev/null +++ b/Aaru.Decoders/ATA/Identify.cs @@ -0,0 +1,2372 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : Identify.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes ATA IDENTIFY DEVICE response. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Text; +using Aaru.CommonTypes.Structs.Devices.SCSI; +using Aaru.Localization; + +namespace Aaru.Decoders.ATA; + +// Information from following standards: +// T10-791D rev. 4c (ATA) +// T10-948D rev. 4c (ATA-2) +// T13-1153D rev. 18 (ATA/ATAPI-4) +// T13-1321D rev. 3 (ATA/ATAPI-5) +// T13-1410D rev. 3b (ATA/ATAPI-6) +// T13-1532D rev. 4b (ATA/ATAPI-7) +// T13-1699D rev. 3f (ATA8-ACS) +// T13-1699D rev. 4a (ATA8-ACS) +// T13-2015D rev. 2 (ACS-2) +// T13-2161D rev. 5 (ACS-3) +// CF+ & CF Specification rev. 1.4 (CFA) +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static class Identify +{ + public static string Prettify(byte[] IdentifyDeviceResponse) + { + if(IdentifyDeviceResponse.Length != 512) + return null; + + CommonTypes.Structs.Devices.ATA.Identify.IdentifyDevice? decoded = + CommonTypes.Structs.Devices.ATA.Identify.Decode(IdentifyDeviceResponse); + + return Prettify(decoded); + } + + public static string Prettify(CommonTypes.Structs.Devices.ATA.Identify.IdentifyDevice? IdentifyDeviceResponse) + { + if(IdentifyDeviceResponse == null) + return null; + + var sb = new StringBuilder(); + + var atapi = false; + var cfa = false; + + CommonTypes.Structs.Devices.ATA.Identify.IdentifyDevice ATAID = IdentifyDeviceResponse.Value; + + if(ATAID.GeneralConfiguration.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.GeneralConfigurationBit. + NonMagnetic)) + { + if((ushort)ATAID.GeneralConfiguration != 0x848A) + atapi = true; + else + cfa = true; + } + + if(atapi) + sb.AppendLine(Localization.ATAPI_device); + else if(cfa) + sb.AppendLine(Localization.CompactFlash_device); + else + sb.AppendLine(Localization.ATA_device); + + if(ATAID.Model != "") + sb.AppendFormat(Core.Model_0, ATAID.Model).AppendLine(); + + if(ATAID.FirmwareRevision != "") + sb.AppendFormat(Core.Firmware_revision_0, ATAID.FirmwareRevision).AppendLine(); + + if(ATAID.SerialNumber != "") + sb.AppendFormat(Core.Serial_number_0, ATAID.SerialNumber).AppendLine(); + + if(ATAID.AdditionalPID != "") + sb.AppendFormat(Localization.Additional_product_ID_0, ATAID.AdditionalPID).AppendLine(); + + if(ATAID.CommandSet3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit3.MustBeSet) && + !ATAID.CommandSet3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit3.MustBeClear)) + { + if(ATAID.EnabledCommandSet3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit3.MediaSerial)) + { + if(ATAID.MediaManufacturer != "") + sb.AppendFormat(Core.Media_manufacturer_0, ATAID.MediaManufacturer).AppendLine(); + + if(ATAID.MediaSerial != "") + sb.AppendFormat(Core.Media_serial_number_0, ATAID.MediaSerial).AppendLine(); + } + + if(ATAID.EnabledCommandSet3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit3.WWN)) + sb.AppendFormat(Localization.World_Wide_Name_0, ATAID.WWN).AppendLine(); + } + + bool ata1 = false, + ata2 = false, + ata3 = false, + ata4 = false, + ata5 = false, + ata6 = false, + ata7 = false, + acs = false, + acs2 = false, + acs3 = false, + acs4 = false; + + if((ushort)ATAID.MajorVersion == 0x0000 || (ushort)ATAID.MajorVersion == 0xFFFF) + { + // Obsolete in ATA-2, if present, device supports ATA-1 + ata1 |= + ATAID.GeneralConfiguration.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.GeneralConfigurationBit. + FastIDE) || + ATAID.GeneralConfiguration.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.GeneralConfigurationBit. + SlowIDE) || + ATAID.GeneralConfiguration.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.GeneralConfigurationBit. + UltraFastIDE); + + ata2 |= ATAID.ExtendedIdentify.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.ExtendedIdentifyBit. + Words64to70Valid); + + if(!ata1 && !ata2 && !atapi && !cfa) + ata2 = true; + + ata4 |= atapi; + ata3 |= cfa; + + if(cfa && ata1) + ata1 = false; + + if(cfa && ata2) + ata2 = false; + + ata5 |= ATAID.Signature == 0xA5; + } + else + { + ata1 |= ATAID.MajorVersion.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.MajorVersionBit.Ata1); + ata2 |= ATAID.MajorVersion.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.MajorVersionBit.Ata2); + ata3 |= ATAID.MajorVersion.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.MajorVersionBit.Ata3); + ata4 |= ATAID.MajorVersion.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.MajorVersionBit.AtaAtapi4); + ata5 |= ATAID.MajorVersion.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.MajorVersionBit.AtaAtapi5); + ata6 |= ATAID.MajorVersion.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.MajorVersionBit.AtaAtapi6); + ata7 |= ATAID.MajorVersion.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.MajorVersionBit.AtaAtapi7); + acs |= ATAID.MajorVersion.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.MajorVersionBit.Ata8ACS); + acs2 |= ATAID.MajorVersion.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.MajorVersionBit.ACS2); + acs3 |= ATAID.MajorVersion.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.MajorVersionBit.ACS3); + acs4 |= ATAID.MajorVersion.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.MajorVersionBit.ACS4); + } + + var maxatalevel = 0; + var minatalevel = 255; + sb.Append(Localization.Supported_ATA_versions); + + if(ata1) + { + sb.Append("ATA-1 "); + maxatalevel = 1; + minatalevel = 1; + } + + if(ata2) + { + sb.Append("ATA-2 "); + maxatalevel = 2; + + if(minatalevel > 2) + minatalevel = 2; + } + + if(ata3) + { + sb.Append("ATA-3 "); + maxatalevel = 3; + + if(minatalevel > 3) + minatalevel = 3; + } + + if(ata4) + { + sb.Append("ATA/ATAPI-4 "); + maxatalevel = 4; + + if(minatalevel > 4) + minatalevel = 4; + } + + if(ata5) + { + sb.Append("ATA/ATAPI-5 "); + maxatalevel = 5; + + if(minatalevel > 5) + minatalevel = 5; + } + + if(ata6) + { + sb.Append("ATA/ATAPI-6 "); + maxatalevel = 6; + + if(minatalevel > 6) + minatalevel = 6; + } + + if(ata7) + { + sb.Append("ATA/ATAPI-7 "); + maxatalevel = 7; + + if(minatalevel > 7) + minatalevel = 7; + } + + if(acs) + { + sb.Append("ATA8-ACS "); + maxatalevel = 8; + + if(minatalevel > 8) + minatalevel = 8; + } + + if(acs2) + { + sb.Append("ATA8-ACS2 "); + maxatalevel = 9; + + if(minatalevel > 9) + minatalevel = 9; + } + + if(acs3) + { + sb.Append("ATA8-ACS3 "); + maxatalevel = 10; + + if(minatalevel > 10) + minatalevel = 10; + } + + if(acs4) + { + sb.Append("ATA8-ACS4 "); + maxatalevel = 11; + + if(minatalevel > 11) + minatalevel = 11; + } + + sb.AppendLine(); + + sb.Append(Localization.Maximum_ATA_revision_supported); + + if(maxatalevel >= 3) + { + switch(ATAID.MinorVersion) + { + case 0x0000: + case 0xFFFF: + sb.AppendLine(Localization.Minor_ATA_version_not_specified); + + break; + case 0x0001: + sb.AppendLine(Localization.ATA_ATA_1_X3T9_2_781D_prior_to_revision_4); + + break; + case 0x0002: + sb.AppendLine(Localization.ATA_1_published_ANSI_X3_221_1994); + + break; + case 0x0003: + sb.AppendLine(Localization.ATA_ATA_1_X3T9_2_781D_revision_4); + + break; + case 0x0004: + sb.AppendLine(Localization.ATA_2_published_ANSI_X3_279_1996); + + break; + case 0x0005: + sb.AppendLine(Localization.ATA_2_X3T10_948D_prior_to_revision_2k); + + break; + case 0x0006: + sb.AppendLine(Localization.ATA_3_X3T10_2008D_revision_1); + + break; + case 0x0007: + sb.AppendLine(Localization.ATA_2_X3T10_948D_revision_2k); + + break; + case 0x0008: + sb.AppendLine(Localization.ATA_3_X3T10_2008D_revision_0); + + break; + case 0x0009: + sb.AppendLine(Localization.ATA_2_X3T10_948D_revision_3); + + break; + case 0x000A: + sb.AppendLine(Localization.ATA_3_published_ANSI_X3_298_1997); + + break; + case 0x000B: + sb.AppendLine(Localization.ATA_3_X3T10_2008D_revision_6); + + break; + case 0x000C: + sb.AppendLine(Localization.ATA_3_X3T13_2008D_revision_7); + + break; + case 0x000D: + sb.AppendLine(Localization.ATA_ATAPI_4_X3T13_1153D_revision_6); + + break; + case 0x000E: + sb.AppendLine(Localization.ATA_ATAPI_4_T13_1153D_revision_13); + + break; + case 0x000F: + sb.AppendLine(Localization.ATA_ATAPI_4_X3T13_1153D_revision_7); + + break; + case 0x0010: + sb.AppendLine(Localization.ATA_ATAPI_4_T13_1153D_revision_18); + + break; + case 0x0011: + sb.AppendLine(Localization.ATA_ATAPI_4_T13_1153D_revision_15); + + break; + case 0x0012: + sb.AppendLine(Localization.ATA_ATAPI_4_published_ANSI_INCITS_317_1998); + + break; + case 0x0013: + sb.AppendLine(Localization.ATA_ATAPI_5_T13_1321D_revision_3); + + break; + case 0x0014: + sb.AppendLine(Localization.ATA_ATAPI_4_T13_1153D_revision_14); + + break; + case 0x0015: + sb.AppendLine(Localization.ATA_ATAPI_5_T13_1321D_revision_1); + + break; + case 0x0016: + sb.AppendLine(Localization.ATA_ATAPI_5_published_ANSI_INCITS_340_2000); + + break; + case 0x0017: + sb.AppendLine(Localization.ATA_ATAPI_4_T13_1153D_revision_17); + + break; + case 0x0018: + sb.AppendLine(Localization.ATA_ATAPI_6_T13_1410D_revision_0); + + break; + case 0x0019: + sb.AppendLine(Localization.ATA_ATAPI_6_T13_1410D_revision_3a); + + break; + case 0x001A: + sb.AppendLine(Localization.ATA_ATAPI_7_T13_1532D_revision_1); + + break; + case 0x001B: + sb.AppendLine(Localization.ATA_ATAPI_6_T13_1410D_revision_2); + + break; + case 0x001C: + sb.AppendLine(Localization.ATA_ATAPI_6_T13_1410D_revision_1); + + break; + case 0x001D: + sb.AppendLine(Localization.ATA_ATAPI_7_published_ANSI_INCITS_397_2005); + + break; + case 0x001E: + sb.AppendLine(Localization.ATA_ATAPI_7_T13_1532D_revision_0); + + break; + case 0x001F: + sb.AppendLine(Localization.ACS_3_Revision_3b); + + break; + case 0x0021: + sb.AppendLine(Localization.ATA_ATAPI_7_T13_1532D_revision_4a); + + break; + case 0x0022: + sb.AppendLine(Localization.ATA_ATAPI_6_published_ANSI_INCITS_361_2002); + + break; + case 0x0027: + sb.AppendLine(Localization.ATA8_ACS_revision_3c); + + break; + case 0x0028: + sb.AppendLine(Localization.ATA8_ACS_revision_6); + + break; + case 0x0029: + sb.AppendLine(Localization.ATA8_ACS_revision_4); + + break; + case 0x0031: + sb.AppendLine(Localization.ACS_2_Revision_2); + + break; + case 0x0033: + sb.AppendLine(Localization.ATA8_ACS_Revision_3e); + + break; + case 0x0039: + sb.AppendLine(Localization.ATA8_ACS_Revision_4c); + + break; + case 0x0042: + sb.AppendLine(Localization.ATA8_ACS_Revision_3f); + + break; + case 0x0052: + sb.AppendLine(Localization.ATA8_ACS_revision_3b); + + break; + case 0x006D: + sb.AppendLine(Localization.ACS_3_Revision_5); + + break; + case 0x0082: + sb.AppendLine(Localization.ACS_2_published_ANSI_INCITS_482_2012); + + break; + case 0x0107: + sb.AppendLine(Localization.ATA8_ACS_revision_2d); + + break; + case 0x0110: + sb.AppendLine(Localization.ACS_2_Revision_3); + + break; + case 0x011B: + sb.AppendLine(Localization.ACS_3_Revision_4); + + break; + default: + sb.AppendFormat(Localization.Unknown_ATA_revision_0, ATAID.MinorVersion).AppendLine(); + + break; + } + } + + switch((ATAID.TransportMajorVersion & 0xF000) >> 12) + { + case 0x0: + sb.Append(Localization.Parallel_ATA_device); + + if((ATAID.TransportMajorVersion & 0x0002) == 0x0002) + sb.Append("ATA/ATAPI-7 "); + + if((ATAID.TransportMajorVersion & 0x0001) == 0x0001) + sb.Append("ATA8-APT "); + + sb.AppendLine(); + + break; + case 0x1: + sb.Append(Localization.Serial_ATA_device); + + if((ATAID.TransportMajorVersion & 0x0001) == 0x0001) + sb.Append("ATA8-AST "); + + if((ATAID.TransportMajorVersion & 0x0002) == 0x0002) + sb.Append("SATA 1.0a "); + + if((ATAID.TransportMajorVersion & 0x0004) == 0x0004) + sb.Append("SATA II Extensions "); + + if((ATAID.TransportMajorVersion & 0x0008) == 0x0008) + sb.Append("SATA 2.5 "); + + if((ATAID.TransportMajorVersion & 0x0010) == 0x0010) + sb.Append("SATA 2.6 "); + + if((ATAID.TransportMajorVersion & 0x0020) == 0x0020) + sb.Append("SATA 3.0 "); + + if((ATAID.TransportMajorVersion & 0x0040) == 0x0040) + sb.Append("SATA 3.1 "); + + sb.AppendLine(); + + break; + case 0xE: + sb.AppendLine(Localization.SATA_Express_device); + + break; + default: + sb.AppendFormat(Localization.Unknown_transport_type_0, (ATAID.TransportMajorVersion & 0xF000) >> 12). + AppendLine(); + + break; + } + + if(atapi) + { + // Bits 12 to 8, SCSI Peripheral Device Type + switch((PeripheralDeviceTypes)(((ushort)ATAID.GeneralConfiguration & 0x1F00) >> 8)) + { + case PeripheralDeviceTypes.DirectAccess: //0x00, + sb.AppendLine(Localization.ATAPI_Direct_access_device); + + break; + case PeripheralDeviceTypes.SequentialAccess: //0x01, + sb.AppendLine(Localization.ATAPI_Sequential_access_device); + + break; + case PeripheralDeviceTypes.PrinterDevice: //0x02, + sb.AppendLine(Localization.ATAPI_Printer_device); + + break; + case PeripheralDeviceTypes.ProcessorDevice: //0x03, + sb.AppendLine(Localization.ATAPI_Processor_device); + + break; + case PeripheralDeviceTypes.WriteOnceDevice: //0x04, + sb.AppendLine(Localization.ATAPI_Write_once_device); + + break; + case PeripheralDeviceTypes.MultiMediaDevice: //0x05, + sb.AppendLine(Localization.ATAPI_CD_ROM_DVD_etc_device); + + break; + case PeripheralDeviceTypes.ScannerDevice: //0x06, + sb.AppendLine(Localization.ATAPI_Scanner_device); + + break; + case PeripheralDeviceTypes.OpticalDevice: //0x07, + sb.AppendLine(Localization.ATAPI_Optical_memory_device); + + break; + case PeripheralDeviceTypes.MediumChangerDevice: //0x08, + sb.AppendLine(Localization.ATAPI_Medium_change_device); + + break; + case PeripheralDeviceTypes.CommsDevice: //0x09, + sb.AppendLine(Localization.ATAPI_Communications_device); + + break; + case PeripheralDeviceTypes.PrePressDevice1: //0x0A, + sb.AppendLine(Localization.ATAPI_Graphics_arts_pre_press_device_defined_in_ASC_IT8); + + break; + case PeripheralDeviceTypes.PrePressDevice2: //0x0B, + sb.AppendLine(Localization.ATAPI_Graphics_arts_pre_press_device_defined_in_ASC_IT8); + + break; + case PeripheralDeviceTypes.ArrayControllerDevice: //0x0C, + sb.AppendLine(Localization.ATAPI_Array_controller_device); + + break; + case PeripheralDeviceTypes.EnclosureServiceDevice: //0x0D, + sb.AppendLine(Localization.ATAPI_Enclosure_services_device); + + break; + case PeripheralDeviceTypes.SimplifiedDevice: //0x0E, + sb.AppendLine(Localization.ATAPI_Simplified_direct_access_device); + + break; + case PeripheralDeviceTypes.OCRWDevice: //0x0F, + sb.AppendLine(Localization.ATAPI_Optical_card_reader_writer_device); + + break; + case PeripheralDeviceTypes.BridgingExpander: //0x10, + sb.AppendLine(Localization.ATAPI_Bridging_Expanders); + + break; + case PeripheralDeviceTypes.ObjectDevice: //0x11, + sb.AppendLine(Localization.ATAPI_Object_based_Storage_Device); + + break; + case PeripheralDeviceTypes.ADCDevice: //0x12, + sb.AppendLine(Localization.ATAPI_Automation_Drive_Interface); + + break; + case PeripheralDeviceTypes.WellKnownDevice: //0x1E, + sb.AppendLine(Localization.ATAPI_Well_known_logical_unit); + + break; + case PeripheralDeviceTypes.UnknownDevice: //0x1F + sb.AppendLine(Localization.ATAPI_Unknown_or_no_device_type); + + break; + default: + sb.AppendFormat(Localization.ATAPI_Unknown_device_type_field_value_0, + ((ushort)ATAID.GeneralConfiguration & 0x1F00) >> 8). + AppendLine(); + + break; + } + + // ATAPI DRQ behaviour + switch(((ushort)ATAID.GeneralConfiguration & 0x60) >> 5) + { + case 0: + sb.AppendLine(Localization.Device_shall_set_DRQ_within_3_ms_of_receiving_PACKET); + + break; + case 1: + sb.AppendLine(Localization.Device_shall_assert_INTRQ_when_DRQ_is_set_to_one); + + break; + case 2: + sb.AppendLine(Localization.Device_shall_set_DRQ_within_50_µs_of_receiving_PACKET); + + break; + default: + sb.AppendFormat(Localization.Unknown_ATAPI_DRQ_behaviour_code_0, + ((ushort)ATAID.GeneralConfiguration & 0x60) >> 5). + AppendLine(); + + break; + } + + // ATAPI PACKET size + switch((ushort)ATAID.GeneralConfiguration & 0x03) + { + case 0: + sb.AppendLine(Localization.ATAPI_device_uses_12_byte_command_packet); + + break; + case 1: + sb.AppendLine(Localization.ATAPI_device_uses_16_byte_command_packet); + + break; + default: + sb.AppendFormat(Localization.Unknown_ATAPI_packet_size_code_0, + (ushort)ATAID.GeneralConfiguration & 0x03). + AppendLine(); + + break; + } + } + else if(!cfa) + { + if(minatalevel >= 5) + { + if(ATAID.GeneralConfiguration.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.GeneralConfigurationBit. + IncompleteResponse)) + sb.AppendLine(Localization.Incomplete_identify_response); + } + + if(ATAID.GeneralConfiguration.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.GeneralConfigurationBit. + NonMagnetic)) + sb.AppendLine(Localization.Device_uses_non_magnetic_media); + + if(ATAID.GeneralConfiguration.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.GeneralConfigurationBit. + Removable)) + sb.AppendLine(Localization.Device_is_removable); + + if(minatalevel <= 5) + { + if(ATAID.GeneralConfiguration.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.GeneralConfigurationBit. + Fixed)) + sb.AppendLine(Localization.Device_is_fixed); + } + + if(ata1) + { + if(ATAID.GeneralConfiguration.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.GeneralConfigurationBit. + SlowIDE)) + sb.AppendLine(Localization.Device_transfer_rate_less_than_5_Mbs); + + if(ATAID.GeneralConfiguration.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.GeneralConfigurationBit. + FastIDE)) + sb.AppendLine(Localization.Device_transfer_rate_is_more_5_Mbs_less_10_Mbs); + + if(ATAID.GeneralConfiguration.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.GeneralConfigurationBit. + UltraFastIDE)) + sb.AppendLine(Localization.Device_transfer_rate_more_than_10_Mbs); + + if(ATAID.GeneralConfiguration.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.GeneralConfigurationBit. + SoftSector)) + sb.AppendLine(Localization.Device_is_soft_sectored); + + if(ATAID.GeneralConfiguration.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.GeneralConfigurationBit. + HardSector)) + sb.AppendLine(Localization.Device_is_hard_sectored); + + if(ATAID.GeneralConfiguration.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.GeneralConfigurationBit. + NotMFM)) + sb.AppendLine(Localization.Device_is_not_MFM_encoded); + + if(ATAID.GeneralConfiguration.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.GeneralConfigurationBit. + FormatGapReq)) + sb.AppendLine(Localization.Format_speed_tolerance_gap_is_required); + + if(ATAID.GeneralConfiguration.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.GeneralConfigurationBit. + TrackOffset)) + sb.AppendLine(Localization.Track_offset_option_is_available); + + if(ATAID.GeneralConfiguration.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.GeneralConfigurationBit. + DataStrobeOffset)) + sb.AppendLine(Localization.Data_strobe_offset_option_is_available); + + if(ATAID.GeneralConfiguration.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.GeneralConfigurationBit. + RotationalSpeedTolerance)) + sb.AppendLine(Localization.Rotational_speed_tolerance_is_higher_than_0_5_percent); + + if(ATAID.GeneralConfiguration.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.GeneralConfigurationBit. + SpindleControl)) + sb.AppendLine(Localization.Spindle_motor_control_is_implemented); + + if(ATAID.GeneralConfiguration.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.GeneralConfigurationBit. + HighHeadSwitch)) + sb.AppendLine(Localization.Head_switch_time_is_bigger_than_15_µs); + } + } + + if(ATAID.NominalRotationRate != 0x0000 && ATAID.NominalRotationRate != 0xFFFF) + { + if(ATAID.NominalRotationRate == 0x0001) + sb.AppendLine(Localization.Device_does_not_rotate); + else + sb.AppendFormat(Localization.Device_rotates_at_0_rpm, ATAID.NominalRotationRate).AppendLine(); + } + + uint logicalSectorSize = 0; + + if(!atapi) + { + uint physicalSectorSize; + + if((ATAID.PhysLogSectorSize & 0x8000) == 0x0000 && (ATAID.PhysLogSectorSize & 0x4000) == 0x4000) + { + if((ATAID.PhysLogSectorSize & 0x1000) == 0x1000) + { + if(ATAID.LogicalSectorWords <= 255 || ATAID.LogicalAlignment == 0xFFFF) + logicalSectorSize = 512; + else + logicalSectorSize = ATAID.LogicalSectorWords * 2; + } + else + logicalSectorSize = 512; + + if((ATAID.PhysLogSectorSize & 0x2000) == 0x2000) + physicalSectorSize = logicalSectorSize * (uint)Math.Pow(2, ATAID.PhysLogSectorSize & 0xF); + else + physicalSectorSize = logicalSectorSize; + } + else + { + logicalSectorSize = 512; + physicalSectorSize = 512; + } + + sb.AppendFormat(Localization.Physical_sector_size_0_bytes, physicalSectorSize).AppendLine(); + sb.AppendFormat(Localization.Logical_sector_size_0_bytes, logicalSectorSize).AppendLine(); + + if(logicalSectorSize != physicalSectorSize && + (ATAID.LogicalAlignment & 0x8000) == 0x0000 && + (ATAID.LogicalAlignment & 0x4000) == 0x4000) + { + sb.AppendFormat(Localization.Logical_sector_starts_at_offset_0_from_physical_sector, + ATAID.LogicalAlignment & 0x3FFF). + AppendLine(); + } + + if(minatalevel <= 5) + { + if(ATAID.CurrentCylinders > 0 && ATAID is { CurrentHeads: > 0, CurrentSectorsPerTrack: > 0 }) + { + sb.AppendFormat(Localization.Cylinders_0_max_1_current, ATAID.Cylinders, ATAID.CurrentCylinders). + AppendLine(); + + sb.AppendFormat(Localization.Heads_0_max_1_current, ATAID.Heads, ATAID.CurrentHeads).AppendLine(); + + sb.AppendFormat(Localization.Sectors_per_track_0_max_1_current, ATAID.SectorsPerTrack, + ATAID.CurrentSectorsPerTrack). + AppendLine(); + + sb.AppendFormat(Localization.Sectors_addressable_in_CHS_mode_0_max_1_current, + ATAID.Cylinders * ATAID.Heads * ATAID.SectorsPerTrack, ATAID.CurrentSectors). + AppendLine(); + } + else + { + sb.AppendFormat(Localization.Cylinders_0, ATAID.Cylinders).AppendLine(); + sb.AppendFormat(Localization.Heads_0, ATAID.Heads).AppendLine(); + sb.AppendFormat(Localization.Sectors_per_track_0, ATAID.SectorsPerTrack).AppendLine(); + + sb.AppendFormat(Localization.Sectors_addressable_in_CHS_mode_0, + ATAID.Cylinders * ATAID.Heads * ATAID.SectorsPerTrack). + AppendLine(); + } + } + + if(ATAID.Capabilities.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CapabilitiesBit.LBASupport)) + sb.AppendFormat(Localization._0_sectors_in_28_bit_LBA_mode, ATAID.LBASectors).AppendLine(); + + if(ATAID.CommandSet2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit2.LBA48)) + sb.AppendFormat(Localization._0_sectors_in_48_bit_LBA_mode, ATAID.LBA48Sectors).AppendLine(); + + if(minatalevel <= 5) + { + if(ATAID.CurrentSectors > 0) + { + sb.AppendFormat(Localization.Device_size_in_CHS_mode_0_bytes_1_Mb_2_MiB, + (ulong)ATAID.CurrentSectors * logicalSectorSize, + (ulong)ATAID.CurrentSectors * logicalSectorSize / 1000 / 1000, + (ulong)ATAID.CurrentSectors * 512 / 1024 / 1024). + AppendLine(); + } + else + { + var currentSectors = (ulong)(ATAID.Cylinders * ATAID.Heads * ATAID.SectorsPerTrack); + + sb.AppendFormat(Localization.Device_size_in_CHS_mode_0_bytes_1_Mb_2_MiB, + currentSectors * logicalSectorSize, + currentSectors * logicalSectorSize / 1000 / 1000, + currentSectors * 512 / 1024 / 1024). + AppendLine(); + } + } + + if(ATAID.Capabilities.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CapabilitiesBit.LBASupport)) + { + switch((ulong)ATAID.LBASectors * logicalSectorSize / 1024 / 1024) + { + case > 1000000: + sb.AppendFormat(Localization.Device_size_in_28_bit_LBA_mode_0_bytes_1_Tb_2_TiB, + (ulong)ATAID.LBASectors * logicalSectorSize, + (ulong)ATAID.LBASectors * logicalSectorSize / 1000 / 1000 / 1000 / 1000, + (ulong)ATAID.LBASectors * 512 / 1024 / 1024 / 1024 / 1024). + AppendLine(); + + break; + case > 1000: + sb.AppendFormat(Localization.Device_size_in_28_bit_LBA_mode_0_bytes_1_Gb_2_GiB, + (ulong)ATAID.LBASectors * logicalSectorSize, + (ulong)ATAID.LBASectors * logicalSectorSize / 1000 / 1000 / 1000, + (ulong)ATAID.LBASectors * 512 / 1024 / 1024 / 1024). + AppendLine(); + + break; + default: + sb.AppendFormat(Localization.Device_size_in_28_bit_LBA_mode_0_bytes_1_Mb_2_MiB, + (ulong)ATAID.LBASectors * logicalSectorSize, + (ulong)ATAID.LBASectors * logicalSectorSize / 1000 / 1000, + (ulong)ATAID.LBASectors * 512 / 1024 / 1024). + AppendLine(); + + break; + } + } + + if(ATAID.CommandSet2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit2.LBA48)) + { + if(ATAID.CommandSet5.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit5.ExtSectors)) + { + switch(ATAID.ExtendedUserSectors * logicalSectorSize / 1024 / 1024) + { + case > 1000000: + sb.AppendFormat(Localization.Device_size_in_48_bit_LBA_mode_0_bytes_1_Tb_2_TiB, + ATAID.ExtendedUserSectors * logicalSectorSize, + ATAID.ExtendedUserSectors * logicalSectorSize / 1000 / 1000 / 1000 / 1000, + ATAID.ExtendedUserSectors * logicalSectorSize / 1024 / 1024 / 1024 / 1024). + AppendLine(); + + break; + case > 1000: + sb.AppendFormat(Localization.Device_size_in_48_bit_LBA_mode_0_bytes_1_Gb_2_GiB, + ATAID.ExtendedUserSectors * logicalSectorSize, + ATAID.ExtendedUserSectors * logicalSectorSize / 1000 / 1000 / 1000, + ATAID.ExtendedUserSectors * logicalSectorSize / 1024 / 1024 / 1024). + AppendLine(); + + break; + default: + sb.AppendFormat(Localization.Device_size_in_48_bit_LBA_mode_0_bytes_1_Mb_2_MiB, + ATAID.ExtendedUserSectors * logicalSectorSize, + ATAID.ExtendedUserSectors * logicalSectorSize / 1000 / 1000, + ATAID.ExtendedUserSectors * logicalSectorSize / 1024 / 1024). + AppendLine(); + + break; + } + } + else + { + switch(ATAID.LBA48Sectors * logicalSectorSize / 1024 / 1024) + { + case > 1000000: + sb.AppendFormat(Localization.Device_size_in_48_bit_LBA_mode_0_bytes_1_Tb_2_TiB, + ATAID.LBA48Sectors * logicalSectorSize, + ATAID.LBA48Sectors * logicalSectorSize / 1000 / 1000 / 1000 / 1000, + ATAID.LBA48Sectors * logicalSectorSize / 1024 / 1024 / 1024 / 1024). + AppendLine(); + + break; + case > 1000: + sb.AppendFormat(Localization.Device_size_in_48_bit_LBA_mode_0_bytes_1_Gb_2_GiB, + ATAID.LBA48Sectors * logicalSectorSize, + ATAID.LBA48Sectors * logicalSectorSize / 1000 / 1000 / 1000, + ATAID.LBA48Sectors * logicalSectorSize / 1024 / 1024 / 1024). + AppendLine(); + + break; + default: + sb.AppendFormat(Localization.Device_size_in_48_bit_LBA_mode_0_bytes_1_Mb_2_MiB, + ATAID.LBA48Sectors * logicalSectorSize, + ATAID.LBA48Sectors * logicalSectorSize / 1000 / 1000, + ATAID.LBA48Sectors * logicalSectorSize / 1024 / 1024). + AppendLine(); + + break; + } + } + } + + if(ata1 || cfa) + { + if(cfa) + sb.AppendFormat(Localization._0_sectors_in_card, ATAID.SectorsPerCard).AppendLine(); + + if(ATAID.UnformattedBPT > 0) + sb.AppendFormat(Localization._0_bytes_per_unformatted_track, ATAID.UnformattedBPT).AppendLine(); + + if(ATAID.UnformattedBPS > 0) + sb.AppendFormat(Localization._0_bytes_per_unformatted_sector, ATAID.UnformattedBPS).AppendLine(); + } + } + + if((ushort)ATAID.SpecificConfiguration != 0x0000 && (ushort)ATAID.SpecificConfiguration != 0xFFFF) + { + switch(ATAID.SpecificConfiguration) + { + case CommonTypes.Structs.Devices.ATA.Identify.SpecificConfigurationEnum.RequiresSetIncompleteResponse: + sb.AppendLine(Localization. + Device_requires_SET_FEATURES_to_spin_up_and_IDENTIFY_DEVICE_response_is_incomplete); + + break; + case CommonTypes.Structs.Devices.ATA.Identify.SpecificConfigurationEnum.RequiresSetCompleteResponse: + sb.AppendLine(Localization. + Device_requires_SET_FEATURES_to_spin_up_and_IDENTIFY_DEVICE_response_is_complete); + + break; + case CommonTypes.Structs.Devices.ATA.Identify.SpecificConfigurationEnum. + NotRequiresSetIncompleteResponse: + sb.AppendLine(Localization. + Device_does_not_require_SET_FEATURES_to_spin_up_and_IDENTIFY_DEVICE_response_is_incomplete); + + break; + case CommonTypes.Structs.Devices.ATA.Identify.SpecificConfigurationEnum.NotRequiresSetCompleteResponse: + sb.AppendLine(Localization. + Device_does_not_require_SET_FEATURES_to_spin_up_and_IDENTIFY_DEVICE_response_is_complete); + + break; + default: + sb.AppendFormat(Localization.Unknown_device_specific_configuration_0, + (ushort)ATAID.SpecificConfiguration). + AppendLine(); + + break; + } + } + + // Obsolete since ATA-2, however, it is yet used in ATA-8 devices + if(ATAID.BufferSize != 0x0000 && + ATAID.BufferSize != 0xFFFF && + ATAID.BufferType != 0x0000 && + ATAID.BufferType != 0xFFFF) + { + switch(ATAID.BufferType) + { + case 1: + sb.AppendFormat(Localization._0_KiB_of_single_ported_single_sector_buffer, + ATAID.BufferSize * 512 / 1024). + AppendLine(); + + break; + case 2: + sb.AppendFormat(Localization._0_KiB_of_dual_ported_multi_sector_buffer, + ATAID.BufferSize * 512 / 1024). + AppendLine(); + + break; + case 3: + sb.AppendFormat(Localization._0_KiB_of_dual_ported_multi_sector_buffer_with_read_caching, + ATAID.BufferSize * 512 / 1024). + AppendLine(); + + break; + default: + sb.AppendFormat(Localization._0_KiB_of_unknown_type_1_buffer, ATAID.BufferSize * 512 / 1024, + ATAID.BufferType). + AppendLine(); + + break; + } + } + + if(ATAID.EccBytes != 0x0000 && ATAID.EccBytes != 0xFFFF) + sb.AppendFormat(Localization.READ_WRITE_LONG_has_0_extra_bytes, ATAID.EccBytes).AppendLine(); + + sb.AppendLine(); + + sb.Append(Localization.Device_capabilities); + + if(ATAID.Capabilities.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CapabilitiesBit.StandardStandbyTimer)) + sb.AppendLine().Append(Localization.Standby_time_values_are_standard); + + if(ATAID.Capabilities.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CapabilitiesBit.IORDY)) + { + sb.AppendLine(). + Append(ATAID.Capabilities.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CapabilitiesBit. + CanDisableIORDY) + ? Localization.IORDY_is_supported_and_can_be_disabled + : Localization.IORDY_is_supported); + } + + if(ATAID.Capabilities.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CapabilitiesBit.DMASupport)) + sb.AppendLine().Append(Localization.DMA_is_supported); + + if(ATAID.Capabilities2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CapabilitiesBit2.MustBeSet) && + !ATAID.Capabilities2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CapabilitiesBit2.MustBeClear)) + { + if(ATAID.Capabilities2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CapabilitiesBit2. + SpecificStandbyTimer)) + sb.AppendLine().Append(Localization.Device_indicates_a_specific_minimum_standby_timer_value); + } + + if(ATAID.Capabilities3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CapabilitiesBit3.MultipleValid)) + { + sb.AppendLine(). + AppendFormat(Localization.A_maximum_of_0_sectors_can_be_transferred_per_interrupt_on_READ_WRITE_MULTIPLE, + ATAID.MultipleSectorNumber); + + sb.AppendLine(). + AppendFormat(Localization.Device_supports_setting_a_maximum_of_0_sectors, ATAID.MultipleMaxSectors); + } + + if(ATAID.Capabilities.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CapabilitiesBit.PhysicalAlignment1) || + ATAID.Capabilities.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CapabilitiesBit.PhysicalAlignment0)) + { + sb.AppendLine(). + AppendFormat(Localization.Long_Physical_Alignment_setting_is_0, (ushort)ATAID.Capabilities & 0x03); + } + + if(ata1) + { + if(ATAID.TrustedComputing.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TrustedComputingBit. + TrustedComputing)) + sb.AppendLine().Append(Localization.Device_supports_doubleword_IO); + } + + if(atapi) + { + if(ATAID.Capabilities.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CapabilitiesBit.InterleavedDMA)) + sb.AppendLine().Append(Localization.ATAPI_device_supports_interleaved_DMA); + + if(ATAID.Capabilities.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CapabilitiesBit.CommandQueue)) + sb.AppendLine().Append(Localization.ATAPI_device_supports_command_queueing); + + if(ATAID.Capabilities.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CapabilitiesBit.OverlapOperation)) + sb.AppendLine().Append(Localization.ATAPI_device_supports_overlapped_operations); + + if(ATAID.Capabilities.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CapabilitiesBit. + RequiresATASoftReset)) + sb.AppendLine().Append(Localization.ATAPI_device_requires_ATA_software_reset); + } + + if(minatalevel <= 3) + { + sb.AppendLine().AppendFormat(Localization.PIO_timing_mode_0, ATAID.PIOTransferTimingMode); + sb.AppendLine().AppendFormat(Localization.DMA_timing_mode_0, ATAID.DMATransferTimingMode); + } + + sb.AppendLine().Append(Localization.Advanced_PIO); + + if(ATAID.APIOSupported.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode0)) + sb.Append("PIO0 "); + + if(ATAID.APIOSupported.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode1)) + sb.Append("PIO1 "); + + if(ATAID.APIOSupported.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode2)) + sb.Append("PIO2 "); + + if(ATAID.APIOSupported.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode3)) + sb.Append("PIO3 "); + + if(ATAID.APIOSupported.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode4)) + sb.Append("PIO4 "); + + if(ATAID.APIOSupported.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode5)) + sb.Append("PIO5 "); + + if(ATAID.APIOSupported.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode6)) + sb.Append("PIO6 "); + + if(ATAID.APIOSupported.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode7)) + sb.Append("PIO7 "); + + if(minatalevel <= 3 && !atapi) + { + sb.AppendLine().Append(Localization.Single_word_DMA); + + if(ATAID.DMASupported.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode0)) + { + sb.Append("DMA0 "); + + if(ATAID.DMAActive.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode0)) + sb.Append(Localization._active_); + } + + if(ATAID.DMASupported.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode1)) + { + sb.Append("DMA1 "); + + if(ATAID.DMAActive.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode1)) + sb.Append(Localization._active_); + } + + if(ATAID.DMASupported.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode2)) + { + sb.Append("DMA2 "); + + if(ATAID.DMAActive.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode2)) + sb.Append(Localization._active_); + } + + if(ATAID.DMASupported.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode3)) + { + sb.Append("DMA3 "); + + if(ATAID.DMAActive.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode3)) + sb.Append(Localization._active_); + } + + if(ATAID.DMASupported.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode4)) + { + sb.Append("DMA4 "); + + if(ATAID.DMAActive.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode4)) + sb.Append(Localization._active_); + } + + if(ATAID.DMASupported.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode5)) + { + sb.Append("DMA5 "); + + if(ATAID.DMAActive.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode5)) + sb.Append(Localization._active_); + } + + if(ATAID.DMASupported.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode6)) + { + sb.Append("DMA6 "); + + if(ATAID.DMAActive.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode6)) + sb.Append(Localization._active_); + } + + if(ATAID.DMASupported.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode7)) + { + sb.Append("DMA7 "); + + if(ATAID.DMAActive.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode7)) + sb.Append(Localization._active_); + } + } + + sb.AppendLine().Append(Localization.Multi_word_DMA); + + if(ATAID.MDMASupported.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode0)) + { + sb.Append("MDMA0 "); + + if(ATAID.MDMAActive.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode0)) + sb.Append(Localization._active_); + } + + if(ATAID.MDMASupported.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode1)) + { + sb.Append("MDMA1 "); + + if(ATAID.MDMAActive.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode1)) + sb.Append(Localization._active_); + } + + if(ATAID.MDMASupported.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode2)) + { + sb.Append("MDMA2 "); + + if(ATAID.MDMAActive.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode2)) + sb.Append(Localization._active_); + } + + if(ATAID.MDMASupported.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode3)) + { + sb.Append("MDMA3 "); + + if(ATAID.MDMAActive.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode3)) + sb.Append(Localization._active_); + } + + if(ATAID.MDMASupported.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode4)) + { + sb.Append("MDMA4 "); + + if(ATAID.MDMAActive.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode4)) + sb.Append(Localization._active_); + } + + if(ATAID.MDMASupported.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode5)) + { + sb.Append("MDMA5 "); + + if(ATAID.MDMAActive.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode5)) + sb.Append(Localization._active_); + } + + if(ATAID.MDMASupported.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode6)) + { + sb.Append("MDMA6 "); + + if(ATAID.MDMAActive.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode6)) + sb.Append(Localization._active_); + } + + if(ATAID.MDMASupported.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode7)) + { + sb.Append("MDMA7 "); + + if(ATAID.MDMAActive.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode7)) + sb.Append(Localization._active_); + } + + sb.AppendLine().Append(Localization.Ultra_DMA); + + if(ATAID.UDMASupported.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode0)) + { + sb.Append("UDMA0 "); + + if(ATAID.UDMAActive.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode0)) + sb.Append(Localization._active_); + } + + if(ATAID.UDMASupported.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode1)) + { + sb.Append("UDMA1 "); + + if(ATAID.UDMAActive.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode1)) + sb.Append(Localization._active_); + } + + if(ATAID.UDMASupported.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode2)) + { + sb.Append("UDMA2 "); + + if(ATAID.UDMAActive.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode2)) + sb.Append(Localization._active_); + } + + if(ATAID.UDMASupported.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode3)) + { + sb.Append("UDMA3 "); + + if(ATAID.UDMAActive.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode3)) + sb.Append(Localization._active_); + } + + if(ATAID.UDMASupported.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode4)) + { + sb.Append("UDMA4 "); + + if(ATAID.UDMAActive.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode4)) + sb.Append(Localization._active_); + } + + if(ATAID.UDMASupported.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode5)) + { + sb.Append("UDMA5 "); + + if(ATAID.UDMAActive.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode5)) + sb.Append(Localization._active_); + } + + if(ATAID.UDMASupported.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode6)) + { + sb.Append("UDMA6 "); + + if(ATAID.UDMAActive.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode6)) + sb.Append(Localization._active_); + } + + if(ATAID.UDMASupported.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode7)) + { + sb.Append("UDMA7 "); + + if(ATAID.UDMAActive.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TransferMode.Mode7)) + sb.Append(Localization._active_); + } + + if(ATAID.MinMDMACycleTime != 0 && ATAID.RecMDMACycleTime != 0) + { + sb.AppendLine(). + AppendFormat(Localization.At_minimum_0_ns_transfer_cycle_time_per_word_in_MDMA_1_ns_recommended, + ATAID.MinMDMACycleTime, ATAID.RecMDMACycleTime); + } + + if(ATAID.MinPIOCycleTimeNoFlow != 0) + { + sb.AppendLine(). + AppendFormat(Localization.At_minimum_0_ns_transfer_cycle_time_per_word_in_PIO_without_flow_control, + ATAID.MinPIOCycleTimeNoFlow); + } + + if(ATAID.MinPIOCycleTimeFlow != 0) + { + sb.AppendLine(). + AppendFormat(Localization.At_minimum_0_ns_transfer_cycle_time_per_word_in_PIO_with_IORDY_flow_control, + ATAID.MinPIOCycleTimeFlow); + } + + if(ATAID.MaxQueueDepth != 0) + sb.AppendLine().AppendFormat(Localization._0_depth_of_queue_maximum, ATAID.MaxQueueDepth + 1); + + if(atapi) + { + if(ATAID.PacketBusRelease != 0) + { + sb.AppendLine(). + AppendFormat(Localization._0_ns_typical_to_release_bus_from_receipt_of_PACKET, + ATAID.PacketBusRelease); + } + + if(ATAID.ServiceBusyClear != 0) + { + sb.AppendLine(). + AppendFormat(Localization._0_ns_typical_to_clear_BSY_bit_from_receipt_of_SERVICE, + ATAID.ServiceBusyClear); + } + } + + if((ATAID.TransportMajorVersion & 0xF000) >> 12 == 0x1 || (ATAID.TransportMajorVersion & 0xF000) >> 12 == 0xE) + { + if(!ATAID.SATACapabilities.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SATACapabilitiesBit.Clear)) + { + if(ATAID.SATACapabilities.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SATACapabilitiesBit. + Gen1Speed)) + sb.AppendLine().Append(Localization.SATA_1_5Gbs_is_supported); + + if(ATAID.SATACapabilities.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SATACapabilitiesBit. + Gen2Speed)) + sb.AppendLine().Append(Localization.SATA_3_0Gbs_is_supported); + + if(ATAID.SATACapabilities.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SATACapabilitiesBit. + Gen3Speed)) + sb.AppendLine().Append(Localization.SATA_6_0Gbs_is_supported); + + if(ATAID.SATACapabilities.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SATACapabilitiesBit. + PowerReceipt)) + { + sb.AppendLine(). + Append(Localization.Receipt_of_host_initiated_power_management_requests_is_supported); + } + + if(ATAID.SATACapabilities.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SATACapabilitiesBit. + PHYEventCounter)) + sb.AppendLine().Append(Localization.PHY_Event_counters_are_supported); + + if(ATAID.SATACapabilities.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SATACapabilitiesBit. + HostSlumbTrans)) + { + sb.AppendLine(). + Append(Localization.Supports_host_automatic_partial_to_slumber_transitions_is_supported); + } + + if(ATAID.SATACapabilities.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SATACapabilitiesBit. + DevSlumbTrans)) + { + sb.AppendLine(). + Append(Localization.Supports_device_automatic_partial_to_slumber_transitions_is_supported); + } + + if(ATAID.SATACapabilities.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SATACapabilitiesBit.NCQ)) + { + sb.AppendLine().Append(Localization.NCQ_is_supported); + + if(ATAID.SATACapabilities.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SATACapabilitiesBit. + NCQPriority)) + sb.AppendLine().Append(Localization.NCQ_priority_is_supported); + + if(ATAID.SATACapabilities.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SATACapabilitiesBit. + UnloadNCQ)) + sb.AppendLine().Append(Localization.Unload_is_supported_with_outstanding_NCQ_commands); + } + } + + if(!ATAID.SATACapabilities2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SATACapabilitiesBit2.Clear)) + { + if(!ATAID.SATACapabilities.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SATACapabilitiesBit. + Clear) && + ATAID.SATACapabilities.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SATACapabilitiesBit.NCQ)) + { + if(ATAID.SATACapabilities2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SATACapabilitiesBit2. + NCQMgmt)) + sb.AppendLine().Append(Localization.NCQ_queue_management_is_supported); + + if(ATAID.SATACapabilities2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SATACapabilitiesBit2. + NCQStream)) + sb.AppendLine().Append(Localization.NCQ_streaming_is_supported); + } + + if(atapi) + { + if(ATAID.SATACapabilities2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SATACapabilitiesBit2. + HostEnvDetect)) + sb.AppendLine().Append(Localization.ATAPI_device_supports_host_environment_detection); + + if(ATAID.SATACapabilities2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SATACapabilitiesBit2. + DevAttSlimline)) + { + sb.AppendLine(). + Append(Localization.ATAPI_device_supports_attention_on_slimline_connected_devices); + } + } + + //sb.AppendFormat("Negotiated speed = {0}", ((ushort)ATAID.SATACapabilities2 & 0x000E) >> 1); + } + } + + if(ATAID.InterseekDelay != 0x0000 && ATAID.InterseekDelay != 0xFFFF) + { + sb.AppendLine(). + AppendFormat(Localization._0_microseconds_of_interseek_delay_for_ISO_7779_acoustic_testing, + ATAID.InterseekDelay); + } + + if((ushort)ATAID.DeviceFormFactor != 0x0000 && (ushort)ATAID.DeviceFormFactor != 0xFFFF) + { + switch(ATAID.DeviceFormFactor) + { + case CommonTypes.Structs.Devices.ATA.Identify.DeviceFormFactorEnum.FiveAndQuarter: + sb.AppendLine().Append(Localization.Device_nominal_size_is_5_25); + + break; + case CommonTypes.Structs.Devices.ATA.Identify.DeviceFormFactorEnum.ThreeAndHalf: + sb.AppendLine().Append(Localization.Device_nominal_size_is_3_5); + + break; + case CommonTypes.Structs.Devices.ATA.Identify.DeviceFormFactorEnum.TwoAndHalf: + sb.AppendLine().Append(Localization.Device_nominal_size_is_2_5); + + break; + case CommonTypes.Structs.Devices.ATA.Identify.DeviceFormFactorEnum.OnePointEight: + sb.AppendLine().Append(Localization.Device_nominal_size_is_1_8); + + break; + case CommonTypes.Structs.Devices.ATA.Identify.DeviceFormFactorEnum.LessThanOnePointEight: + sb.AppendLine().Append(Localization.Device_nominal_size_is_smaller_than_1_8); + + break; + default: + sb.AppendLine(). + AppendFormat(Localization.Device_nominal_size_field_value_0_is_unknown, ATAID.DeviceFormFactor); + + break; + } + } + + if(atapi) + { + if(ATAID.ATAPIByteCount > 0) + sb.AppendLine().AppendFormat(Localization._0_bytes_count_limit_for_ATAPI, ATAID.ATAPIByteCount); + } + + if(cfa) + { + if((ATAID.CFAPowerMode & 0x8000) == 0x8000) + { + sb.AppendLine().Append(Localization.CompactFlash_device_supports_power_mode_1); + + if((ATAID.CFAPowerMode & 0x2000) == 0x2000) + sb.AppendLine().Append(Localization.CompactFlash_power_mode_1_required_for_one_or_more_commands); + + if((ATAID.CFAPowerMode & 0x1000) == 0x1000) + sb.AppendLine().Append(Localization.CompactFlash_power_mode_1_is_disabled); + + sb.AppendLine(). + AppendFormat(Localization.CompactFlash_device_uses_a_maximum_of_0_mA, ATAID.CFAPowerMode & 0x0FFF); + } + } + + sb.AppendLine(); + + sb.AppendLine().Append(Localization.Command_set_and_features); + + if(ATAID.CommandSet.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit.Nop)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit.Nop) + ? Localization.NOP_is_supported_and_enabled + : Localization.NOP_is_supported); + } + + if(ATAID.CommandSet.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit.ReadBuffer)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit.ReadBuffer) + ? Localization.READ_BUFFER_is_supported_and_enabled + : Localization.READ_BUFFER_is_supported); + } + + if(ATAID.CommandSet.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit.WriteBuffer)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit. + WriteBuffer) + ? Localization.WRITE_BUFFER_is_supported_and_enabled + : Localization.WRITE_BUFFER_is_supported); + } + + if(ATAID.CommandSet.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit.HPA)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit.HPA) + ? Localization.Host_Protected_Area_is_supported_and_enabled + : Localization.Host_Protected_Area_is_supported); + } + + if(ATAID.CommandSet.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit.DeviceReset)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit. + DeviceReset) + ? Localization.DEVICE_RESET_is_supported_and_enabled + : Localization._); + } + + if(ATAID.CommandSet.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit.Service)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit.Service) + ? Localization.SERVICE_interrupt_is_supported_and_enabled + : Localization.SERVICE_interrupt_is_supported); + } + + if(ATAID.CommandSet.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit.Release)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit.Release) + ? Localization.Release_is_supported_and_enabled + : Localization.Release_is_supported); + } + + if(ATAID.CommandSet.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit.LookAhead)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit.LookAhead) + ? Localization.Look_ahead_read_is_supported_and_enabled + : Localization.Look_ahead_read_is_supported); + } + + if(ATAID.CommandSet.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit.WriteCache)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit.WriteCache) + ? Localization.Write_cache_is_supported_and_enabled + : Localization.Write_cache_is_supported); + } + + if(ATAID.CommandSet.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit.Packet)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit.Packet) + ? Localization.PACKET_is_supported_and_enabled + : Localization.PACKET_is_supported); + } + + if(ATAID.CommandSet.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit.PowerManagement)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit. + PowerManagement) + ? Localization.Power_management_is_supported_and_enabled + : Localization.Power_management_is_supported); + } + + if(ATAID.CommandSet.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit.RemovableMedia)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit. + RemovableMedia) + ? Localization.Removable_media_feature_set_is_supported_and_enabled + : Localization.Removable_media_feature_set_is_supported); + } + + if(ATAID.CommandSet.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit.SecurityMode)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit. + SecurityMode) + ? Localization.Security_mode_is_supported_and_enabled + : Localization.Security_mode_is_supported); + } + + if(ATAID.Capabilities.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CapabilitiesBit.LBASupport)) + sb.AppendLine().Append(Localization._28_bit_LBA_is_supported); + + if(ATAID.CommandSet2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit2.MustBeSet) && + !ATAID.CommandSet2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit2.MustBeClear)) + { + if(ATAID.CommandSet2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit2.LBA48)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit2. + LBA48) + ? Localization._48_bit_LBA_is_supported_and_enabled + : Localization._48_bit_LBA_is_supported); + } + + if(ATAID.CommandSet2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit2.FlushCache)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit2. + FlushCache) + ? Localization.FLUSH_CACHE_is_supported_and_enabled + : Localization.FLUSH_CACHE_is_supported); + } + + if(ATAID.CommandSet2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit2.FlushCacheExt)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit2. + FlushCacheExt) + ? Localization.FLUSH_CACHE_EXT_is_supported_and_enabled + : Localization.FLUSH_CACHE_EXT_is_supported); + } + + if(ATAID.CommandSet2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit2.DCO)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit2.DCO) + ? Localization.Device_Configuration_Overlay_feature_set_is_supported_and_enabled + : Localization.Device_Configuration_Overlay_feature_set_is_supported); + } + + if(ATAID.CommandSet2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit2.AAM)) + { + if(ATAID.EnabledCommandSet2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit2.AAM)) + { + sb.AppendLine(). + AppendFormat(Localization.Automatic_Acoustic_Management_is_supported_and_enabled_with_value_0_vendor_recommends_1, + ATAID.CurrentAAM, ATAID.RecommendedAAM); + } + else + sb.AppendLine().Append(Localization.Automatic_Acoustic_Management_is_supported); + } + + if(ATAID.CommandSet2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit2.SetMax)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit2. + SetMax) + ? Localization.SET_MAX_security_extension_is_supported_and_enabled + : Localization.SET_MAX_security_extension_is_supported); + } + + if(ATAID.CommandSet2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit2. + AddressOffsetReservedAreaBoot)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit2. + AddressOffsetReservedAreaBoot) + ? Localization.Address_Offset_Reserved_Area_Boot_is_supported_and_enabled + : Localization.Address_Offset_Reserved_Area_Boot_is_supported); + } + + if(ATAID.CommandSet2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit2.SetFeaturesRequired)) + sb.AppendLine().Append(Localization.SET_FEATURES_is_required_before_spin_up); + + if(ATAID.CommandSet2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit2.PowerUpInStandby)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit2. + PowerUpInStandby) + ? Localization.Power_up_in_standby_is_supported_and_enabled + : Localization.Power_up_in_standby_is_supported); + } + + if(ATAID.CommandSet2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit2.RemovableNotification)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit2. + RemovableNotification) + ? Localization.Removable_Media_Status_Notification_is_supported_and_enabled + : Localization.Removable_Media_Status_Notification_is_supported); + } + + if(ATAID.CommandSet2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit2.APM)) + { + if(ATAID.EnabledCommandSet2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit2.APM)) + { + sb.AppendLine(). + AppendFormat(Localization.Advanced_Power_Management_is_supported_and_enabled_with_value_0, + ATAID.CurrentAPM); + } + else + sb.AppendLine().Append(Localization.Advanced_Power_Management_is_supported); + } + + if(ATAID.CommandSet2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit2.CompactFlash)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit2. + CompactFlash) + ? Localization.CompactFlash_feature_set_is_supported_and_enabled + : Localization.CompactFlash_feature_set_is_supported); + } + + if(ATAID.CommandSet2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit2.RWQueuedDMA)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit2. + RWQueuedDMA) + ? Localization.READ_DMA_QUEUED_and_WRITE_DMA_QUEUED_are_supported_and_enabled + : Localization.READ_DMA_QUEUED_and_WRITE_DMA_QUEUED_are_supported); + } + + if(ATAID.CommandSet2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit2.DownloadMicrocode)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit2. + DownloadMicrocode) + ? Localization.DOWNLOAD_MICROCODE_is_supported_and_enabled + : Localization.DOWNLOAD_MICROCODE_is_supported); + } + } + + if(ATAID.CommandSet.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit.SMART)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit.SMART) + ? Localization.SMART_is_supported_and_enabled + : Localization.SMART_is_supported); + } + + if(ATAID.SCTCommandTransport.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SCTCommandTransportBit.Supported)) + sb.AppendLine().Append(Localization.SMART_Command_Transport_is_supported); + + if(ATAID.CommandSet3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit3.MustBeSet) && + !ATAID.CommandSet3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit3.MustBeClear)) + { + if(ATAID.CommandSet3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit3.SMARTSelfTest)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit3. + SMARTSelfTest) + ? Localization.SMART_self_testing_is_supported_and_enabled + : Localization.SMART_self_testing_is_supported); + } + + if(ATAID.CommandSet3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit3.SMARTLog)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit3. + SMARTLog) + ? Localization.SMART_error_logging_is_supported_and_enabled + : Localization.SMART_error_logging_is_supported); + } + + if(ATAID.CommandSet3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit3.IdleImmediate)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit3. + IdleImmediate) + ? Localization.IDLE_IMMEDIATE_with_UNLOAD_FEATURE_is_supported_and_enabled + : Localization.IDLE_IMMEDIATE_with_UNLOAD_FEATURE_is_supported); + } + + if(ATAID.CommandSet3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit3.WriteURG)) + sb.AppendLine().Append(Localization.URG_bit_is_supported_in_WRITE_STREAM_DMA_EXT_and_WRITE_STREAM_EXT); + + if(ATAID.CommandSet3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit3.ReadURG)) + sb.AppendLine().Append(Localization.URG_bit_is_supported_in_READ_STREAM_DMA_EXT_and_READ_STREAM_EXT); + + if(ATAID.CommandSet3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit3.WWN)) + sb.AppendLine().Append(Localization.Device_has_a_World_Wide_Name); + + if(ATAID.CommandSet3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit3.FUAWriteQ)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit3. + FUAWriteQ) + ? Localization.WRITE_DMA_QUEUED_FUA_EXT_is_supported_and_enabled + : Localization.WRITE_DMA_QUEUED_FUA_EXT_is_supported); + } + + if(ATAID.CommandSet3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit3.FUAWrite)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit3. + FUAWrite) + ? Localization.WRITE_DMA_FUA_EXT_and_WRITE_MULTIPLE_FUA_EXT_are_supported_and_enabled + : Localization.WRITE_DMA_FUA_EXT_and_WRITE_MULTIPLE_FUA_EXT_are_supported); + } + + if(ATAID.CommandSet3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit3.GPL)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit3.GPL) + ? Localization.General_Purpose_Logging_is_supported_and_enabled + : Localization.General_Purpose_Logging_is_supported); + } + + if(ATAID.CommandSet3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit3.Streaming)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit3. + Streaming) + ? Localization.Streaming_feature_set_is_supported_and_enabled + : Localization.Streaming_feature_set_is_supported); + } + + if(ATAID.CommandSet3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit3.MCPT)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit3.MCPT) + ? Localization.Media_Card_Pass_Through_command_set_is_supported_and_enabled + : Localization.Media_Card_Pass_Through_command_set_is_supported); + } + + if(ATAID.CommandSet3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit3.MediaSerial)) + { + if(ATAID.EnabledCommandSet3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit3. + MediaSerial)) + sb.AppendLine().Append(Localization.Media_Serial_is_supported_and_valid); + + sb.AppendLine().Append(Localization.Media_Serial_is_supported); + } + } + + if(ATAID.CommandSet4.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit4.MustBeSet) && + !ATAID.CommandSet4.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit4.MustBeClear)) + { + if(ATAID.CommandSet4.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit4.DSN)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet4.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit4.DSN) + ? Localization.DSN_feature_set_is_supported_and_enabled + : Localization.DSN_feature_set_is_supported); + } + + if(ATAID.CommandSet4.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit4.AMAC)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet4.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit4.AMAC) + ? Localization.Accessible_Max_Address_Configuration_is_supported_and_enabled + : Localization.Accessible_Max_Address_Configuration_is_supported); + } + + if(ATAID.CommandSet4.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit4.ExtPowerCond)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet4.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit4. + ExtPowerCond) + ? Localization.Extended_Power_Conditions_are_supported_and_enabled + : Localization.Extended_Power_Conditions_are_supported); + } + + if(ATAID.CommandSet4.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit4.ExtStatusReport)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet4.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit4. + ExtStatusReport) + ? Localization.Extended_Status_Reporting_is_supported_and_enabled + : Localization.Extended_Status_Reporting_is_supported); + } + + if(ATAID.CommandSet4.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit4.FreeFallControl)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet4.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit4. + FreeFallControl) + ? Localization.Free_fall_control_feature_set_is_supported_and_enabled + : Localization.Free_fall_control_feature_set_is_supported); + } + + if(ATAID.CommandSet4.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit4. + SegmentedDownloadMicrocode)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet4.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit4. + SegmentedDownloadMicrocode) + ? Localization.Segmented_feature_in_DOWNLOAD_MICROCODE_is_supported_and_enabled + : Localization.Segmented_feature_in_DOWNLOAD_MICROCODE_is_supported); + } + + if(ATAID.CommandSet4.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit4.RWDMAExtGpl)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet4.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit4. + RWDMAExtGpl) + ? Localization.READ_WRITE_DMA_EXT_GPL_are_supported_and_enabled + : Localization.READ_WRITE_DMA_EXT_GPL_are_supported); + } + + if(ATAID.CommandSet4.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit4.WriteUnc)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet4.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit4. + WriteUnc) + ? Localization.WRITE_UNCORRECTABLE_is_supported_and_enabled + : Localization.WRITE_UNCORRECTABLE_is_supported); + } + + if(ATAID.CommandSet4.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit4.WRV)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet4.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit4.WRV) + ? Localization.Write_Read_Verify_is_supported_and_enabled + : Localization.Write_Read_Verify_is_supported); + + sb.AppendLine(). + AppendFormat(Localization._0_sectors_for_Write_Read_Verify_mode_two, ATAID.WRVSectorCountMode2); + + sb.AppendLine(). + AppendFormat(Localization._0_sectors_for_Write_Read_Verify_mode_three, ATAID.WRVSectorCountMode3); + + if(ATAID.EnabledCommandSet4.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit4.WRV)) + sb.AppendLine().AppendFormat(Localization.Current_Write_Read_Verify_mode_0, ATAID.WRVMode); + } + + if(ATAID.CommandSet4.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit4.DT1825)) + { + sb.AppendLine(). + Append(ATAID.EnabledCommandSet4.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit4. + DT1825) + ? Localization.DT1825_is_supported_and_enabled + : Localization.DT1825_is_supported); + } + } + + if(ATAID.Capabilities3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CapabilitiesBit3.BlockErase)) + sb.AppendLine().Append(Localization.BLOCK_ERASE_EXT_is_supported); + + if(ATAID.Capabilities3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CapabilitiesBit3.Overwrite)) + sb.AppendLine().Append(Localization.OVERWRITE_EXT_is_supported); + + if(ATAID.Capabilities3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CapabilitiesBit3.CryptoScramble)) + sb.AppendLine().Append(Localization.CRYPTO_SCRAMBLE_EXT_is_supported); + + if(ATAID.CommandSet5.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit5.DeviceConfDMA)) + { + sb.AppendLine(). + Append(Localization.DEVICE_CONFIGURATION_IDENTIFY_DMA_and_DEVICE_CONFIGURATION_SET_DMA_are_supported); + } + + if(ATAID.CommandSet5.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit5.ReadBufferDMA)) + sb.AppendLine().Append(Localization.READ_BUFFER_DMA_is_supported); + + if(ATAID.CommandSet5.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit5.WriteBufferDMA)) + sb.AppendLine().Append(Localization.WRITE_BUFFER_DMA_is_supported); + + if(ATAID.CommandSet5.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit5.DownloadMicroCodeDMA)) + sb.AppendLine().Append(Localization.DOWNLOAD_MICROCODE_DMA_is_supported); + + if(ATAID.CommandSet5.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit5.SetMaxDMA)) + sb.AppendLine().Append(Localization.SET_PASSWORD_DMA_and_SET_UNLOCK_DMA_are_supported); + + if(ATAID.CommandSet5.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit5.Ata28)) + sb.AppendLine().Append(Localization.Not_all_28_bit_commands_are_supported); + + if(ATAID.CommandSet5.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit5.CFast)) + sb.AppendLine().Append(Localization.Device_follows_CFast_specification); + + if(ATAID.CommandSet5.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit5.IEEE1667)) + sb.AppendLine().Append(Localization.Device_follows_IEEE_1667); + + if(ATAID.CommandSet5.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit5.DeterministicTrim)) + { + sb.AppendLine().Append(Localization.Read_after_TRIM_is_deterministic); + + if(ATAID.CommandSet5.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit5.ReadZeroTrim)) + sb.AppendLine().Append(Localization.Read_after_TRIM_returns_empty_data); + } + + if(ATAID.CommandSet5.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit5.LongPhysSectorAligError)) + sb.AppendLine().Append(Localization.Device_supports_Long_Physical_Sector_Alignment_Error_Reporting_Control); + + if(ATAID.CommandSet5.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit5.Encrypted)) + sb.AppendLine().Append(Localization.Device_encrypts_all_user_data); + + if(ATAID.CommandSet5.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit5.AllCacheNV)) + sb.AppendLine().Append(Localization.Device_s_write_cache_is_non_volatile); + + if(ATAID.CommandSet5.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit5.ZonedBit0) || + ATAID.CommandSet5.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit5.ZonedBit1)) + sb.AppendLine().Append(Localization.Device_is_zoned); + + if(ATAID.Capabilities3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CapabilitiesBit3.Sanitize)) + { + sb.AppendLine().Append(Localization.Sanitize_feature_set_is_supported); + + sb.AppendLine(). + Append(ATAID.Capabilities3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CapabilitiesBit3. + SanitizeCommands) + ? Localization.Sanitize_commands_are_specified_by_ACS_3_or_higher + : Localization.Sanitize_commands_are_specified_by_ACS_2); + + if(ATAID.Capabilities3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CapabilitiesBit3. + SanitizeAntifreeze)) + sb.AppendLine().Append(Localization.SANITIZE_ANTIFREEZE_LOCK_EXT_is_supported); + } + + if(!ata1 && maxatalevel >= 8) + { + if(ATAID.TrustedComputing.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TrustedComputingBit.Set) && + !ATAID.TrustedComputing.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TrustedComputingBit.Clear) && + ATAID.TrustedComputing.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.TrustedComputingBit. + TrustedComputing)) + sb.AppendLine().Append(Localization.Trusted_Computing_feature_set_is_supported); + } + + if((ATAID.TransportMajorVersion & 0xF000) >> 12 == 0x1 || (ATAID.TransportMajorVersion & 0xF000) >> 12 == 0xE) + { + if(!ATAID.SATACapabilities.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SATACapabilitiesBit.Clear)) + { + if(ATAID.SATACapabilities.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SATACapabilitiesBit. + ReadLogDMAExt)) + sb.AppendLine().Append(Localization.READ_LOG_DMA_EXT_is_supported); + } + + if(!ATAID.SATACapabilities2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SATACapabilitiesBit2.Clear)) + { + if(ATAID.SATACapabilities2.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SATACapabilitiesBit2. + FPDMAQ)) + sb.AppendLine().Append(Localization.RECEIVE_FPDMA_QUEUED_and_SEND_FPDMA_QUEUED_are_supported); + } + + if(!ATAID.SATAFeatures.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SATAFeaturesBit.Clear)) + { + if(ATAID.SATAFeatures.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SATAFeaturesBit. + NonZeroBufferOffset)) + { + sb.AppendLine(). + Append(ATAID.EnabledSATAFeatures.HasFlag(CommonTypes.Structs.Devices.ATA.Identify. + SATAFeaturesBit.NonZeroBufferOffset) + ? Localization.Non_zero_buffer_offsets_are_supported_and_enabled + : Localization.Non_zero_buffer_offsets_are_supported); + } + + if(ATAID.SATAFeatures.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SATAFeaturesBit.DMASetup)) + { + sb.AppendLine(). + Append(ATAID.EnabledSATAFeatures.HasFlag(CommonTypes.Structs.Devices.ATA.Identify. + SATAFeaturesBit.DMASetup) + ? Localization.DMA_Setup_auto_activation_is_supported_and_enabled + : Localization.DMA_Setup_auto_activation_is_supported); + } + + if(ATAID.SATAFeatures.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SATAFeaturesBit.InitPowerMgmt)) + { + sb.AppendLine(). + Append(ATAID.EnabledSATAFeatures.HasFlag(CommonTypes.Structs.Devices.ATA.Identify. + SATAFeaturesBit.InitPowerMgmt) + ? Localization.Device_initiated_power_management_is_supported_and_enabled + : Localization.Device_initiated_power_management_is_supported); + } + + if(ATAID.SATAFeatures.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SATAFeaturesBit.InOrderData)) + { + sb.AppendLine(). + Append(ATAID.EnabledSATAFeatures.HasFlag(CommonTypes.Structs.Devices.ATA.Identify. + SATAFeaturesBit.InOrderData) + ? Localization.In_order_data_delivery_is_supported_and_enabled + : Localization.In_order_data_delivery_is_supported); + } + + switch(atapi) + { + case false: + { + if(ATAID.SATAFeatures.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SATAFeaturesBit. + HardwareFeatureControl)) + { + sb.AppendLine(). + Append(ATAID.EnabledSATAFeatures.HasFlag(CommonTypes.Structs.Devices.ATA.Identify. + SATAFeaturesBit.HardwareFeatureControl) + ? Localization.Hardware_Feature_Control_is_supported_and_enabled + : Localization.Hardware_Feature_Control_is_supported); + } + + break; + } + case true: + { + if(ATAID.SATAFeatures.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SATAFeaturesBit. + AsyncNotification)) + { + sb.AppendLine(). + Append(ATAID.EnabledSATAFeatures.HasFlag(CommonTypes.Structs.Devices.ATA.Identify. + SATAFeaturesBit.AsyncNotification) + ? Localization.Asynchronous_notification_is_supported_and_enabled + : Localization.Asynchronous_notification_is_supported); + } + + break; + } + } + + if(ATAID.SATAFeatures.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SATAFeaturesBit. + SettingsPreserve)) + { + sb.AppendLine(). + Append(ATAID.EnabledSATAFeatures.HasFlag(CommonTypes.Structs.Devices.ATA.Identify. + SATAFeaturesBit.SettingsPreserve) + ? Localization.Software_Settings_Preservation_is_supported_and_enabled + : Localization.Software_Settings_Preservation_is_supported); + } + + if(ATAID.SATAFeatures.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SATAFeaturesBit.NCQAutoSense)) + sb.AppendLine().Append(Localization.NCQ_Autosense_is_supported); + + if(ATAID.EnabledSATAFeatures.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SATAFeaturesBit. + EnabledSlumber)) + sb.AppendLine().Append(Localization.Automatic_Partial_to_Slumber_transitions_are_enabled); + } + } + + if((ATAID.RemovableStatusSet & 0x03) > 0) + sb.AppendLine().Append(Localization.Removable_Media_Status_Notification_feature_set_is_supported); + + if(ATAID.FreeFallSensitivity != 0x00 && ATAID.FreeFallSensitivity != 0xFF) + sb.AppendLine().AppendFormat(Localization.Free_fall_sensitivity_set_to_0, ATAID.FreeFallSensitivity); + + if(ATAID.DataSetMgmt.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.DataSetMgmtBit.Trim)) + sb.AppendLine().Append("TRIM is supported"); + + if(ATAID.DataSetMgmtSize > 0) + { + sb.AppendLine(). + AppendFormat(Localization.DATA_SET_MANAGEMENT_can_receive_a_maximum_of_0_blocks_of_512_bytes, + ATAID.DataSetMgmtSize); + } + + sb.AppendLine().AppendLine(); + + if(ATAID.SecurityStatus.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SecurityStatusBit.Supported)) + { + sb.AppendLine(Localization.Security); + + if(ATAID.SecurityStatus.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SecurityStatusBit.Enabled)) + { + sb.AppendLine(Localization.Security_is_enabled); + + sb.AppendLine(ATAID.SecurityStatus.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SecurityStatusBit. + Locked) + ? Localization.Security_is_locked + : Localization.Security_is_not_locked); + + sb.AppendLine(ATAID.SecurityStatus.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SecurityStatusBit. + Frozen) + ? Localization.Security_is_frozen + : Localization.Security_is_not_frozen); + + sb.AppendLine(ATAID.SecurityStatus.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SecurityStatusBit. + Expired) + ? Localization.Security_count_has_expired + : Localization.Security_count_has_not_expired); + + sb.AppendLine(ATAID.SecurityStatus.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SecurityStatusBit. + Maximum) + ? Localization.Security_level_is_maximum + : Localization.Security_level_is_high); + } + else + sb.AppendLine(Localization.Security_is_not_enabled); + + if(ATAID.SecurityStatus.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SecurityStatusBit.Enhanced)) + sb.AppendLine(Localization.Supports_enhanced_security_erase); + + sb.AppendFormat(Localization._0_minutes_to_complete_secure_erase, ATAID.SecurityEraseTime * 2).AppendLine(); + + if(ATAID.SecurityStatus.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SecurityStatusBit.Enhanced)) + { + sb.AppendFormat(Localization._0_minutes_to_complete_enhanced_secure_erase, + ATAID.EnhancedSecurityEraseTime * 2). + AppendLine(); + } + + sb.AppendFormat(Localization.Master_password_revision_code_0, ATAID.MasterPasswordRevisionCode). + AppendLine(); + } + + if(ATAID.CommandSet3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit3.MustBeSet) && + !ATAID.CommandSet3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit3.MustBeClear) && + ATAID.CommandSet3.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.CommandSetBit3.Streaming)) + { + sb.AppendLine().AppendLine(Localization.Streaming); + sb.AppendFormat(Localization.Minimum_request_size_is_0, ATAID.StreamMinReqSize); + sb.AppendFormat(Localization.Streaming_transfer_time_in_PIO_is_0, ATAID.StreamTransferTimePIO); + sb.AppendFormat(Localization.Streaming_transfer_time_in_DMA_is_0, ATAID.StreamTransferTimeDMA); + sb.AppendFormat(Localization.Streaming_access_latency_is_0, ATAID.StreamAccessLatency); + sb.AppendFormat(Localization.Streaming_performance_granularity_is_0, ATAID.StreamPerformanceGranularity); + } + + if(ATAID.SCTCommandTransport.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SCTCommandTransportBit.Supported)) + { + sb.AppendLine().AppendLine(Localization.SMART_Command_Transport_SCT); + + if(ATAID.SCTCommandTransport.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SCTCommandTransportBit. + LongSectorAccess)) + sb.AppendLine(Localization.SCT_Long_Sector_Address_is_supported); + + if(ATAID.SCTCommandTransport.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SCTCommandTransportBit. + WriteSame)) + sb.AppendLine(Localization.SCT_Write_Same_is_supported); + + if(ATAID.SCTCommandTransport.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SCTCommandTransportBit. + ErrorRecoveryControl)) + sb.AppendLine(Localization.SCT_Error_Recovery_Control_is_supported); + + if(ATAID.SCTCommandTransport.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SCTCommandTransportBit. + FeaturesControl)) + sb.AppendLine(Localization.SCT_Features_Control_is_supported); + + if(ATAID.SCTCommandTransport.HasFlag(CommonTypes.Structs.Devices.ATA.Identify.SCTCommandTransportBit. + DataTables)) + sb.AppendLine(Localization.SCT_Data_Tables_are_supported); + } + + if((ATAID.NVCacheCaps & 0x0010) == 0x0010) + { + sb.AppendLine().AppendLine(Localization.Non_Volatile_Cache); + sb.AppendLine().AppendFormat(Localization.Version_0, (ATAID.NVCacheCaps & 0xF000) >> 12).AppendLine(); + + if((ATAID.NVCacheCaps & 0x0001) == 0x0001) + { + sb.Append((ATAID.NVCacheCaps & 0x0002) == 0x0002 + ? Localization.Power_mode_feature_set_is_supported_and_enabled + : Localization.Power_mode_feature_set_is_supported); + + sb.AppendLine(); + + sb.AppendLine().AppendFormat(Localization.Version_0, (ATAID.NVCacheCaps & 0x0F00) >> 8).AppendLine(); + } + + sb.AppendLine(). + AppendFormat(Localization.Non_Volatile_Cache_is_0_bytes, ATAID.NVCacheSize * logicalSectorSize). + AppendLine(); + } + + #if DEBUG + sb.AppendLine(); + + if(ATAID.VendorWord9 != 0x0000 && ATAID.VendorWord9 != 0xFFFF) + sb.AppendFormat(Localization.Word_nine_0, ATAID.VendorWord9).AppendLine(); + + if((ATAID.VendorWord47 & 0x7F) != 0x7F && (ATAID.VendorWord47 & 0x7F) != 0x00) + sb.AppendFormat(Localization.Word_47_bits_15_to_8_0, ATAID.VendorWord47).AppendLine(); + + if(ATAID.VendorWord51 != 0x00 && ATAID.VendorWord51 != 0xFF) + sb.AppendFormat(Localization.Word_51_bits_7_to_0_0, ATAID.VendorWord51).AppendLine(); + + if(ATAID.VendorWord52 != 0x00 && ATAID.VendorWord52 != 0xFF) + sb.AppendFormat(Localization.Word_52_bits_7_to_0_0, ATAID.VendorWord52).AppendLine(); + + if(ATAID.ReservedWord64 != 0x00 && ATAID.ReservedWord64 != 0xFF) + sb.AppendFormat(Localization.Word_64_bits_15_to_8_0, ATAID.ReservedWord64).AppendLine(); + + if(ATAID.ReservedWord70 != 0x0000 && ATAID.ReservedWord70 != 0xFFFF) + sb.AppendFormat(Localization.Word_70_0, ATAID.ReservedWord70).AppendLine(); + + if(ATAID.ReservedWord73 != 0x0000 && ATAID.ReservedWord73 != 0xFFFF) + sb.AppendFormat(Localization.Word_73_0, ATAID.ReservedWord73).AppendLine(); + + if(ATAID.ReservedWord74 != 0x0000 && ATAID.ReservedWord74 != 0xFFFF) + sb.AppendFormat(Localization.Word_74_0, ATAID.ReservedWord74).AppendLine(); + + if(ATAID.ReservedWord116 != 0x0000 && ATAID.ReservedWord116 != 0xFFFF) + sb.AppendFormat(Localization.Word_116_0, ATAID.ReservedWord116).AppendLine(); + + for(var i = 0; i < ATAID.ReservedWords121.Length; i++) + { + if(ATAID.ReservedWords121[i] != 0x0000 && ATAID.ReservedWords121[i] != 0xFFFF) + sb.AppendFormat(Localization.Word_1_0, ATAID.ReservedWords121[i], 121 + i).AppendLine(); + } + + for(var i = 0; i < ATAID.ReservedWords129.Length; i++) + { + if(ATAID.ReservedWords129[i] != 0x0000 && ATAID.ReservedWords129[i] != 0xFFFF) + sb.AppendFormat(Localization.Word_1_0, ATAID.ReservedWords129[i], 129 + i).AppendLine(); + } + + for(var i = 0; i < ATAID.ReservedCFA.Length; i++) + { + if(ATAID.ReservedCFA[i] != 0x0000 && ATAID.ReservedCFA[i] != 0xFFFF) + sb.AppendFormat(Localization.Word_1_CFA_0, ATAID.ReservedCFA[i], 161 + i).AppendLine(); + } + + if(ATAID.ReservedWord174 != 0x0000 && ATAID.ReservedWord174 != 0xFFFF) + sb.AppendFormat(Localization.Word_174_0, ATAID.ReservedWord174).AppendLine(); + + if(ATAID.ReservedWord175 != 0x0000 && ATAID.ReservedWord175 != 0xFFFF) + sb.AppendFormat(Localization.Word_175_0, ATAID.ReservedWord175).AppendLine(); + + if(ATAID.ReservedCEATAWord207 != 0x0000 && ATAID.ReservedCEATAWord207 != 0xFFFF) + sb.AppendFormat(Localization.Word_207_CE_ATA_0, ATAID.ReservedCEATAWord207).AppendLine(); + + if(ATAID.ReservedCEATAWord208 != 0x0000 && ATAID.ReservedCEATAWord208 != 0xFFFF) + sb.AppendFormat(Localization.Word_208_CE_ATA_0, ATAID.ReservedCEATAWord208).AppendLine(); + + if(ATAID.NVReserved != 0x00 && ATAID.NVReserved != 0xFF) + sb.AppendFormat(Localization.Word_219_bits_15_to_8_0, ATAID.NVReserved).AppendLine(); + + if(ATAID.WRVReserved != 0x00 && ATAID.WRVReserved != 0xFF) + sb.AppendFormat(Localization.Word_220_bits_15_to_8_0, ATAID.WRVReserved).AppendLine(); + + if(ATAID.ReservedWord221 != 0x0000 && ATAID.ReservedWord221 != 0xFFFF) + sb.AppendFormat(Localization.Word_221_0, ATAID.ReservedWord221).AppendLine(); + + for(var i = 0; i < ATAID.ReservedCEATA224.Length; i++) + { + if(ATAID.ReservedCEATA224[i] != 0x0000 && ATAID.ReservedCEATA224[i] != 0xFFFF) + sb.AppendFormat(Localization.Word_1_CE_ATA_0, ATAID.ReservedCEATA224[i], 224 + i).AppendLine(); + } + + for(var i = 0; i < ATAID.ReservedWords.Length; i++) + { + if(ATAID.ReservedWords[i] != 0x0000 && ATAID.ReservedWords[i] != 0xFFFF) + sb.AppendFormat(Localization.Word_1_0, ATAID.ReservedWords[i], 236 + i).AppendLine(); + } + #endif + return sb.ToString(); + } +} \ No newline at end of file diff --git a/Aaru.Decoders/ATA/Registers.cs b/Aaru.Decoders/ATA/Registers.cs new file mode 100644 index 000000000..3042bfc82 --- /dev/null +++ b/Aaru.Decoders/ATA/Registers.cs @@ -0,0 +1,113 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : Errors.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes ATA error registers. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Runtime.InteropServices; + +namespace Aaru.Decoders.ATA; + +[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] +public struct AtaRegistersChs +{ + public byte Feature; + public byte SectorCount; + public byte Sector; + public byte CylinderLow; + public byte CylinderHigh; + public byte DeviceHead; + public byte Command; +} + +[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] +public struct AtaRegistersLba28 +{ + public byte Feature; + public byte SectorCount; + public byte LbaLow; + public byte LbaMid; + public byte LbaHigh; + public byte DeviceHead; + public byte Command; +} + +[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] +public struct AtaRegistersLba48 +{ + public ushort Feature; + public ushort SectorCount; + public byte LbaLowPrevious; + public byte LbaLowCurrent; + public byte LbaMidPrevious; + public byte LbaMidCurrent; + public byte LbaHighPrevious; + public byte LbaHighCurrent; + public byte DeviceHead; + public byte Command; +} + +[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] +public struct AtaErrorRegistersChs +{ + public byte Status; + public byte Error; + public byte SectorCount; + public byte Sector; + public byte CylinderLow; + public byte CylinderHigh; + public byte DeviceHead; +} + +[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] +public struct AtaErrorRegistersLba28 +{ + public byte Status; + public byte Error; + public byte SectorCount; + public byte LbaLow; + public byte LbaMid; + public byte LbaHigh; + public byte DeviceHead; +} + +[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] +public struct AtaErrorRegistersLba48 +{ + public byte Status; + public byte Error; + public ushort SectorCount; + public byte LbaLowPrevious; + public byte LbaLowCurrent; + public byte LbaMidPrevious; + public byte LbaMidCurrent; + public byte LbaHighPrevious; + public byte LbaHighCurrent; + public byte DeviceHead; +} \ No newline at end of file diff --git a/Aaru.Decoders/Aaru.Decoders.csproj b/Aaru.Decoders/Aaru.Decoders.csproj new file mode 100644 index 000000000..a458d2994 --- /dev/null +++ b/Aaru.Decoders/Aaru.Decoders.csproj @@ -0,0 +1,77 @@ + + + + 2.0 + {0BEB3088-B634-4289-AE17-CDF2D25D00D5} + Library + Aaru.Decoders + Aaru.Decoders + $(Version) + true + 6.0.0-alpha9 + Claunia.com + Copyright © 2011-2023 Natalia Portillo + Aaru Data Preservation Suite + Aaru.Decoders + $(Version) + net8.0 + 12 + Binary structure decoders used by the Aaru Data Preservation Suite. + https://github.com/aaru-dps/ + LGPL-2.1-only + https://github.com/aaru-dps/Aaru + true + en-US + true + true + snupkg + Natalia Portillo <claunia@claunia.com> + true + true + + + CS1591;CS1574 + + + + + + + $(Version)+{chash:8} + true + true + + + + + + + + + + + + + + + + + + + + + + + + LICENSE.LGPL + + + ResXFileCodeGenerator + Localization.Designer.cs + + + + + + + \ No newline at end of file diff --git a/Aaru.Decoders/Aaru.Decoders.csproj.DotSettings b/Aaru.Decoders/Aaru.Decoders.csproj.DotSettings new file mode 100644 index 000000000..79d039579 --- /dev/null +++ b/Aaru.Decoders/Aaru.Decoders.csproj.DotSettings @@ -0,0 +1,6 @@ + + True + True \ No newline at end of file diff --git a/Aaru.Decoders/Bluray/BCA.cs b/Aaru.Decoders/Bluray/BCA.cs new file mode 100644 index 000000000..a27a9e895 --- /dev/null +++ b/Aaru.Decoders/Bluray/BCA.cs @@ -0,0 +1,136 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : BCA.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes Blu-ray Burst Cutting Area. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Text; +using Aaru.Console; +using Aaru.Helpers; + +namespace Aaru.Decoders.Bluray; + +// Information from the following standards: +// ANSI X3.304-1997 +// T10/1048-D revision 9.0 +// T10/1048-D revision 10a +// T10/1228-D revision 7.0c +// T10/1228-D revision 11a +// T10/1363-D revision 10g +// T10/1545-D revision 1d +// T10/1545-D revision 5 +// T10/1545-D revision 5a +// T10/1675-D revision 2c +// T10/1675-D revision 4 +// T10/1836-D revision 2g +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +public static class BCA +{ + const string MODULE_NAME = "BD BCA decoder"; + +#region Nested type: BurstCuttingArea + +#region Public structures + + public struct BurstCuttingArea + { + /// Bytes 0 to 1 Always 66 + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Byte 4 to 67 BCA data + public byte[] BCA; + } + +#endregion Public structures + +#endregion + +#region Public methods + + public static BurstCuttingArea? Decode(byte[] BCAResponse) + { + if(BCAResponse == null) + return null; + + if(BCAResponse.Length != 68) + { + AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Found_incorrect_Blu_ray_BCA_size_0_bytes, + BCAResponse.Length); + + return null; + } + + var decoded = new BurstCuttingArea + { + DataLength = BigEndianBitConverter.ToUInt16(BCAResponse, 0), + Reserved1 = BCAResponse[2], + Reserved2 = BCAResponse[3], + BCA = new byte[64] + }; + + Array.Copy(BCAResponse, 4, decoded.BCA, 0, 64); + + return decoded; + } + + public static string Prettify(BurstCuttingArea? BCAResponse) + { + if(BCAResponse == null) + return null; + + BurstCuttingArea response = BCAResponse.Value; + + var sb = new StringBuilder(); + + #if DEBUG + if(response.Reserved1 != 0) + sb.AppendFormat(Localization.Reserved1_equals_0_X8, response.Reserved1).AppendLine(); + + if(response.Reserved2 != 0) + sb.AppendFormat(Localization.Reserved2_equals_0_X8, response.Reserved2).AppendLine(); + #endif + + sb.AppendFormat(Localization.Blu_ray_Burst_Cutting_Area_in_hex_follows); + sb.AppendLine(PrintHex.ByteArrayToHexArrayString(response.BCA, 80)); + + return sb.ToString(); + } + + public static string Prettify(byte[] BCAResponse) => Prettify(Decode(BCAResponse)); + +#endregion Public methods +} \ No newline at end of file diff --git a/Aaru.Decoders/Bluray/Cartridge.cs b/Aaru.Decoders/Bluray/Cartridge.cs new file mode 100644 index 000000000..6aaf80580 --- /dev/null +++ b/Aaru.Decoders/Bluray/Cartridge.cs @@ -0,0 +1,191 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : Cartridge.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes Blu-ray cartridge structures. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Text; +using Aaru.Console; +using Aaru.Helpers; + +namespace Aaru.Decoders.Bluray; + +// Information from the following standards: +// ANSI X3.304-1997 +// T10/1048-D revision 9.0 +// T10/1048-D revision 10a +// T10/1228-D revision 7.0c +// T10/1228-D revision 11a +// T10/1363-D revision 10g +// T10/1545-D revision 1d +// T10/1545-D revision 5 +// T10/1545-D revision 5a +// T10/1675-D revision 2c +// T10/1675-D revision 4 +// T10/1836-D revision 2g +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +[SuppressMessage("ReSharper", "UnassignedField.Global")] +public static class Cartridge +{ + const string MODULE_NAME = "BD Cartridge Status decoder"; + +#region Nested type: CartridgeStatus + +#region Public structures + + public struct CartridgeStatus + { + /// Bytes 0 to 1 Always 6 + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Byte 4, bit 7 Medium is inserted in a cartridge + public bool Cartridge; + /// Byte 4, bit 6 Medium taken out / put in a cartridge + public bool OUT; + /// Byte 4, bits 5 to 3 Reserved + public byte Reserved3; + /// Byte 4, bit 2 Cartridge sets write protection + public bool CWP; + /// Byte 4, bits 1 to 0 Reserved + public byte Reserved4; + /// Byte 5 Reserved + public byte Reserved5; + /// Byte 6 Reserved + public byte Reserved6; + /// Byte 7 Reserved + public byte Reserved7; + } + +#endregion Public structures + +#endregion + +#region Public methods + + public static CartridgeStatus? Decode(byte[] CSResponse) + { + if(CSResponse == null) + return null; + + if(CSResponse.Length != 8) + { + AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Found_incorrect_Blu_ray_Cartridge_Status_size_0_bytes, + CSResponse.Length); + + return null; + } + + var decoded = new CartridgeStatus + { + DataLength = BigEndianBitConverter.ToUInt16(CSResponse, 0), + Reserved1 = CSResponse[2], + Reserved2 = CSResponse[3], + Cartridge = Convert.ToBoolean(CSResponse[4] & 0x80), + OUT = Convert.ToBoolean(CSResponse[4] & 0x40), + Reserved3 = (byte)((CSResponse[4] & 0x38) >> 3), + CWP = Convert.ToBoolean(CSResponse[4] & 0x04), + Reserved4 = (byte)(CSResponse[4] & 0x03), + Reserved5 = CSResponse[5], + Reserved6 = CSResponse[6], + Reserved7 = CSResponse[7] + }; + + return decoded; + } + + public static string Prettify(CartridgeStatus? CSResponse) + { + if(CSResponse == null) + return null; + + CartridgeStatus response = CSResponse.Value; + + var sb = new StringBuilder(); + + #if DEBUG + if(response.Reserved1 != 0) + sb.AppendFormat(Localization.Reserved1_equals_0_X8, response.Reserved1).AppendLine(); + + if(response.Reserved2 != 0) + sb.AppendFormat(Localization.Reserved2_equals_0_X8, response.Reserved2).AppendLine(); + + if(response.Reserved3 != 0) + sb.AppendFormat(Localization.Reserved3_equals_0_X8, response.Reserved3).AppendLine(); + + if(response.Reserved4 != 0) + sb.AppendFormat(Localization.Reserved4_equals_0_X8, response.Reserved4).AppendLine(); + + if(response.Reserved5 != 0) + sb.AppendFormat(Localization.Reserved5_equals_0_X8, response.Reserved5).AppendLine(); + + if(response.Reserved6 != 0) + sb.AppendFormat(Localization.Reserved6_equals_0_X8, response.Reserved6).AppendLine(); + + if(response.Reserved7 != 0) + sb.AppendFormat(Localization.Reserved7_equals_0_X8, response.Reserved7).AppendLine(); + #endif + + if(response.Cartridge) + { + sb.AppendLine(Localization.Media_is_inserted_in_a_cartridge); + + if(response.OUT) + sb.AppendLine(Localization.Media_has_been_taken_out_or_inserted_in_the_cartridge); + + if(response.CWP) + sb.AppendLine(Localization.Media_is_write_protected); + } + else + { + sb.AppendLine(Localization.Media_is_not_in_a_cartridge); + + #if DEBUG + if(response.OUT) + sb.AppendLine(Localization.Media_has_out_bit_marked_shouldnt); + + if(response.CWP) + sb.AppendLine(Localization.Media_has_write_protection_bit_marked_shouldnt); + #endif + } + + return sb.ToString(); + } + + public static string Prettify(byte[] CSResponse) => Prettify(Decode(CSResponse)); + +#endregion Public methods +} \ No newline at end of file diff --git a/Aaru.Decoders/Bluray/DDS.cs b/Aaru.Decoders/Bluray/DDS.cs new file mode 100644 index 000000000..dc9346279 --- /dev/null +++ b/Aaru.Decoders/Bluray/DDS.cs @@ -0,0 +1,240 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : DDS.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes Blu-ray Disc Definition Structure. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Text; +using Aaru.Console; +using Aaru.Helpers; + +namespace Aaru.Decoders.Bluray; + +/// Information from the following standards: +/// ANSI X3.304-1997 +/// T10/1048-D revision 9.0 +/// T10/1048-D revision 10a +/// T10/1228-D revision 7.0c +/// T10/1228-D revision 11a +/// T10/1363-D revision 10g +/// T10/1545-D revision 1d +/// T10/1545-D revision 5 +/// T10/1545-D revision 5a +/// T10/1675-D revision 2c +/// T10/1675-D revision 4 +/// T10/1836-D revision 2g +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +public static class DDS +{ +#region Nested type: DiscDefinitionStructure + +#region Public structures + + public struct DiscDefinitionStructure + { + /// Bytes 0 to 1 Data Length + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Bytes 4 to 5 "DS" + public ushort Signature; + /// Byte 6 DDS format + public byte Format; + /// Byte 7 Reserved + public byte Reserved3; + /// Bytes 8 to 11 DDS update count + public uint UpdateCount; + /// Bytes 12 to 19 Reserved + public ulong Reserved4; + /// Bytes 20 to 23 First PSN of Drive Area + public uint DriveAreaPSN; + /// Bytes 24 to 27 Reserved + public uint Reserved5; + /// Bytes 28 to 31 First PSN of Defect List + public uint DefectListPSN; + /// Bytes 32 to 35 Reserved + public uint Reserved6; + /// Bytes 36 to 39 PSN of LSN 0 of user data area + public uint PSNofLSNZero; + /// Bytes 40 to 43 Last LSN of user data area + public uint LastUserAreaLSN; + /// Bytes 44 to 47 ISA0 size + public uint ISA0; + /// Bytes 48 to 51 OSA size + public uint OSA; + /// Bytes 52 to 55 ISA1 size + public uint ISA1; + /// Byte 56 Spare Area full flags + public byte SpareAreaFullFlags; + /// Byte 57 Reserved + public byte Reserved7; + /// Byte 58 Disc type specific field + public byte DiscTypeSpecificField1; + /// Byte 59 Reserved + public byte Reserved8; + /// Byte 60 to 63 Disc type specific field + public uint DiscTypeSpecificField2; + /// Byte 64 to 67 Reserved + public uint Reserved9; + /// Bytes 68 to 99 Status bits of INFO1/2 and PAC1/2 on L0 and L1 + public byte[] StatusBits; + /// Bytes 100 to end Disc type specific data + public byte[] DiscTypeSpecificData; + } + +#endregion Public structures + +#endregion + +#region Private constants + + /// Disc Definition Structure Identifier "DS" + const ushort DDSIdentifier = 0x4453; + const string MODULE_NAME = "BD DDS decoder"; + +#endregion Private constants + +#region Public methods + + public static DiscDefinitionStructure? Decode(byte[] DDSResponse) + { + if(DDSResponse == null) + return null; + + var decoded = new DiscDefinitionStructure + { + DataLength = BigEndianBitConverter.ToUInt16(DDSResponse, 0), + Reserved1 = DDSResponse[2], + Reserved2 = DDSResponse[3], + Signature = BigEndianBitConverter.ToUInt16(DDSResponse, 4) + }; + + if(decoded.Signature != DDSIdentifier) + { + AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Found_incorrect_DDS_signature_0, decoded.Signature); + + return null; + } + + decoded.Format = DDSResponse[6]; + decoded.Reserved3 = DDSResponse[7]; + decoded.UpdateCount = BigEndianBitConverter.ToUInt32(DDSResponse, 8); + decoded.Reserved4 = BigEndianBitConverter.ToUInt64(DDSResponse, 12); + decoded.DriveAreaPSN = BigEndianBitConverter.ToUInt32(DDSResponse, 20); + decoded.Reserved5 = BigEndianBitConverter.ToUInt32(DDSResponse, 24); + decoded.DefectListPSN = BigEndianBitConverter.ToUInt32(DDSResponse, 28); + decoded.Reserved6 = BigEndianBitConverter.ToUInt32(DDSResponse, 32); + decoded.PSNofLSNZero = BigEndianBitConverter.ToUInt32(DDSResponse, 36); + decoded.LastUserAreaLSN = BigEndianBitConverter.ToUInt32(DDSResponse, 40); + decoded.ISA0 = BigEndianBitConverter.ToUInt32(DDSResponse, 44); + decoded.OSA = BigEndianBitConverter.ToUInt32(DDSResponse, 48); + decoded.ISA1 = BigEndianBitConverter.ToUInt32(DDSResponse, 52); + decoded.SpareAreaFullFlags = DDSResponse[56]; + decoded.Reserved7 = DDSResponse[57]; + decoded.DiscTypeSpecificField1 = DDSResponse[58]; + decoded.Reserved8 = DDSResponse[59]; + decoded.DiscTypeSpecificField2 = BigEndianBitConverter.ToUInt32(DDSResponse, 60); + decoded.Reserved9 = BigEndianBitConverter.ToUInt32(DDSResponse, 64); + decoded.StatusBits = new byte[32]; + Array.Copy(DDSResponse, 68, decoded.StatusBits, 0, 32); + decoded.DiscTypeSpecificData = new byte[DDSResponse.Length - 100]; + Array.Copy(DDSResponse, 100, decoded.DiscTypeSpecificData, 0, DDSResponse.Length - 100); + + return decoded; + } + + public static string Prettify(DiscDefinitionStructure? DDSResponse) + { + if(DDSResponse == null) + return null; + + DiscDefinitionStructure response = DDSResponse.Value; + + var sb = new StringBuilder(); + + sb.AppendFormat(Localization.DDS_Format_0, response.Format).AppendLine(); + sb.AppendFormat(Localization.DDS_has_been_updated_0_times, response.UpdateCount).AppendLine(); + sb.AppendFormat(Localization.First_PSN_of_Drive_Area_0, response.DriveAreaPSN).AppendLine(); + sb.AppendFormat(Localization.First_PSN_of_Defect_List_0, response.DefectListPSN).AppendLine(); + sb.AppendFormat(Localization.PSN_of_User_Data_Areas_LSN_0_0, response.PSNofLSNZero).AppendLine(); + sb.AppendFormat(Localization.Last_User_Data_Areas_LSN_0_0, response.LastUserAreaLSN).AppendLine(); + sb.AppendFormat(Localization.ISA0_size_0, response.ISA0).AppendLine(); + sb.AppendFormat(Localization.OSA_size_0, response.OSA).AppendLine(); + sb.AppendFormat(Localization.ISA1_size_0, response.ISA1).AppendLine(); + sb.AppendFormat(Localization.Spare_Area_Full_Flags_0, response.SpareAreaFullFlags).AppendLine(); + sb.AppendFormat(Localization.Disc_Type_Specific_Field_1_0, response.DiscTypeSpecificField1).AppendLine(); + sb.AppendFormat(Localization.Disc_Type_Specific_Field_2_0, response.DiscTypeSpecificField2).AppendLine(); + sb.AppendFormat(Localization.Blu_ray_DDS_Status_Bits_in_hex_follows); + sb.AppendLine(PrintHex.ByteArrayToHexArrayString(response.StatusBits, 80)); + sb.AppendFormat(Localization.Blu_ray_DDS_Disc_Type_Specific_Data_in_hex_follows); + sb.AppendLine(PrintHex.ByteArrayToHexArrayString(response.DiscTypeSpecificData, 80)); + + #if DEBUG + if(response.Reserved1 != 0) + sb.AppendFormat(Localization.Reserved1_equals_0_X8, response.Reserved1).AppendLine(); + + if(response.Reserved2 != 0) + sb.AppendFormat(Localization.Reserved2_equals_0_X8, response.Reserved2).AppendLine(); + + if(response.Reserved3 != 0) + sb.AppendFormat(Localization.Reserved_3_equals_0_X2, response.Reserved3).AppendLine(); + + if(response.Reserved4 != 0) + sb.AppendFormat(Localization.Reserved4_equals_0_X16, response.Reserved4).AppendLine(); + + if(response.Reserved5 != 0) + sb.AppendFormat(Localization.Reserved5_equals_0_X8, response.Reserved5).AppendLine(); + + if(response.Reserved6 != 0) + sb.AppendFormat(Localization.Reserved6_equals_0_X8, response.Reserved6).AppendLine(); + + if(response.Reserved7 != 0) + sb.AppendFormat(Localization.Reserved7_equals_0_X2, response.Reserved7).AppendLine(); + + if(response.Reserved8 != 0) + sb.AppendFormat(Localization.Reserved8_equals_0_X2, response.Reserved8).AppendLine(); + + if(response.Reserved9 != 0) + sb.AppendFormat(Localization.Reserved9_equals_0_X8, response.Reserved9).AppendLine(); + #endif + + return sb.ToString(); + } + + public static string Prettify(byte[] DDSResponse) => Prettify(Decode(DDSResponse)); + +#endregion Public methods +} \ No newline at end of file diff --git a/Aaru.Decoders/Bluray/DI.cs b/Aaru.Decoders/Bluray/DI.cs new file mode 100644 index 000000000..94a740092 --- /dev/null +++ b/Aaru.Decoders/Bluray/DI.cs @@ -0,0 +1,621 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : DI.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes Blu-ray Disc Information. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Text; +using Aaru.Console; +using Aaru.Helpers; + +namespace Aaru.Decoders.Bluray; + +// Information from the following standards: +// ANSI X3.304-1997 +// T10/1048-D revision 9.0 +// T10/1048-D revision 10a +// T10/1228-D revision 7.0c +// T10/1228-D revision 11a +// T10/1363-D revision 10g +// T10/1545-D revision 1d +// T10/1545-D revision 5 +// T10/1545-D revision 5a +// T10/1675-D revision 2c +// T10/1675-D revision 4 +// T10/1836-D revision 2g +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +public static class DI +{ +#region BluSize enum + + public enum BluSize : byte + { + /// 120mm + OneTwenty = 0, + /// 80mm + Eighty = 1 + } + +#endregion + +#region ChannelLength enum + + public enum ChannelLength : byte + { + /// 74.5nm channel or 25Gb/layer + Seventy = 1, + /// 69.0nm channel or 27Gb/layer + Sixty = 2 + } + +#endregion + +#region HybridLayer enum + + public enum HybridLayer : byte + { + /// No hybrid layer + None = 0, + /// -ROM layer + ReadOnly = 1, + /// -R layer + Recordable = 2, + /// -RW layer + Rewritable = 3 + } + +#endregion + +#region Private constants + + const string DiscTypeBDROM = "BDO"; + const string DiscTypeBDRE = "BDW"; + const string DiscTypeBDR = "BDR"; + + /// Disc Information Unit Identifier "DI" + const ushort DIUIdentifier = 0x4449; + const string MODULE_NAME = "BD Disc Information decoder"; + +#endregion Private constants + +#region Public methods + + public static DiscInformation? Decode(byte[] DIResponse) + { + if(DIResponse == null) + return null; + + if(DIResponse.Length != 4100) + { + AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Found_incorrect_Blu_ray_Disc_Information_size_0_bytes, + DIResponse.Length); + + return null; + } + + var decoded = new DiscInformation + { + DataLength = BigEndianBitConverter.ToUInt16(DIResponse, 0), + Reserved1 = DIResponse[2], + Reserved2 = DIResponse[3] + }; + + var offset = 4; + List units = new(); + + while(true) + { + if(offset >= 4100) + break; + + var unit = new DiscInformationUnits + { + Signature = BigEndianBitConverter.ToUInt16(DIResponse, 0 + offset) + }; + + if(unit.Signature != DIUIdentifier) + break; + + unit.Format = DIResponse[2 + offset]; + unit.UnitsPerBlock = (byte)((DIResponse[3 + offset] & 0xF8) >> 3); + unit.Layer = (byte)(DIResponse[3 + offset] & 0x07); + unit.Legacy = DIResponse[4 + offset]; + unit.Sequence = DIResponse[5 + offset]; + unit.Continuation = (DIResponse[6 + offset] & 0x80) == 0x80; + unit.Length = (byte)(DIResponse[6 + offset] & 0x7F); + unit.Reserved = DIResponse[7 + offset]; + unit.DiscTypeIdentifier = new byte[3]; + Array.Copy(DIResponse, 8 + offset, unit.DiscTypeIdentifier, 0, 3); + unit.DiscSize = (BluSize)((DIResponse[11 + offset] & 0xC0) >> 6); + unit.DiscClass = (byte)((DIResponse[11 + offset] & 0x30) >> 4); + unit.DiscVersion = (byte)(DIResponse[11 + offset] & 0x0F); + unit.Layers = (byte)((DIResponse[12 + offset] & 0xF0) >> 4); + unit.DvdLayer = (HybridLayer)((DIResponse[13 + offset] & 0xC0) >> 6); + unit.CdLayer = (HybridLayer)((DIResponse[13 + offset] & 0x30) >> 4); + unit.ChannelLength = (ChannelLength)(DIResponse[13 + offset] & 0x0F); + unit.Polarity = DIResponse[14 + offset]; + unit.RecordedPolarity = DIResponse[14 + offset]; + unit.Bca = (byte)(DIResponse[16 + offset] & 0x0F); + unit.MaxTransfer = DIResponse[17 + offset]; + + unit.LastPsn = (uint)((DIResponse[20 + offset] << 24) + + (DIResponse[21 + offset] << 16) + + (DIResponse[22 + offset] << 8) + + DIResponse[23 + offset]); + + // TODO: In -R/-RE how does this relate to layer size??? + unit.FirstAun = (uint)((DIResponse[24 + offset] << 24) + + (DIResponse[25 + offset] << 16) + + (DIResponse[26 + offset] << 8) + + DIResponse[27 + offset]); + + unit.LastAun = (uint)((DIResponse[28 + offset] << 24) + + (DIResponse[29 + offset] << 16) + + (DIResponse[30 + offset] << 8) + + DIResponse[31 + offset]); + + switch(Encoding.ASCII.GetString(unit.DiscTypeIdentifier)) + { + case DiscTypeBDROM: + { + unit.FormatDependentContents = new byte[32]; + Array.Copy(DIResponse, 32 + offset, unit.FormatDependentContents, 0, 32); + + break; + } + + case DiscTypeBDRE: + case DiscTypeBDR: + { + unit.FormatDependentContents = new byte[66]; + Array.Copy(DIResponse, 32 + offset, unit.FormatDependentContents, 0, 66); + unit.ManufacturerID = new byte[6]; + Array.Copy(DIResponse, 100 + offset, unit.ManufacturerID, 0, 6); + unit.MediaTypeID = new byte[3]; + Array.Copy(DIResponse, 106 + offset, unit.MediaTypeID, 0, 3); + unit.TimeStamp = BigEndianBitConverter.ToUInt16(DIResponse, 109 + offset); + unit.ProductRevisionNumber = DIResponse[111 + offset]; + + offset += 14; + + break; + } + + default: + { + AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Found_unknown_disc_type_identifier_0, + Encoding.ASCII.GetString(unit.DiscTypeIdentifier)); + + break; + } + } + + units.Add(unit); + + offset += unit.Length; + } + + if(units.Count <= 0) + return decoded; + + decoded.Units = new DiscInformationUnits[units.Count]; + + for(var i = 0; i < units.Count; i++) + decoded.Units[i] = units[i]; + + return decoded; + } + + public static string Prettify(DiscInformation? DIResponse) + { + if(DIResponse == null) + return null; + + DiscInformation response = DIResponse.Value; + + var sb = new StringBuilder(); + + foreach(DiscInformationUnits unit in response.Units) + { + sb.AppendFormat(Localization.DI_Unit_Sequence_0, unit.Sequence).AppendLine(); + sb.AppendFormat(Localization.DI_Unit_Format_0, unit.Format).AppendLine(); + sb.AppendFormat(Localization.There_are_0_per_block, unit.UnitsPerBlock).AppendLine(); + sb.AppendFormat(Localization.This_DI_refers_to_layer_0, unit.Layer).AppendLine(); + + if(Encoding.ASCII.GetString(unit.DiscTypeIdentifier) == DiscTypeBDRE) + sb.AppendFormat(Localization.Legacy_value_0, unit.Legacy).AppendLine(); + + sb.AppendLine(unit.Continuation + ? Localization.This_DI_continues_previous_unit + : Localization.This_DI_starts_a_new_unit); + + sb.AppendFormat(Localization.DI_Unit_is_0_bytes, unit.Length).AppendLine(); + + sb.AppendFormat(Localization.Disc_type_identifier_0, Encoding.ASCII.GetString(unit.DiscTypeIdentifier)). + AppendLine(); + + switch(unit.DiscSize) + { + case BluSize.OneTwenty: + sb.AppendLine(Localization.Disc_size_120mm); + + break; + case BluSize.Eighty: + sb.AppendLine(Localization.Disc_size_80mm); + + break; + default: + sb.AppendFormat(Localization.Disc_size_Unknown_code_0, (byte)unit.DiscSize).AppendLine(); + + break; + } + + sb.AppendFormat(Localization.Disc_class_0, unit.DiscClass).AppendLine(); + sb.AppendFormat(Localization.Disc_version_0, unit.DiscVersion).AppendLine(); + sb.AppendFormat(Localization.This_disc_has_0_layers, unit.Layers).AppendLine(); + + switch(unit.DvdLayer) + { + case HybridLayer.None: + sb.AppendLine(Localization.This_disc_does_not_contain_a_DVD_layer); + + break; + case HybridLayer.ReadOnly: + sb.AppendLine(Localization.This_disc_contains_a_DVD_ROM_layer); + + break; + case HybridLayer.Recordable: + sb.AppendLine(Localization.This_disc_contains_a_DVD_R_layer); + + break; + case HybridLayer.Rewritable: + sb.AppendLine(Localization.This_disc_contains_a_DVD_RW_layer); + + break; + } + + switch(unit.CdLayer) + { + case HybridLayer.None: + sb.AppendLine(Localization.This_disc_does_not_contain_a_CD_layer); + + break; + case HybridLayer.ReadOnly: + sb.AppendLine(Localization.This_disc_contains_a_CD_ROM_layer); + + break; + case HybridLayer.Recordable: + sb.AppendLine(Localization.This_disc_contains_a_CD_R_layer); + + break; + case HybridLayer.Rewritable: + sb.AppendLine(Localization.This_disc_contains_a_CD_RW_layer); + + break; + } + + switch(unit.ChannelLength) + { + case ChannelLength.Seventy: + sb.AppendLine(Localization.Disc_uses_a_74_5nm_channel_giving_25_Gb_per_layer); + + break; + case ChannelLength.Sixty: + sb.AppendLine(Localization.Disc_uses_a_69_0nm_channel_giving_27_Gb_per_layer); + + break; + default: + sb.AppendFormat(Localization.Disc_uses_unknown_channel_length_with_code_0, + (byte)unit.ChannelLength). + AppendLine(); + + break; + } + + switch(unit.Polarity) + { + case 0: + sb.AppendLine(Localization.Disc_uses_positive_polarity); + + break; + case 1: + sb.AppendLine(Localization.Disc_uses_negative_polarity); + + break; + default: + sb.AppendFormat(Localization.Disc_uses_unknown_polarity_with_code_0, unit.Polarity).AppendLine(); + + break; + } + + if(Encoding.ASCII.GetString(unit.DiscTypeIdentifier) == DiscTypeBDR) + { + switch(unit.RecordedPolarity) + { + case 0: + sb.AppendLine(Localization. + Recorded_marks_have_a_lower_reflectivity_than_unrecorded_ones_HTL_disc); + + break; + case 1: + sb.AppendLine(Localization. + Recorded_marks_have_a_higher_reflectivity_than_unrecorded_ones_LTH_disc); + + break; + default: + sb.AppendFormat(Localization.Disc_uses_unknown_recorded_reflectivity_polarity_with_code_0, + unit.RecordedPolarity). + AppendLine(); + + break; + } + } + + switch(unit.Bca) + { + case 0: + sb.AppendLine(Localization.Disc_doesn_t_have_a_BCA); + + break; + case 1: + sb.AppendLine(Localization.Disc_has_a_BCA); + + break; + default: + sb.AppendFormat(Localization.Disc_uses_unknown_BCA_code_0, unit.Bca).AppendLine(); + + break; + } + + if(unit.MaxTransfer > 0) + { + sb.AppendFormat(Localization.Disc_has_a_maximum_transfer_rate_of_0_Mbit_sec, unit.MaxTransfer). + AppendLine(); + } + else + sb.AppendLine(Localization.Disc_does_not_specify_a_maximum_transfer_rate); + + sb.AppendFormat(Localization.Last_user_data_PSN_for_disc_0, unit.LastPsn).AppendLine(); + + sb.AppendFormat(Localization.First_address_unit_number_of_data_zone_in_this_layer_0, unit.FirstAun). + AppendLine(); + + sb.AppendFormat(Localization.Last_address_unit_number_of_data_zone_in_this_layer_0, unit.LastAun). + AppendLine(); + + if(Encoding.ASCII.GetString(unit.DiscTypeIdentifier) == DiscTypeBDR || + Encoding.ASCII.GetString(unit.DiscTypeIdentifier) == DiscTypeBDRE) + { + sb.AppendFormat(Localization.Disc_manufacturer_ID_0, Encoding.ASCII.GetString(unit.ManufacturerID)). + AppendLine(); + + sb.AppendFormat(Localization.Disc_media_type_ID_0, Encoding.ASCII.GetString(unit.MediaTypeID)). + AppendLine(); + + sb.AppendFormat(Localization.Disc_timestamp_0, unit.TimeStamp).AppendLine(); + sb.AppendFormat(Localization.Disc_product_revision_number_0, unit.ProductRevisionNumber).AppendLine(); + } + + sb.AppendFormat(Localization.Blu_ray_DI_Unit_format_dependent_contents_as_hex_follows); + sb.AppendLine(PrintHex.ByteArrayToHexArrayString(unit.FormatDependentContents, 80)); + } + + return sb.ToString(); + } + + public static string Prettify(byte[] DIResponse) => Prettify(Decode(DIResponse)); + + public static string ManufacturerFromDI(string manufacturerId) + { + var manufacturer = ""; + + // ReSharper disable StringLiteralTypo + switch(manufacturerId) + { + case "AMESOB": + case "OTCBDR": + manufacturer = "Amethystum Storage Technology Co., Ltd."; + + break; + case "UMEBDR": + case "ANWELL": + manufacturer = "Avic Umedisc HK Ltd."; + + break; + case "MAXELL": + manufacturer = "Hitachi Maxell, Ltd."; + + break; + case "CMCMAG": + manufacturer = "CMC Magnetics Corporation"; + + break; + case "ISMMBD": + manufacturer = "Info Source Digital Media (Zhong Shan) Co., Ltd."; + + break; + case "LGEBRA": + manufacturer = "LG Electronics Inc."; + + break; + case "MILLEN": + manufacturer = "Millenniata, Inc."; + + break; + case "VERBAT": + case "VAMKM": + manufacturer = "Mitsubishi Chemical Media Co., Ltd."; + + break; + case "PHILIP": + case "MBI": + manufacturer = "Moser Baer India Ltd."; + + break; + case "MEI": + case "PAN": + manufacturer = "Matsushita Electric Industrial Co., Ltd."; + + break; + case "PRODIS": + manufacturer = "Prodisc Technology Inc."; + + break; + case "RITEK": + manufacturer = "Ritek Co."; + + break; + case "SONY": + manufacturer = "Sony Corporation"; + + break; + case "TYG-BD": + manufacturer = "Taiyo Yuden Company Ltd."; + + break; + case "TDKBLD": + manufacturer = "TDK Corporation"; + + break; + case "JVC-AM": + case "JVCVAM": + manufacturer = "Victor Advanced media Co., Ltd."; + + break; + case "JVCRE1": + manufacturer = "JVC KENWOOD Corporation"; + + break; + case "INFOME": + manufacturer = "InfoMedia Inc."; + + break; + } + + // ReSharper restore StringLiteralTypo + + return manufacturer != "" ? $"{manufacturer} (\"{manufacturerId}\")" : $"\"{manufacturerId}\""; + } + +#endregion Public methods + +#region Public structures + + public struct DiscInformation + { + /// Bytes 0 to 1 Always 4098 + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Byte 4 to 4099 Disc information units + public DiscInformationUnits[] Units; + } + + public struct DiscInformationUnits + { + /// Byte 0 "DI" + public ushort Signature; + /// Byte 2 Disc information format + public byte Format; + /// Byte 3, bits 7 to 3 Number of DI units per block + public byte UnitsPerBlock; + /// Byte 3, bits 2 to 0 Layer this DI refers to + public byte Layer; + /// Byte 4 Reserved for BD-ROM, legacy information for BD-R/-RE + public byte Legacy; + /// Byte 5 Sequence number for this DI unit + public byte Sequence; + /// Byte 6, bit 7 If set this DI is a continuation of the previous one + public bool Continuation; + /// Byte 6, bits 6 to 0 Number of bytes used by this DI unit, should be 64 for BD-ROM and 112 for BD-R/-RE + public byte Length; + /// Byte 7 Reserved + public byte Reserved; + /// Bytes 8 to 10 Disc type identifier + public byte[] DiscTypeIdentifier; + /// Byte 11, bits 7 to 6 Disc size + public BluSize DiscSize; + /// Byte 11, bits 5 to 4 Disc class + public byte DiscClass; + /// Byte 11, bits 3 to 0 Disc version + public byte DiscVersion; + /// Byte 12, bits 7 to 4 Layers in this disc + public byte Layers; + /// Byte 12, bits 3 to 0 Reserved + public byte Reserved2; + /// Byte 13, bits 7 to 6 DVD layer + public HybridLayer DvdLayer; + /// Byte 13, bits 5 to 4 CD layer + public HybridLayer CdLayer; + /// Byte 13, bits 3 to 0 Channel length + public ChannelLength ChannelLength; + /// Byte 14 Polarity + public byte Polarity; + /// Byte 15 Recorded polarity + public byte RecordedPolarity; + /// Byte 16, bits 7 to 4 Reserved + public byte Reserved3; + /// Byte 16, bits 3 to 0 If 0 no BCA, if 1 BCA, rest not defined + public byte Bca; + /// Byte 17 Maximum transfer speed in megabits/second, 0 if no maximum + public byte MaxTransfer; + /// Bytes 18 to 19 Reserved + public ushort Reserved4; + /// Bytes 20 to 23 Last user data PSN for disc + public uint LastPsn; + /// Bytes 24 to 27 First address unit number of data zone in this layer + public uint FirstAun; + /// Bytes 28 to 31 Last address unit number of data zone in this layer + public uint LastAun; + /// + /// Bytes 32 to 63 for BD-ROM, bytes 32 to 99 for BD-R/-RE Format dependent contents, disclosed in private blu-ray + /// specifications + /// + public byte[] FormatDependentContents; + /// Bytes 100 to 105, BD-R/-RE only Manufacturer ID + public byte[] ManufacturerID; + /// Bytes 106 to 108, BD-R/-RE only Media type ID + public byte[] MediaTypeID; + /// Bytes 109 to 110, BD-R/-RE only Timestamp + public ushort TimeStamp; + /// Byte 111 Product revision number + public byte ProductRevisionNumber; + } + +#endregion Public structures +} \ No newline at end of file diff --git a/Aaru.Decoders/Bluray/Spare.cs b/Aaru.Decoders/Bluray/Spare.cs new file mode 100644 index 000000000..6bddf5282 --- /dev/null +++ b/Aaru.Decoders/Bluray/Spare.cs @@ -0,0 +1,143 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : Spare.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes Blu-ray Spare Area Information. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; +using Aaru.Console; +using Aaru.Helpers; + +namespace Aaru.Decoders.Bluray; + +// Information from the following standards: +// ANSI X3.304-1997 +// T10/1048-D revision 9.0 +// T10/1048-D revision 10a +// T10/1228-D revision 7.0c +// T10/1228-D revision 11a +// T10/1363-D revision 10g +// T10/1545-D revision 1d +// T10/1545-D revision 5 +// T10/1545-D revision 5a +// T10/1675-D revision 2c +// T10/1675-D revision 4 +// T10/1836-D revision 2g +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +public static class Spare +{ + const string MODULE_NAME = "BD Spare Area Information decoder"; + +#region Nested type: SpareAreaInformation + +#region Public structures + + public struct SpareAreaInformation + { + /// Bytes 0 to 1 Always 14 + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Bytes 4 to 7 Reserved + public uint Reserved3; + /// Bytes 8 to 11 Free spare blocks + public uint FreeSpareBlocks; + /// Bytes 12 to 15 Allocated spare blocks + public uint AllocatedSpareBlocks; + } + +#endregion Public structures + +#endregion + +#region Public methods + + public static SpareAreaInformation? Decode(byte[] SAIResponse) + { + if(SAIResponse == null) + return null; + + if(SAIResponse.Length != 16) + { + AaruConsole.DebugWriteLine(MODULE_NAME, + Localization. + Spare_Decode_Found_incorrect_Blu_ray_Spare_Area_Information_size_0_bytes, + SAIResponse.Length); + + return null; + } + + var decoded = new SpareAreaInformation + { + DataLength = BigEndianBitConverter.ToUInt16(SAIResponse, 0), + Reserved1 = SAIResponse[2], + Reserved2 = SAIResponse[3], + Reserved3 = BigEndianBitConverter.ToUInt32(SAIResponse, 4), + FreeSpareBlocks = BigEndianBitConverter.ToUInt32(SAIResponse, 8), + AllocatedSpareBlocks = BigEndianBitConverter.ToUInt32(SAIResponse, 12) + }; + + return decoded; + } + + public static string Prettify(SpareAreaInformation? SAIResponse) + { + if(SAIResponse == null) + return null; + + SpareAreaInformation response = SAIResponse.Value; + + var sb = new StringBuilder(); + + #if DEBUG + if(response.Reserved1 != 0) + sb.AppendFormat(Localization.Reserved1_equals_0_X8, response.Reserved1).AppendLine(); + + if(response.Reserved2 != 0) + sb.AppendFormat(Localization.Reserved2_equals_0_X8, response.Reserved2).AppendLine(); + + if(response.Reserved3 != 0) + sb.AppendFormat(Localization.Reserved3_equals_0_X8, response.Reserved3).AppendLine(); + #endif + sb.AppendFormat(Localization._0_free_spare_blocks, response.FreeSpareBlocks).AppendLine(); + sb.AppendFormat(Localization._0_allocated_spare_blocks, response.AllocatedSpareBlocks).AppendLine(); + + return sb.ToString(); + } + + public static string Prettify(byte[] SAIResponse) => Prettify(Decode(SAIResponse)); + +#endregion Public methods +} \ No newline at end of file diff --git a/Aaru.Decoders/CD/ATIP.cs b/Aaru.Decoders/CD/ATIP.cs new file mode 100644 index 000000000..749ed2e0b --- /dev/null +++ b/Aaru.Decoders/CD/ATIP.cs @@ -0,0 +1,814 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : ATIP.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes CD Absolute-Time-In-Pregroove +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Text; +using Aaru.Console; +using Aaru.Helpers; + +namespace Aaru.Decoders.CD; + +// Information from the following standards: +// ANSI X3.304-1997 +// T10/1048-D revision 9.0 +// T10/1048-D revision 10a +// T10/1228-D revision 7.0c +// T10/1228-D revision 11a +// T10/1363-D revision 10g +// T10/1545-D revision 1d +// T10/1545-D revision 5 +// T10/1545-D revision 5a +// T10/1675-D revision 2c +// T10/1675-D revision 4 +// T10/1836-D revision 2g +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +public static class ATIP +{ + const string MODULE_NAME = "CD ATIP decoder"; + + public static CDATIP Decode(byte[] CDATIPResponse) + { + if(CDATIPResponse is not { Length: > 4 }) + return null; + + var decoded = new CDATIP(); + + if(CDATIPResponse.Length != 32 && CDATIPResponse.Length != 28) + { + AaruConsole.DebugWriteLine(MODULE_NAME, + Localization. + Expected_CD_ATIP_size_32_bytes_is_not_received_size_0_bytes_not_decoding, + CDATIPResponse.Length); + + return null; + } + + decoded.DataLength = BigEndianBitConverter.ToUInt16(CDATIPResponse, 0); + decoded.Reserved1 = CDATIPResponse[2]; + decoded.Reserved2 = CDATIPResponse[3]; + decoded.ITWP = (byte)((CDATIPResponse[4] & 0xF0) >> 4); + decoded.DDCD = Convert.ToBoolean(CDATIPResponse[4] & 0x08); + decoded.ReferenceSpeed = (byte)(CDATIPResponse[4] & 0x07); + decoded.AlwaysZero = Convert.ToBoolean(CDATIPResponse[5] & 0x80); + decoded.URU = Convert.ToBoolean(CDATIPResponse[5] & 0x40); + decoded.Reserved3 = (byte)(CDATIPResponse[5] & 0x3F); + + decoded.AlwaysOne = Convert.ToBoolean(CDATIPResponse[6] & 0x80); + decoded.DiscType = Convert.ToBoolean(CDATIPResponse[6] & 0x40); + decoded.DiscSubType = (byte)((CDATIPResponse[6] & 0x38) >> 3); + decoded.A1Valid = Convert.ToBoolean(CDATIPResponse[6] & 0x04); + decoded.A2Valid = Convert.ToBoolean(CDATIPResponse[6] & 0x02); + decoded.A3Valid = Convert.ToBoolean(CDATIPResponse[6] & 0x01); + + decoded.Reserved4 = CDATIPResponse[7]; + decoded.LeadInStartMin = CDATIPResponse[8]; + decoded.LeadInStartSec = CDATIPResponse[9]; + decoded.LeadInStartFrame = CDATIPResponse[10]; + decoded.Reserved5 = CDATIPResponse[11]; + decoded.LeadOutStartMin = CDATIPResponse[12]; + decoded.LeadOutStartSec = CDATIPResponse[13]; + decoded.LeadOutStartFrame = CDATIPResponse[14]; + decoded.Reserved6 = CDATIPResponse[15]; + + decoded.A1Values = new byte[3]; + decoded.A2Values = new byte[3]; + decoded.A3Values = new byte[3]; + + Array.Copy(CDATIPResponse, 16, decoded.A1Values, 0, 3); + Array.Copy(CDATIPResponse, 20, decoded.A2Values, 0, 3); + Array.Copy(CDATIPResponse, 24, decoded.A3Values, 0, 3); + + decoded.Reserved7 = CDATIPResponse[19]; + decoded.Reserved8 = CDATIPResponse[23]; + decoded.Reserved9 = CDATIPResponse[27]; + + if(CDATIPResponse.Length < 32) + return decoded.AlwaysOne ? decoded : null; + + decoded.S4Values = new byte[3]; + Array.Copy(CDATIPResponse, 28, decoded.S4Values, 0, 3); + decoded.Reserved10 = CDATIPResponse[31]; + + return decoded.AlwaysOne ? decoded : null; + } + + public static string Prettify(CDATIP response) + { + if(response == null) + return null; + + var sb = new StringBuilder(); + + if(response.DDCD) + { + sb.AppendFormat(Localization.Indicative_Target_Writing_Power_0, response.ITWP).AppendLine(); + sb.AppendLine(response.DiscType ? Localization.Disc_is_DDCD_RW : Localization.Disc_is_DDCD_R); + + switch(response.ReferenceSpeed) + { + case 2: + sb.AppendLine(Localization.Reference_speed_is_4x); + + break; + case 3: + sb.AppendLine(Localization.Reference_speed_is_8x); + + break; + default: + sb.AppendFormat(Localization.Reference_speed_set_is_unknown_0, response.ReferenceSpeed). + AppendLine(); + + break; + } + + sb.AppendFormat(Localization.ATIP_Start_time_of_Lead_in_0, + (response.LeadInStartMin << 16) + + (response.LeadInStartSec << 8) + + response.LeadInStartFrame). + AppendLine(); + + sb.AppendFormat(Localization.ATIP_Last_possible_start_time_of_Lead_out_0, + (response.LeadOutStartMin << 16) + + (response.LeadOutStartSec << 8) + + response.LeadOutStartFrame). + AppendLine(); + + sb.AppendFormat(Localization.S4_value_0, + (response.S4Values[0] << 16) + (response.S4Values[1] << 8) + response.S4Values[2]). + AppendLine(); + } + else + { + sb.AppendFormat(Localization.Indicative_Target_Writing_Power_0, response.ITWP & 0x07).AppendLine(); + + if(response.DiscType) + { + switch(response.DiscSubType) + { + case 0: + sb.AppendLine(Localization.Disc_is_CD_RW); + + break; + case 1: + sb.AppendLine(Localization.Disc_is_High_Speed_CD_RW); + + break; + case 2: + sb.AppendLine(Localization.Disc_is_Ultra_Speed_CD_RW); + + break; + case 3: + sb.AppendLine(Localization.Disc_is_Ultra_Speed_Plus_CD_RW); + + break; + case 4: + sb.AppendLine(Localization.Disc_is_medium_type_B_low_beta_category_CD_RW); + + break; + case 5: + sb.AppendLine(Localization.Disc_is_medium_type_B_high_beta_category_CD_RW); + + break; + case 6: + sb.AppendLine(Localization.Disc_is_medium_type_C_low_beta_category_CD_RW); + + break; + case 7: + sb.AppendLine(Localization.Disc_is_medium_type_C_high_beta_category_CD_RW); + + break; + default: + sb.AppendFormat(Localization.Unknown_CD_RW_disc_subtype_0, response.DiscSubType).AppendLine(); + + break; + } + + switch(response.ReferenceSpeed) + { + case 1: + sb.AppendLine(Localization.Reference_speed_is_2x); + + break; + default: + sb.AppendFormat(Localization.Reference_speed_set_is_unknown_0, response.ReferenceSpeed). + AppendLine(); + + break; + } + } + else + { + sb.AppendLine(Localization.Disc_is_CD_R); + + switch(response.DiscSubType) + { + case 0: + sb.AppendLine(Localization.Disc_is_normal_speed_CLV_CD_R); + + break; + case 1: + sb.AppendLine(Localization.Disc_is_high_speed_CAV_CD_R); + + break; + case 2: + sb.AppendLine(Localization.Disc_is_medium_type_A_low_beta_category_CD_R); + + break; + case 3: + sb.AppendLine(Localization.Disc_is_medium_type_A_high_beta_category_CD_R); + + break; + case 4: + sb.AppendLine(Localization.Disc_is_medium_type_B_low_beta_category_CD_R); + + break; + case 5: + sb.AppendLine(Localization.Disc_is_medium_type_B_high_beta_category__CD_R); + + break; + case 6: + sb.AppendLine(Localization.Disc_is_medium_type_C_low_beta_category__CD_R); + + break; + case 7: + sb.AppendLine(Localization.Disc_is_medium_type_C_high_beta_category__CD_R); + + break; + default: + sb.AppendFormat(Localization.Unknown_CD_R_disc_subtype_0, response.DiscSubType).AppendLine(); + + break; + } + } + + sb.AppendLine(response.URU ? Localization.Disc_use_is_unrestricted : Localization.Disc_use_is_restricted); + + sb.AppendFormat(Localization.ATIP_Start_time_of_Lead_in_0_1_2, response.LeadInStartMin, + response.LeadInStartSec, response.LeadInStartFrame). + AppendLine(); + + sb.AppendFormat(Localization.ATIP_Last_possible_start_time_of_Lead_out_0_1_2, response.LeadOutStartMin, + response.LeadOutStartSec, response.LeadOutStartFrame). + AppendLine(); + + if(response.A1Valid) + { + sb.AppendFormat(Localization.A1_value_0, + (response.A1Values[0] << 16) + (response.A1Values[1] << 8) + response.A1Values[2]). + AppendLine(); + } + + if(response.A2Valid) + { + sb.AppendFormat(Localization.A2_value_0, + (response.A2Values[0] << 16) + (response.A2Values[1] << 8) + response.A2Values[2]). + AppendLine(); + } + + if(response.A3Valid) + { + sb.AppendFormat(Localization.A3_value_0, + (response.A3Values[0] << 16) + (response.A3Values[1] << 8) + response.A3Values[2]). + AppendLine(); + } + + if(response.S4Values != null) + { + sb.AppendFormat(Localization.S4_value_0, + (response.S4Values[0] << 16) + (response.S4Values[1] << 8) + response.S4Values[2]). + AppendLine(); + } + } + + if(response.LeadInStartMin != 97) + return sb.ToString(); + + int type = response.LeadInStartFrame % 10; + int frm = response.LeadInStartFrame - type; + + if(response.DiscType) + sb.AppendLine(Localization.Disc_uses_phase_change); + else + { + sb.AppendLine(type < 5 + ? Localization.Disc_uses_long_strategy_type_dye_Cyanine_AZO_etc + : Localization.Disc_uses_short_strategy_type_dye_Phthalocyanine_etc); + } + + string manufacturer = ManufacturerFromATIP(response.LeadInStartSec, frm); + + if(manufacturer != "") + sb.AppendFormat(Localization.Disc_manufactured_by_0, manufacturer).AppendLine(); + + return sb.ToString(); + } + + public static string Prettify(byte[] CDATIPResponse) + { + CDATIP decoded = Decode(CDATIPResponse); + + return Prettify(decoded); + } + + [SuppressMessage("ReSharper", "StringLiteralTypo")] + public static string ManufacturerFromATIP(byte sec, int frm) + { + switch(sec) + { + case 10: + switch(frm) + { + case 00: + return "Ritek Co."; + } + + break; + case 15: + switch(frm) + { + case 00: + return "TDK Corporation"; + case 10: + return "Ritek Co."; + case 20: + return "Mitsubishi Chemical Corporation"; + case 30: + return "NAN-YA Plastics Corporation"; + } + + break; + case 16: + switch(frm) + { + case 20: + return "Shenzen SG&Gast Digital Optical Discs"; + case 30: + return "Grand Advance Technology Ltd."; + } + + break; + case 17: + if(frm == 00) + return "Moser Baer India Ltd."; + + break; + case 18: + switch(frm) + { + case 10: + return "Wealth Fair Investment Ltd."; + case 60: + return "Taroko International Co. Ltd."; + } + + break; + case 20: + if(frm == 10) + return "CDA Datenträger Albrechts GmbH"; + + break; + case 21: + switch(frm) + { + case 10: + return "Grupo Condor S.L."; + case 20: + return "E-TOP Mediatek Inc."; + case 30: + return "Bestdisc Technology Corporation"; + case 40: + return "Optical Disc Manufacturing Equipment"; + case 50: + return "Sound Sound Multi-Media Development Ltd."; + } + + break; + case 22: + switch(frm) + { + case 00: + return "Woongjin Media Corp."; + case 10: + return "Seantram Technology Inc."; + case 20: + return "Advanced Digital Media"; + case 30: + return "EXIMPO"; + case 40: + return "CIS Technology Inc."; + case 50: + return "Hong Kong Digital Technology Co., Ltd."; + case 60: + return "Acer Media Technology, Inc."; + } + + break; + case 23: + switch(frm) + { + case 00: + return "Matsushita Electric Industrial Co., Ltd."; + case 10: + return "Doremi Media Co., Ltd."; + case 20: + return "Nacar Media s.r.l."; + case 30: + return "Audio Distributors Co., Ltd."; + case 40: + return "Victor Company of Japan, Ltd."; + case 50: + return "Optrom Inc."; + case 60: + return "Customer Pressing Oosterhout"; + } + + break; + case 24: + switch(frm) + { + case 00: + return "Taiyo Yuden Company Ltd."; + case 10: + return "SONY Corporation"; + case 20: + return "Computer Support Italy s.r.l."; + case 30: + return "Unitech Japan Inc."; + case 40: + return "kdg mediatech AG"; + case 50: + return "Guann Yinn Co., Ltd."; + case 60: + return "Harmonic Hall Optical Disc Ltd."; + } + + break; + case 25: + switch(frm) + { + case 00: + return "MPO"; + case 20: + return "Hitachi Maxell, Ltd."; + case 30: + return "Infodisc Technology Co. Ltd."; + case 40: + return "Vivastar AG"; + case 50: + return "AMS Technology Inc."; + case 60: + return "Xcitec Inc."; + } + + break; + case 26: + switch(frm) + { + case 00: + return "Fornet International Pte Ltd."; + case 10: + return "POSTECH Corporation"; + case 20: + return "SKC Co., Ltd."; + case 30: + return "Optical Disc Corporation"; + case 40: + return "FUJI Photo Film Co., Ltd."; + case 50: + return "Lead Data Inc."; + case 60: + return "CMC Magnetics Corporation"; + } + + break; + case 27: + switch(frm) + { + case 00: + return "Digital Storage Technology Co., Ltd."; + case 10: + return "Plasmon Data systems Ltd."; + case 20: + return "Princo Corporation"; + case 30: + return "Pioneer Video Corporation"; + case 40: + return "Kodak Japan Ltd."; + case 50: + return "Mitsui Chemicals, Inc."; + case 60: + return "Ricoh Company Ltd."; + } + + break; + case 28: + switch(frm) + { + case 00: + return "Opti.Me.S. S.p.A."; + case 10: + return "Gigastore Corporation"; + case 20: + return "Multi Media Masters & Machinary SA"; + case 30: + return "Auvistar Industry Co., Ltd."; + case 40: + return "King Pro Mediatek Inc."; + case 50: + return "Delphi Technology Inc."; + case 60: + return "Friendly CD-Tek Co."; + } + + break; + case 29: + switch(frm) + { + case 00: + return "Taeil Media Co., Ltd."; + case 10: + return "Vanguard Disc Inc."; + case 20: + return "Unidisc Technology Co., Ltd."; + case 30: + return "Hile Optical Disc Technology Corp."; + case 40: + return "Viva Magnetics Ltd."; + case 50: + return "General Magnetics Ltd."; + } + + break; + case 30: + if(frm == 10) + return "CDA Datenträger Albrechts GmbH"; + + break; + case 31: + switch(frm) + { + case 00: + return "Ritek Co."; + case 30: + return "Grand Advance Technology Ltd."; + } + + break; + case 32: + switch(frm) + { + case 00: + return "TDK Corporation"; + case 10: + return "Prodisc Technology Inc."; + } + + break; + case 34: + switch(frm) + { + case 20: + case 22: + return "Mitsubishi Chemical Corporation"; + } + + break; + case 36: + switch(frm) + { + case 00: + return "Gish International Co., Ltd."; + } + + break; + case 42: + if(frm == 20) + return "Advanced Digital Media"; + + break; + case 45: + switch(frm) + { + case 00: + return "Fornet International Pte Ltd."; + case 10: + return "Unitech Japan Inc."; + case 20: + return "Acer Media Technology, Inc."; + case 40: + return "CIS Technology Inc."; + case 50: + return "Guann Yinn Co., Ltd."; + case 60: + return "Xcitec Inc."; + } + + break; + case 46: + switch(frm) + { + case 00: + return "Taiyo Yuden Company Ltd."; + case 10: + return "Hong Kong Digital Technology Co., Ltd."; + case 20: + return "Multi Media Masters & Machinary SA"; + case 30: + return "Computer Support Italy s.r.l."; + case 40: + return "FUJI Photo Film Co., Ltd."; + case 50: + return "Auvistar Industry Co., Ltd."; + case 60: + return "CMC Magnetics Corporation"; + } + + break; + case 47: + switch(frm) + { + case 10: + return "Hitachi Maxell, Ltd."; + case 20: + return "Princo Corporation"; + case 40: + return "POSTECH Corporation"; + case 50: + return "Ritek Co."; + case 60: + return "Prodisc Technology Inc."; + } + + break; + case 48: + switch(frm) + { + case 00: + return "Ricoh Company Ltd."; + case 10: + return "Kodak Japan Ltd."; + case 20: + return "Plasmon Data systems Ltd."; + case 30: + return "Pioneer Video Corporation"; + case 40: + return "Digital Storage Technology Co., Ltd."; + case 50: + return "Mitsui Chemicals, Inc."; + case 60: + return "Lead Data Inc."; + } + + break; + case 49: + switch(frm) + { + case 00: + return "TDK Corporation"; + case 10: + return "Gigastore Corporation"; + case 20: + return "King Pro Mediatek Inc."; + case 30: + return "Opti.Me.S. S.p.A."; + case 40: + return "Victor Company of Japan, Ltd."; + case 60: + return "Matsushita Electric Industrial Co., Ltd."; + } + + break; + case 50: + switch(frm) + { + case 10: + return "Vanguard Disc Inc."; + case 20: + return "Mitsubishi Chemical Corporation"; + case 30: + return "CDA Datenträger Albrechts GmbH"; + } + + break; + case 51: + switch(frm) + { + case 10: + return "Grand Advance Technology Ltd."; + case 20: + return "Infodisc Technology Co. Ltd."; + case 50: + return "Hile Optical Disc Technology Corp."; + } + + break; + } + + return ""; + } + +#region Nested type: CDATIP + + public class CDATIP + { + /// Byte 6, bit 2 A1 values are valid + public bool A1Valid; + /// Bytes 16 to 18 A1 values + public byte[] A1Values; + /// Byte 6, bit 1 A2 values are valid + public bool A2Valid; + /// Bytes 20 to 22 A2 values + public byte[] A2Values; + /// Byte 6, bit 0 A3 values are valid + public bool A3Valid; + /// Bytes 24 to 26 A3 values + public byte[] A3Values; + /// Byte 6, bit 7 Always set + public bool AlwaysOne; + /// Byte 5, bit 7 Always unset + public bool AlwaysZero; + /// Bytes 1 to 0 Total size of returned session information minus this field + public ushort DataLength; + /// Byte 4, bit 3 Set if DDCD + public bool DDCD; + /// Byte 6, bits 5 to 3 Disc subtype + public byte DiscSubType; + /// Byte 6, bit 6 Set if rewritable (CD-RW or DDCD-RW) + public bool DiscType; + /// Byte 4, bits 7 to 4 Indicative target writing power + public byte ITWP; + /// Byte 10 ATIP Start time of Lead-In (Frame) + public byte LeadInStartFrame; + /// Byte 8 ATIP Start time of Lead-In (Minute) + public byte LeadInStartMin; + /// Byte 9 ATIP Start time of Lead-In (Second) + public byte LeadInStartSec; + /// Byte 14 ATIP Last possible start time of Lead-Out (Frame) + public byte LeadOutStartFrame; + /// Byte 12 ATIP Last possible start time of Lead-Out (Minute) + public byte LeadOutStartMin; + /// Byte 13 ATIP Last possible start time of Lead-Out (Second) + public byte LeadOutStartSec; + /// Byte 4, bits 2 to 0 Reference speed + public byte ReferenceSpeed; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 31 Reserved + public byte Reserved10; + /// Byte 3 Reserved + public byte Reserved2; + /// Byte 5, bits 5 to 0 Reserved + public byte Reserved3; + /// Byte 7 Reserved + public byte Reserved4; + /// Byte 11 Reserved + public byte Reserved5; + /// Byte 15 Reserved + public byte Reserved6; + /// Byte 19 Reserved + public byte Reserved7; + /// Byte 23 Reserved + public byte Reserved8; + /// Byte 27 Reserved + public byte Reserved9; + /// Bytes 28 to 30 S4 values + public byte[] S4Values; + /// Byte 5, bit 6 Unrestricted media + public bool URU; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/CD/CDTextOnLeadIn.cs b/Aaru.Decoders/CD/CDTextOnLeadIn.cs new file mode 100644 index 000000000..0358246d4 --- /dev/null +++ b/Aaru.Decoders/CD/CDTextOnLeadIn.cs @@ -0,0 +1,408 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : CDTextOnLeadIn.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes CD-TEXT on Lead-In. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Text; +using Aaru.Console; +using Aaru.Helpers; + +namespace Aaru.Decoders.CD; + +// Information from the following standards: +// ANSI X3.304-1997 +// T10/1048-D revision 9.0 +// T10/1048-D revision 10a +// T10/1228-D revision 7.0c +// T10/1228-D revision 11a +// T10/1363-D revision 10g +// T10/1545-D revision 1d +// T10/1545-D revision 5 +// T10/1545-D revision 5a +// T10/1675-D revision 2c +// T10/1675-D revision 4 +// T10/1836-D revision 2g +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +[SuppressMessage("ReSharper", "UnusedType.Global")] +public static class CDTextOnLeadIn +{ +#region PackTypeIndicator enum + + public enum PackTypeIndicator : byte + { + /// Title of the track (or album if track == 0) + Title = 0x80, + /// Performer + Performer = 0x81, + /// Songwriter + Songwriter = 0x82, + /// Composer + Composer = 0x83, + /// Arranger + Arranger = 0x84, + /// Message from the content provider or artist + Message = 0x85, + /// Disc identification information + DiscIdentification = 0x86, + /// Genre identification + GenreIdentification = 0x87, + /// Table of content information + TOCInformation = 0x88, + /// Second table of content information + SecondTOCInformation = 0x89, + /// Reserved + Reserved1 = 0x8A, + /// Reserved + Reserved2 = 0x8B, + /// Reserved + Reserved3 = 0x8C, + /// Reserved for content provider only + ReservedForContentProvider = 0x8D, + /// UPC of album or ISRC of track + UPCorISRC = 0x8E, + /// Size information of the block + BlockSizeInformation = 0x8F + } + +#endregion + + const string MODULE_NAME = "CD-TEXT decoder"; + + public static CDText? Decode(byte[] CDTextResponse) + { + if(CDTextResponse is not { Length: > 4 }) + return null; + + var decoded = new CDText + { + DataLength = BigEndianBitConverter.ToUInt16(CDTextResponse, 0), + Reserved1 = CDTextResponse[2], + Reserved2 = CDTextResponse[3] + }; + + decoded.DataPacks = new CDTextPack[(decoded.DataLength - 2) / 18]; + + if(decoded.DataLength == 2) + return null; + + if(decoded.DataLength + 2 != CDTextResponse.Length) + { + AaruConsole.DebugWriteLine(MODULE_NAME, + Localization. + Expected_CD_TEXT_size_0_bytes_is_not_received_size_1_bytes_not_decoding, + decoded.DataLength + 2, CDTextResponse.Length); + + return null; + } + + for(var i = 0; i < (decoded.DataLength - 2) / 18; i++) + { + decoded.DataPacks[i].HeaderID1 = CDTextResponse[0 + i * 18 + 4]; + decoded.DataPacks[i].HeaderID2 = CDTextResponse[1 + i * 18 + 4]; + decoded.DataPacks[i].HeaderID3 = CDTextResponse[2 + i * 18 + 4]; + decoded.DataPacks[i].DBCC = Convert.ToBoolean(CDTextResponse[3 + i * 18 + 4] & 0x80); + decoded.DataPacks[i].BlockNumber = (byte)((CDTextResponse[3 + i * 18 + 4] & 0x70) >> 4); + decoded.DataPacks[i].CharacterPosition = (byte)(CDTextResponse[3 + i * 18 + 4] & 0x0F); + decoded.DataPacks[i].TextDataField = new byte[12]; + Array.Copy(CDTextResponse, 4 + i * 18 + 4, decoded.DataPacks[i].TextDataField, 0, 12); + decoded.DataPacks[i].CRC = BigEndianBitConverter.ToUInt16(CDTextResponse, 16 + i * 18 + 4); + } + + return decoded; + } + + public static string Prettify(CDText? CDTextResponse) + { + if(CDTextResponse == null) + return null; + + CDText response = CDTextResponse.Value; + var sb = new StringBuilder(); + + #if DEBUG + if(response.Reserved1 != 0) + sb.AppendFormat(Localization.Reserved1_equals_0_X8, response.Reserved1).AppendLine(); + + if(response.Reserved2 != 0) + sb.AppendFormat(Localization.Reserved2_equals_0_X8, response.Reserved2).AppendLine(); + #endif + + foreach(CDTextPack descriptor in response.DataPacks) + { + if((descriptor.HeaderID1 & 0x80) != 0x80) + { + // Ignore NOPs + if((descriptor.HeaderID1 & 0x80) != 0) + { + sb.AppendFormat(Localization.Incorrect_CD_Text_pack_type_0_not_decoding, descriptor.HeaderID1). + AppendLine(); + } + } + else + { + switch(descriptor.HeaderID1) + { + case 0x80: + { + if(descriptor.HeaderID2 == 0x00) + sb.AppendLine(Localization.CD_Text_pack_contains_title_for_album); + else + { + sb.AppendFormat(Localization.CD_Text_pack_contains_title_for_track_0, descriptor.HeaderID2). + AppendLine(); + } + + break; + } + + case 0x81: + { + if(descriptor.HeaderID2 == 0x00) + sb.AppendLine(Localization.CD_Text_pack_contains_performer_for_album); + else + { + sb.AppendFormat(Localization.CD_Text_pack_contains_performer_for_track_0, + descriptor.HeaderID2). + AppendLine(); + } + + break; + } + + case 0x82: + { + if(descriptor.HeaderID2 == 0x00) + sb.AppendLine(Localization.CD_Text_pack_contains_songwriter_for_album); + else + { + sb.AppendFormat(Localization.CD_Text_pack_contains_songwriter_for_track_0, + descriptor.HeaderID2). + AppendLine(); + } + + break; + } + + case 0x83: + { + if(descriptor.HeaderID2 == 0x00) + sb.AppendLine(Localization.album); + else + sb.AppendFormat(Localization.track_0, descriptor.HeaderID2).AppendLine(); + + break; + } + + case 0x84: + { + if(descriptor.HeaderID2 == 0x00) + sb.AppendLine(Localization.CD_Text_pack_contains_arranger_for_album); + else + { + sb.AppendFormat(Localization.CD_Text_pack_contains_arranger_for_track_0, + descriptor.HeaderID2). + AppendLine(); + } + + break; + } + + case 0x85: + { + if(descriptor.HeaderID2 == 0x00) + sb.AppendLine(Localization.CD_Text_pack_contains_content_provider_message_for_album); + else + { + sb.AppendFormat(Localization.CD_Text_pack_contains_content_provider_message_for_track_0, + descriptor.HeaderID2). + AppendLine(); + } + + break; + } + + case 0x86: + { + sb.AppendLine(Localization.CD_Text_pack_contains_disc_identification_information); + + break; + } + + case 0x87: + { + sb.AppendLine(Localization.CD_Text_pack_contains_genre_identification_information); + + break; + } + + case 0x88: + { + sb.AppendLine(Localization.CD_Text_pack_contains_table_of_contents_information); + + break; + } + + case 0x89: + { + sb.AppendLine(Localization.CD_Text_pack_contains_second_table_of_contents_information); + + break; + } + + case 0x8A: + case 0x8B: + case 0x8C: + { + sb.AppendLine(Localization.CD_Text_pack_contains_reserved_data); + + break; + } + + case 0x8D: + { + sb.AppendLine(Localization.CD_Text_pack_contains_data_reserved_for_content_provider_only); + + break; + } + + case 0x8E: + { + if(descriptor.HeaderID2 == 0x00) + sb.AppendLine(Localization.CD_Text_pack_contains_UPC); + else + sb.AppendFormat(Localization.track_0, descriptor.HeaderID2).AppendLine(); + + break; + } + + case 0x8F: + { + sb.AppendLine(Localization.CD_Text_pack_contains_size_block_information); + + break; + } + } + + switch(descriptor.HeaderID1) + { + case 0x80: + case 0x81: + case 0x82: + case 0x83: + case 0x84: + case 0x85: + case 0x86: + case 0x87: + case 0x8E: + { + if(descriptor.DBCC) + sb.AppendLine(Localization.Double_Byte_Character_Code_is_used); + + sb.AppendFormat(Localization.Block_number_0, descriptor.BlockNumber).AppendLine(); + sb.AppendFormat(Localization.Character_position_0, descriptor.CharacterPosition).AppendLine(); + + sb.AppendFormat(Localization.Text_field_0, + StringHandlers.CToString(descriptor.TextDataField, + Encoding.GetEncoding("iso-8859-1"))). + AppendLine(); + + break; + } + + default: + { + sb.AppendFormat(Localization.Binary_contents_0, + PrintHex.ByteArrayToHexArrayString(descriptor.TextDataField, 28)). + AppendLine(); + + break; + } + } + + sb.AppendFormat(Localization.CRC_0_X4, descriptor.CRC).AppendLine(); + } + } + + return sb.ToString(); + } + + public static string Prettify(byte[] CDTextResponse) + { + CDText? decoded = Decode(CDTextResponse); + + return Prettify(decoded); + } + +#region Nested type: CDText + + public struct CDText + { + /// Total size of returned CD-Text information minus this field + public ushort DataLength; + /// Reserved + public byte Reserved1; + /// Reserved + public byte Reserved2; + /// CD-Text data packs + public CDTextPack[] DataPacks; + } + +#endregion + +#region Nested type: CDTextPack + + public struct CDTextPack + { + /// Byte 0 Pack ID1 (Pack Type) + public byte HeaderID1; + /// Byte 1 Pack ID2 (Track number) + public byte HeaderID2; + /// Byte 2 Pack ID3 + public byte HeaderID3; + /// Byte 3, bit 7 Double Byte Character Code + public bool DBCC; + /// Byte 3, bits 6 to 4 Block number + public byte BlockNumber; + /// Byte 3, bits 3 to 0 Character position + public byte CharacterPosition; + /// Bytes 4 to 15 Text data + public byte[] TextDataField; + /// Bytes 16 to 17 CRC16 + public ushort CRC; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/CD/Enums.cs b/Aaru.Decoders/CD/Enums.cs new file mode 100644 index 000000000..c6fa5b289 --- /dev/null +++ b/Aaru.Decoders/CD/Enums.cs @@ -0,0 +1,72 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : Enums.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Contains various CD enumerations. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; + +namespace Aaru.Decoders.CD; + +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +public enum TocAdr : byte +{ + /// Q Sub-channel mode information not supplied + NoInformation = 0x00, + /// Q Sub-channel encodes current position data + CurrentPosition = 0x01, + /// Q Sub-channel encodes the media catalog number + MediaCatalogNumber = 0x02, + /// Q Sub-channel encodes the ISRC + ISRC = 0x03, + /// Q Sub-channel encodes the start of an audio/data track (if found in TOC) + TrackPointer = 0x01, + /// Q Sub-channel encodes the start of a video track (if found in TOC) for CD-V + VideoTrackPointer = 0x04 +} + +public enum TocControl : byte +{ + /// Stereo audio, no pre-emphasis + TwoChanNoPreEmph = 0x00, + /// Stereo audio with pre-emphasis + TwoChanPreEmph = 0x01, + /// If mask applied, track can be copied + CopyPermissionMask = 0x02, + /// Data track, recorded uninterrumpted + DataTrack = 0x04, + /// Data track, recorded incrementally + DataTrackIncremental = 0x05, + /// Quadraphonic audio, no pre-emphasis + FourChanNoPreEmph = 0x08, + /// Quadraphonic audio with pre-emphasis + FourChanPreEmph = 0x09, + /// Reserved mask + ReservedMask = 0x0C +} \ No newline at end of file diff --git a/Aaru.Decoders/CD/FullTOC.cs b/Aaru.Decoders/CD/FullTOC.cs new file mode 100644 index 000000000..c342b15fc --- /dev/null +++ b/Aaru.Decoders/CD/FullTOC.cs @@ -0,0 +1,812 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : FullTOC.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes CD full Table of Contents. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using System.Text; +using Aaru.CommonTypes.Enums; +using Aaru.CommonTypes.Structs; +using Aaru.Console; +using Aaru.Helpers; + +namespace Aaru.Decoders.CD; + +// Information from the following standards: +// ANSI X3.304-1997 +// T10/1048-D revision 9.0 +// T10/1048-D revision 10a +// T10/1228-D revision 7.0c +// T10/1228-D revision 11a +// T10/1363-D revision 10g +// T10/1545-D revision 1d +// T10/1545-D revision 5 +// T10/1545-D revision 5a +// T10/1675-D revision 2c +// T10/1675-D revision 4 +// T10/1836-D revision 2g +// ISO/IEC 61104: Compact disc video system - 12 cm CD-V +// ISO/IEC 60908: Audio recording - Compact disc digital audio system +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static class FullTOC +{ + const string MODULE_NAME = "CD full TOC decoder"; + + public static CDFullTOC? Decode(byte[] CDFullTOCResponse) + { + if(CDFullTOCResponse is not { Length: > 4 }) + return null; + + var decoded = new CDFullTOC + { + DataLength = BigEndianBitConverter.ToUInt16(CDFullTOCResponse, 0), + FirstCompleteSession = CDFullTOCResponse[2], + LastCompleteSession = CDFullTOCResponse[3] + }; + + decoded.TrackDescriptors = new TrackDataDescriptor[(decoded.DataLength - 2) / 11]; + + if(decoded.DataLength + 2 != CDFullTOCResponse.Length) + { + AaruConsole.DebugWriteLine(MODULE_NAME, + Localization. + Expected_CDFullTOC_size_0_bytes_is_not_received_size_1_bytes_not_decoding, + decoded.DataLength + 2, CDFullTOCResponse.Length); + + return null; + } + + for(var i = 0; i < (decoded.DataLength - 2) / 11; i++) + { + decoded.TrackDescriptors[i].SessionNumber = CDFullTOCResponse[0 + i * 11 + 4]; + decoded.TrackDescriptors[i].ADR = (byte)((CDFullTOCResponse[1 + i * 11 + 4] & 0xF0) >> 4); + decoded.TrackDescriptors[i].CONTROL = (byte)(CDFullTOCResponse[1 + i * 11 + 4] & 0x0F); + decoded.TrackDescriptors[i].TNO = CDFullTOCResponse[2 + i * 11 + 4]; + decoded.TrackDescriptors[i].POINT = CDFullTOCResponse[3 + i * 11 + 4]; + decoded.TrackDescriptors[i].Min = CDFullTOCResponse[4 + i * 11 + 4]; + decoded.TrackDescriptors[i].Sec = CDFullTOCResponse[5 + i * 11 + 4]; + decoded.TrackDescriptors[i].Frame = CDFullTOCResponse[6 + i * 11 + 4]; + decoded.TrackDescriptors[i].Zero = CDFullTOCResponse[7 + i * 11 + 4]; + decoded.TrackDescriptors[i].HOUR = (byte)((CDFullTOCResponse[7 + i * 11 + 4] & 0xF0) >> 4); + decoded.TrackDescriptors[i].PHOUR = (byte)(CDFullTOCResponse[7 + i * 11 + 4] & 0x0F); + decoded.TrackDescriptors[i].PMIN = CDFullTOCResponse[8 + i * 11 + 4]; + decoded.TrackDescriptors[i].PSEC = CDFullTOCResponse[9 + i * 11 + 4]; + decoded.TrackDescriptors[i].PFRAME = CDFullTOCResponse[10 + i * 11 + 4]; + } + + return decoded; + } + + public static string Prettify(CDFullTOC? CDFullTOCResponse) + { + if(CDFullTOCResponse == null) + return null; + + CDFullTOC response = CDFullTOCResponse.Value; + + var sb = new StringBuilder(); + + var lastSession = 0; + + sb.AppendFormat(Localization.First_complete_session_number_0, response.FirstCompleteSession).AppendLine(); + sb.AppendFormat(Localization.Last_complete_session_number_0, response.LastCompleteSession).AppendLine(); + + foreach(TrackDataDescriptor descriptor in response.TrackDescriptors) + { + if((descriptor.CONTROL & 0x08) == 0x08 || + descriptor.ADR != 1 && descriptor.ADR != 5 && descriptor.ADR != 4 && descriptor.ADR != 6 || + descriptor.TNO != 0) + { + sb.AppendLine(Localization.Unknown_TOC_entry_format_printing_values_as_is); + sb.AppendLine($"SessionNumber = {descriptor.SessionNumber}"); + sb.AppendLine($"ADR = {descriptor.ADR}"); + sb.AppendLine($"CONTROL = {descriptor.CONTROL}"); + sb.AppendLine($"TNO = {descriptor.TNO}"); + sb.AppendLine($"POINT = {descriptor.POINT}"); + sb.AppendLine($"Min = {descriptor.Min}"); + sb.AppendLine($"Sec = {descriptor.Sec}"); + sb.AppendLine($"Frame = {descriptor.Frame}"); + sb.AppendLine($"HOUR = {descriptor.HOUR}"); + sb.AppendLine($"PHOUR = {descriptor.PHOUR}"); + sb.AppendLine($"PMIN = {descriptor.PMIN}"); + sb.AppendLine($"PSEC = {descriptor.PSEC}"); + sb.AppendLine($"PFRAME = {descriptor.PFRAME}"); + } + else + { + if(descriptor.SessionNumber > lastSession) + { + sb.AppendFormat(Localization.Session_0, descriptor.SessionNumber).AppendLine(); + lastSession = descriptor.SessionNumber; + } + + switch(descriptor.ADR) + { + case 1: + case 4: + { + switch(descriptor.POINT) + { + case 0xA0 when descriptor.ADR == 4: + { + sb.AppendFormat(Localization.First_video_track_number_0, descriptor.PMIN).AppendLine(); + + switch(descriptor.PSEC) + { + case 0x10: + sb.AppendLine(Localization. + CD_V_single_in_NTSC_format_with_digital_stereo_sound); + + break; + case 0x11: + sb.AppendLine(Localization. + CD_V_single_in_NTSC_format_with_digital_bilingual_sound); + + break; + case 0x12: + sb.AppendLine(Localization.CD_V_disc_in_NTSC_format_with_digital_stereo_sound); + + break; + case 0x13: + sb.AppendLine(Localization. + CD_V_disc_in_NTSC_format_with_digital_bilingual_sound); + + break; + case 0x20: + sb.AppendLine(Localization.CD_V_single_in_PAL_format_with_digital_stereo_sound); + + break; + case 0x21: + sb.AppendLine(Localization. + CD_V_single_in_PAL_format_with_digital_bilingual_sound); + + break; + case 0x22: + sb.AppendLine(Localization.CD_V_disc_in_PAL_format_with_digital_stereo_sound); + + break; + case 0x23: + sb.AppendLine(Localization. + CD_V_disc_in_PAL_format_with_digital_bilingual_sound); + + break; + } + + break; + } + + case 0xA0 when descriptor.ADR == 1: + { + sb.AppendFormat(Localization.First_track_number_0_open_parenthesis, descriptor.PMIN); + + switch((TocControl)(descriptor.CONTROL & 0x0D)) + { + case TocControl.TwoChanNoPreEmph: + sb.Append(Localization.Stereo_audio_track_with_no_pre_emphasis); + + break; + case TocControl.TwoChanPreEmph: + sb.Append(Localization.Stereo_audio_track_with_50_15_us_pre_emphasis); + + break; + case TocControl.FourChanNoPreEmph: + sb.Append(Localization.Quadraphonic_audio_track_with_no_pre_emphasis); + + break; + case TocControl.FourChanPreEmph: + sb.Append(Localization.Quadraphonic_audio_track_with_50_15_us_pre_emphasis); + + break; + case TocControl.DataTrack: + sb.Append(Localization.Data_track_recorded_uninterrupted); + + break; + case TocControl.DataTrackIncremental: + sb.Append(Localization.Data_track_recorded_incrementally); + + break; + } + + sb.AppendLine(Localization.close_parenthesis); + sb.AppendFormat(Localization.Disc_type_0, descriptor.PSEC).AppendLine(); + + //sb.AppendFormat("Absolute time: {3:D2}:{0:D2}:{1:D2}:{2:D2}", descriptor.Min, descriptor.Sec, descriptor.Frame, descriptor.HOUR).AppendLine(); + break; + } + + case 0xA1 when descriptor.ADR == 4: + sb.AppendFormat(Localization.Last_video_track_number_0, descriptor.PMIN).AppendLine(); + + break; + case 0xA1 when descriptor.ADR == 1: + { + sb.AppendFormat(Localization.Last_track_number_0_open_parenthesis, descriptor.PMIN); + + switch((TocControl)(descriptor.CONTROL & 0x0D)) + { + case TocControl.TwoChanNoPreEmph: + sb.Append(Localization.Stereo_audio_track_with_no_pre_emphasis); + + break; + case TocControl.TwoChanPreEmph: + sb.Append(Localization.Stereo_audio_track_with_50_15_us_pre_emphasis); + + break; + case TocControl.FourChanNoPreEmph: + sb.Append(Localization.Quadraphonic_audio_track_with_no_pre_emphasis); + + break; + case TocControl.FourChanPreEmph: + sb.Append(Localization.Quadraphonic_audio_track_with_50_15_us_pre_emphasis); + + break; + case TocControl.DataTrack: + sb.Append(Localization.Data_track_recorded_uninterrupted); + + break; + case TocControl.DataTrackIncremental: + sb.Append(Localization.Data_track_recorded_incrementally); + + break; + } + + sb.AppendLine(Localization.close_parenthesis); + + //sb.AppendFormat("Absolute time: {3:D2}:{0:D2}:{1:D2}:{2:D2}", descriptor.Min, descriptor.Sec, descriptor.Frame, descriptor.HOUR).AppendLine(); + break; + } + + case 0xA2: + { + if(descriptor.PHOUR > 0) + { + sb.AppendFormat(Localization.Lead_out_start_position_3_0_1_2, descriptor.PMIN, + descriptor.PSEC, descriptor.PFRAME, descriptor.PHOUR). + AppendLine(); + } + else + { + sb.AppendFormat(Localization.Lead_out_start_position_0_1_2, descriptor.PMIN, + descriptor.PSEC, descriptor.PFRAME). + AppendLine(); + } + + //sb.AppendFormat("Absolute time: {3:D2}:{0:D2}:{1:D2}:{2:D2}", descriptor.Min, descriptor.Sec, descriptor.Frame, descriptor.HOUR).AppendLine(); + + switch((TocControl)(descriptor.CONTROL & 0x0D)) + { + case TocControl.TwoChanNoPreEmph: + case TocControl.TwoChanPreEmph: + case TocControl.FourChanNoPreEmph: + case TocControl.FourChanPreEmph: + sb.AppendLine(Localization.Lead_out_is_audio_type); + + break; + case TocControl.DataTrack: + case TocControl.DataTrackIncremental: + sb.AppendLine(Localization.Lead_out_is_data_type); + + break; + } + + break; + } + + case 0xF0: + { + sb.AppendFormat(Localization.Book_type_0, descriptor.PMIN); + sb.AppendFormat(Localization.Material_type_0, descriptor.PSEC); + sb.AppendFormat(Localization.Moment_of_inertia_0, descriptor.PFRAME); + + if(descriptor.PHOUR > 0) + { + sb.AppendFormat(Localization.Absolute_time_3_0_1_2, descriptor.Min, descriptor.Sec, + descriptor.Frame, descriptor.HOUR). + AppendLine(); + } + else + { + sb.AppendFormat(Localization.Absolute_time_0_1_2, descriptor.Min, descriptor.Sec, + descriptor.Frame). + AppendLine(); + } + + break; + } + + default: + { + if(descriptor.POINT is >= 0x01 and <= 0x63) + { + if(descriptor.ADR == 4) + { + sb.AppendFormat(Localization.Video_track_3_starts_at_0_1_2, descriptor.PMIN, + descriptor.PSEC, descriptor.PFRAME, descriptor.POINT). + AppendLine(); + } + else + { + bool data = (TocControl)(descriptor.CONTROL & 0x0D) == TocControl.DataTrack || + (TocControl)(descriptor.CONTROL & 0x0D) == + TocControl.DataTrackIncremental; + + if(descriptor.PHOUR > 0) + { + sb.AppendFormat(data ? Localization.Data_track_3_starts_at_4_0_1_2_open_parenthesis : Localization.Audio_track_3_starts_at_4_0_1_2_open_parenthesis, + descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME, + descriptor.POINT, descriptor.PHOUR); + } + + else + { + sb.AppendFormat(data ? Localization.Data_track_3_starts_at_0_1_2_open_parenthesis : Localization.Audio_track_3_starts_at_0_1_2_open_parenthesis, + descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME, + descriptor.POINT); + } + + switch((TocControl)(descriptor.CONTROL & 0x0D)) + { + case TocControl.TwoChanNoPreEmph: + sb.Append(Localization.Stereo_audio_track_with_no_pre_emphasis); + + break; + case TocControl.TwoChanPreEmph: + sb.Append(Localization.Stereo_audio_track_with_50_15_us_pre_emphasis); + + break; + case TocControl.FourChanNoPreEmph: + sb.Append(Localization.Quadraphonic_audio_track_with_no_pre_emphasis); + + break; + case TocControl.FourChanPreEmph: + sb.Append(Localization. + Quadraphonic_audio_track_with_50_15_us_pre_emphasis); + + break; + case TocControl.DataTrack: + sb.Append(Localization.Data_track_recorded_uninterrupted); + + break; + case TocControl.DataTrackIncremental: + sb.Append(Localization.Data_track_recorded_incrementally); + + break; + } + + sb.AppendLine(Localization.close_parenthesis); + } + } + else + { + sb.Append($"ADR = {descriptor.ADR}").AppendLine(); + sb.Append($"CONTROL = {descriptor.CONTROL}").AppendLine(); + sb.Append($"TNO = {descriptor.TNO}").AppendLine(); + sb.Append($"POINT = {descriptor.POINT}").AppendLine(); + sb.Append($"Min = {descriptor.Min}").AppendLine(); + sb.Append($"Sec = {descriptor.Sec}").AppendLine(); + sb.Append($"Frame = {descriptor.Frame}").AppendLine(); + sb.Append($"HOUR = {descriptor.HOUR}").AppendLine(); + sb.Append($"PHOUR = {descriptor.PHOUR}").AppendLine(); + sb.Append($"PMIN = {descriptor.PMIN}").AppendLine(); + sb.Append($"PSEC = {descriptor.PSEC}").AppendLine(); + sb.Append($"PFRAME = {descriptor.PFRAME}").AppendLine(); + } + + break; + } + } + + break; + } + + case 5: + { + switch(descriptor.POINT) + { + case 0xB0: + { + if(descriptor.PHOUR > 0) + { + sb. + AppendFormat(Localization.Start_of_next_possible_program_in_the_recordable_area_of_the_disc_3_0_1_2, + descriptor.Min, descriptor.Sec, descriptor.Frame, descriptor.HOUR). + AppendLine(); + + sb. + AppendFormat(Localization.Maximum_start_of_outermost_Lead_out_in_the_recordable_area_of_the_disc_3_0_1_2, + descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME, + descriptor.PHOUR). + AppendLine(); + } + else + { + sb. + AppendFormat(Localization.Start_of_next_possible_program_in_the_recordable_area_of_the_disc_0_1_2, + descriptor.Min, descriptor.Sec, descriptor.Frame). + AppendLine(); + + sb. + AppendFormat(Localization.Maximum_start_of_outermost_Lead_out_in_the_recordable_area_of_the_disc_0_1_2, + descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME). + AppendLine(); + } + + break; + } + + case 0xB1: + { + sb.AppendFormat(Localization.Number_of_skip_interval_pointers_0, descriptor.PMIN). + AppendLine(); + + sb.AppendFormat(Localization.Number_of_skip_track_pointers_0, descriptor.PSEC). + AppendLine(); + + break; + } + + case 0xB2: + case 0xB3: + case 0xB4: + { + sb.AppendFormat(Localization.Skip_track_0, descriptor.Min).AppendLine(); + sb.AppendFormat(Localization.Skip_track_0, descriptor.Sec).AppendLine(); + sb.AppendFormat(Localization.Skip_track_0, descriptor.Frame).AppendLine(); + sb.AppendFormat(Localization.Skip_track_0, descriptor.Zero).AppendLine(); + sb.AppendFormat(Localization.Skip_track_0, descriptor.PMIN).AppendLine(); + sb.AppendFormat(Localization.Skip_track_0, descriptor.PSEC).AppendLine(); + sb.AppendFormat(Localization.Skip_track_0, descriptor.PFRAME).AppendLine(); + + break; + } + + case 0xC0: + { + sb.AppendFormat(Localization.Optimum_recording_power_0, descriptor.Min).AppendLine(); + + if(descriptor.PHOUR > 0) + { + sb. + AppendFormat(Localization.Start_time_of_the_first_Lead_in_area_in_the_disc_3_0_1_2, + descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME, + descriptor.PHOUR). + AppendLine(); + } + else + { + sb.AppendFormat(Localization.Start_time_of_the_first_Lead_in_area_in_the_disc_0_1_2, + descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME). + AppendLine(); + } + + break; + } + + case 0xC1: + { + sb.AppendFormat(Localization.Copy_of_information_of_A1_from_ATIP_found); + sb.Append($"Min = {descriptor.Min}").AppendLine(); + sb.Append($"Sec = {descriptor.Sec}").AppendLine(); + sb.Append($"Frame = {descriptor.Frame}").AppendLine(); + sb.Append($"Zero = {descriptor.Zero}").AppendLine(); + sb.Append($"PMIN = {descriptor.PMIN}").AppendLine(); + sb.Append($"PSEC = {descriptor.PSEC}").AppendLine(); + sb.Append($"PFRAME = {descriptor.PFRAME}").AppendLine(); + + break; + } + + case 0xCF: + { + if(descriptor.PHOUR > 0) + { + sb.AppendFormat(Localization.Start_position_of_outer_part_lead_in_area_3_0_1_2, + descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME, + descriptor.PHOUR). + AppendLine(); + + sb.AppendFormat(Localization.Stop_position_of_inner_part_lead_out_area_3_0_1_2, + descriptor.Min, descriptor.Sec, descriptor.Frame, descriptor.HOUR). + AppendLine(); + } + else + { + sb.AppendFormat(Localization.Start_position_of_outer_part_lead_in_area_0_1_2, + descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME). + AppendLine(); + + sb.AppendFormat(Localization.Stop_position_of_inner_part_lead_out_area_0_1_2, + descriptor.Min, descriptor.Sec, descriptor.Frame). + AppendLine(); + } + + break; + } + + default: + { + if(descriptor.POINT is >= 0x01 and <= 0x40) + { + sb.AppendFormat(Localization.Start_time_for_interval_that_should_be_skipped_0_1_2, + descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME). + AppendLine(); + + sb.AppendFormat(Localization.Ending_time_for_interval_that_should_be_skipped_0_1_2, + descriptor.Min, descriptor.Sec, descriptor.Frame). + AppendLine(); + } + else + { + sb.Append($"ADR = {descriptor.ADR}").AppendLine(); + sb.Append($"CONTROL = {descriptor.CONTROL}").AppendLine(); + sb.Append($"TNO = {descriptor.TNO}").AppendLine(); + sb.Append($"POINT = {descriptor.POINT}").AppendLine(); + sb.Append($"Min = {descriptor.Min}").AppendLine(); + sb.Append($"Sec = {descriptor.Sec}").AppendLine(); + sb.Append($"Frame = {descriptor.Frame}").AppendLine(); + sb.Append($"HOUR = {descriptor.HOUR}").AppendLine(); + sb.Append($"PHOUR = {descriptor.PHOUR}").AppendLine(); + sb.Append($"PMIN = {descriptor.PMIN}").AppendLine(); + sb.Append($"PSEC = {descriptor.PSEC}").AppendLine(); + sb.Append($"PFRAME = {descriptor.PFRAME}").AppendLine(); + } + + break; + } + } + + break; + } + + case 6: + { + var id = (uint)((descriptor.Min << 16) + (descriptor.Sec << 8) + descriptor.Frame); + sb.AppendFormat(Localization.Disc_ID_0_X6, id & 0x00FFFFFF).AppendLine(); + + break; + } + } + } + } + + return sb.ToString(); + } + + public static string Prettify(byte[] CDFullTOCResponse) + { + CDFullTOC? decoded = Decode(CDFullTOCResponse); + + return Prettify(decoded); + } + + public static CDFullTOC Create(List tracks, Dictionary trackFlags, bool createC0Entry = false) + { + var toc = new CDFullTOC(); + Dictionary sessionEndingTrack = new(); + toc.FirstCompleteSession = byte.MaxValue; + toc.LastCompleteSession = byte.MinValue; + List trackDescriptors = new(); + byte currentTrack = 0; + + foreach(Track track in tracks.OrderBy(t => t.Session).ThenBy(t => t.Sequence)) + { + if(track.Session < toc.FirstCompleteSession) + toc.FirstCompleteSession = (byte)track.Session; + + if(track.Session <= toc.LastCompleteSession) + { + currentTrack = (byte)track.Sequence; + + continue; + } + + if(toc.LastCompleteSession > 0) + sessionEndingTrack.Add(toc.LastCompleteSession, currentTrack); + + toc.LastCompleteSession = (byte)track.Session; + } + + sessionEndingTrack.TryAdd(toc.LastCompleteSession, + (byte)tracks.Where(t => t.Session == toc.LastCompleteSession).Max(t => t.Sequence)); + + byte currentSession = 0; + + foreach(Track track in tracks.OrderBy(t => t.Session).ThenBy(t => t.Sequence)) + { + trackFlags.TryGetValue((byte)track.Sequence, out byte trackControl); + + if(trackControl == 0 && track.Type != TrackType.Audio) + trackControl = (byte)CdFlags.DataTrack; + + // Lead-Out + if(track.Session > currentSession && currentSession != 0) + { + (byte minute, byte second, byte frame) leadoutAmsf = LbaToMsf(track.StartSector - 150); + + (byte minute, byte second, byte frame) leadoutPmsf = + LbaToMsf(tracks.OrderBy(t => t.Session).ThenBy(t => t.Sequence).Last().StartSector); + + // Lead-out + trackDescriptors.Add(new TrackDataDescriptor + { + SessionNumber = currentSession, + POINT = 0xB0, + ADR = 5, + CONTROL = 0, + HOUR = 0, + Min = leadoutAmsf.minute, + Sec = leadoutAmsf.second, + Frame = leadoutAmsf.frame, + PHOUR = 2, + PMIN = leadoutPmsf.minute, + PSEC = leadoutPmsf.second, + PFRAME = leadoutPmsf.frame + }); + + // This seems to be constant? It should not exist on CD-ROM but CloneCD creates them anyway + // Format seems like ATIP, but ATIP should not be as 0xC0 in TOC... + if(createC0Entry) + { + trackDescriptors.Add(new TrackDataDescriptor + { + SessionNumber = currentSession, + POINT = 0xC0, + ADR = 5, + CONTROL = 0, + Min = 128, + PMIN = 97, + PSEC = 25 + }); + } + } + + // Lead-in + if(track.Session > currentSession) + { + currentSession = (byte)track.Session; + sessionEndingTrack.TryGetValue(currentSession, out byte endingTrackNumber); + + (byte minute, byte second, byte frame) leadinPmsf = + LbaToMsf((tracks.FirstOrDefault(t => t.Sequence == endingTrackNumber)?.EndSector ?? 0) + 1); + + // Starting track + trackDescriptors.Add(new TrackDataDescriptor + { + SessionNumber = currentSession, + POINT = 0xA0, + ADR = 1, + CONTROL = trackControl, + PMIN = (byte)track.Sequence + }); + + // Ending track + trackDescriptors.Add(new TrackDataDescriptor + { + SessionNumber = currentSession, + POINT = 0xA1, + ADR = 1, + CONTROL = trackControl, + PMIN = endingTrackNumber + }); + + // Lead-out start + trackDescriptors.Add(new TrackDataDescriptor + { + SessionNumber = currentSession, + POINT = 0xA2, + ADR = 1, + CONTROL = trackControl, + PHOUR = 0, + PMIN = leadinPmsf.minute, + PSEC = leadinPmsf.second, + PFRAME = leadinPmsf.frame + }); + } + + (byte minute, byte second, byte frame) pmsf = LbaToMsf((ulong)track.Indexes[1]); + + // Track + trackDescriptors.Add(new TrackDataDescriptor + { + SessionNumber = (byte)track.Session, + POINT = (byte)track.Sequence, + ADR = 1, + CONTROL = trackControl, + PHOUR = 0, + PMIN = pmsf.minute, + PSEC = pmsf.second, + PFRAME = pmsf.frame + }); + } + + toc.TrackDescriptors = trackDescriptors.ToArray(); + + return toc; + } + + static (byte minute, byte second, byte frame) LbaToMsf(ulong sector) => + ((byte)((sector + 150) / 75 / 60), (byte)((sector + 150) / 75 % 60), (byte)((sector + 150) % 75)); + +#region Nested type: CDFullTOC + + public struct CDFullTOC + { + /// Total size of returned session information minus this field + public ushort DataLength; + /// First complete session number in hex + public byte FirstCompleteSession; + /// Last complete session number in hex + public byte LastCompleteSession; + /// Track descriptors + public TrackDataDescriptor[] TrackDescriptors; + } + +#endregion + +#region Nested type: TrackDataDescriptor + + public struct TrackDataDescriptor + { + /// Byte 0 Session number in hex + public byte SessionNumber; + /// Byte 1, bits 7 to 4 Type of information in Q subchannel of block where this TOC entry was found + public byte ADR; + /// Byte 1, bits 3 to 0 Track attributes + public byte CONTROL; + /// Byte 2 + public byte TNO; + /// Byte 3 + public byte POINT; + /// Byte 4 + public byte Min; + /// Byte 5 + public byte Sec; + /// Byte 6 + public byte Frame; + /// Byte 7, CD only + public byte Zero; + /// Byte 7, bits 7 to 4, DDCD only + public byte HOUR; + /// Byte 7, bits 3 to 0, DDCD only + public byte PHOUR; + /// Byte 8 + public byte PMIN; + /// Byte 9 + public byte PSEC; + /// Byte 10 + public byte PFRAME; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/CD/PMA.cs b/Aaru.Decoders/CD/PMA.cs new file mode 100644 index 000000000..11f79b51d --- /dev/null +++ b/Aaru.Decoders/CD/PMA.cs @@ -0,0 +1,415 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : PMA.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes CD Power Management Area. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Text; +using Aaru.Console; +using Aaru.Helpers; + +namespace Aaru.Decoders.CD; + +// Information from the following standards: +// ANSI X3.304-1997 +// T10/1048-D revision 9.0 +// T10/1048-D revision 10a +// T10/1228-D revision 7.0c +// T10/1228-D revision 11a +// T10/1363-D revision 10g +// T10/1545-D revision 1d +// T10/1545-D revision 5 +// T10/1545-D revision 5a +// T10/1675-D revision 2c +// T10/1675-D revision 4 +// T10/1836-D revision 2g +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static class PMA +{ + const string MODULE_NAME = "CD PMA decoder"; + + public static CDPMA? Decode(byte[] CDPMAResponse) + { + if(CDPMAResponse is not { Length: > 4 }) + return null; + + var decoded = new CDPMA + { + DataLength = BigEndianBitConverter.ToUInt16(CDPMAResponse, 0), + Reserved1 = CDPMAResponse[2], + Reserved2 = CDPMAResponse[3] + }; + + decoded.PMADescriptors = new CDPMADescriptors[(decoded.DataLength - 2) / 11]; + + if(decoded.PMADescriptors.Length == 0) + return null; + + if(decoded.DataLength + 2 != CDPMAResponse.Length) + { + AaruConsole.DebugWriteLine(MODULE_NAME, + Localization. + Expected_CD_PMA_size_0_bytes_is_not_received_size_1_bytes_not_decoding, + decoded.DataLength + 2, CDPMAResponse.Length); + + return null; + } + + for(var i = 0; i < (decoded.DataLength - 2) / 11; i++) + { + decoded.PMADescriptors[i].Reserved = CDPMAResponse[0 + i * 11 + 4]; + decoded.PMADescriptors[i].ADR = (byte)((CDPMAResponse[1 + i * 11 + 4] & 0xF0) >> 4); + decoded.PMADescriptors[i].CONTROL = (byte)(CDPMAResponse[1 + i * 11 + 4] & 0x0F); + decoded.PMADescriptors[i].TNO = CDPMAResponse[2 + i * 11 + 4]; + decoded.PMADescriptors[i].POINT = CDPMAResponse[3 + i * 11 + 4]; + decoded.PMADescriptors[i].Min = CDPMAResponse[4 + i * 11 + 4]; + decoded.PMADescriptors[i].Sec = CDPMAResponse[5 + i * 11 + 4]; + decoded.PMADescriptors[i].Frame = CDPMAResponse[6 + i * 11 + 4]; + decoded.PMADescriptors[i].HOUR = (byte)((CDPMAResponse[7 + i * 11 + 4] & 0xF0) >> 4); + decoded.PMADescriptors[i].PHOUR = (byte)(CDPMAResponse[7 + i * 11 + 4] & 0x0F); + decoded.PMADescriptors[i].PMIN = CDPMAResponse[8 + i * 11 + 4]; + decoded.PMADescriptors[i].PSEC = CDPMAResponse[9 + i * 11 + 4]; + decoded.PMADescriptors[i].PFRAME = CDPMAResponse[10 + i * 11 + 4]; + } + + return decoded; + } + + public static string Prettify(CDPMA? CDPMAResponse) + { + if(CDPMAResponse == null) + return null; + + CDPMA response = CDPMAResponse.Value; + + var sb = new StringBuilder(); + + #if DEBUG + if(response.Reserved1 != 0) + sb.AppendFormat(Localization.Reserved1_equals_0_X8, response.Reserved1).AppendLine(); + + if(response.Reserved2 != 0) + sb.AppendFormat(Localization.Reserved2_equals_0_X8, response.Reserved2).AppendLine(); + #endif + + foreach(CDPMADescriptors descriptor in response.PMADescriptors) + { + #if DEBUG + if(descriptor.Reserved != 0) + sb.AppendFormat(Localization.Reserved_equals_0_X2, descriptor.Reserved).AppendLine(); + #endif + + List tracks; + switch(descriptor.ADR) + { + case 1: + if(descriptor.POINT > 0) + { + switch((TocControl)(descriptor.CONTROL & 0x0D)) + { + case TocControl.TwoChanNoPreEmph: + if(descriptor.PHOUR > 0) + { + sb.AppendFormat(Localization.Track_0_Stereo_audio_track_with_no_pre_emphasis_starts_at_4_1_2_3_and_ends_at_8_5_6_7, + descriptor.POINT, descriptor.PMIN, descriptor.PSEC, + descriptor.PFRAME, descriptor.PHOUR, descriptor.Min, descriptor.Sec, + descriptor.Frame, descriptor.HOUR); + } + else + { + sb.AppendFormat(Localization.Track_0_Stereo_audio_track_with_no_pre_emphasis_starts_at_1_2_3_and_ends_at_4_5_6, + descriptor.POINT, descriptor.PMIN, descriptor.PSEC, + descriptor.PFRAME, descriptor.Min, descriptor.Sec, + descriptor.Frame); + } + + break; + case TocControl.TwoChanPreEmph: + if(descriptor.PHOUR > 0) + { + sb.AppendFormat(Localization.Track_0_Stereo_audio_track_with_50_15_s_pre_emphasis_starts_at_4_1_2_3_and_ends_at_8_5_6_7, + descriptor.POINT, descriptor.PMIN, descriptor.PSEC, + descriptor.PFRAME, descriptor.PHOUR, descriptor.Min, descriptor.Sec, + descriptor.Frame, descriptor.HOUR); + } + else + { + sb.AppendFormat(Localization.Track_0_Stereo_audio_track_with_50_15_us_pre_emphasis_starts_at_1_2_3_and_ends_at_4_5_6, + descriptor.POINT, descriptor.PMIN, descriptor.PSEC, + descriptor.PFRAME, descriptor.Min, descriptor.Sec, + descriptor.Frame); + } + + break; + case TocControl.FourChanNoPreEmph: + if(descriptor.PHOUR > 0) + { + sb.AppendFormat(Localization.Track_0_Quadraphonic_audio_track_with_no_pre_emphasis_starts_at_4_1_2_3_and_ends_at_8_5_6_7, + descriptor.POINT, descriptor.PMIN, descriptor.PSEC, + descriptor.PFRAME, descriptor.PHOUR, descriptor.Min, descriptor.Sec, + descriptor.Frame, descriptor.HOUR); + } + else + { + sb.AppendFormat(Localization.Track_0_Quadraphonic_audio_track_with_no_pre_emphasis_starts_at_1_2_3_and_ends_at_4_5_6, + descriptor.POINT, descriptor.PMIN, descriptor.PSEC, + descriptor.PFRAME, descriptor.Min, descriptor.Sec, + descriptor.Frame); + } + + break; + case TocControl.FourChanPreEmph: + if(descriptor.PHOUR > 0) + { + sb.AppendFormat(Localization.Track_0_Quadraphonic_audio_track_with_50_15_us_pre_emphasis_starts_at_4_1_2_3_and_ends_at_8_5_6_7, + descriptor.POINT, descriptor.PMIN, descriptor.PSEC, + descriptor.PFRAME, descriptor.PHOUR, descriptor.Min, descriptor.Sec, + descriptor.Frame, descriptor.HOUR); + } + else + { + sb.AppendFormat(Localization.Track_0_Quadraphonic_audio_track_with_50_15_us_pre_emphasis_starts_at_1_2_3_and_ends_at_4_5_6, + descriptor.POINT, descriptor.PMIN, descriptor.PSEC, + descriptor.PFRAME, descriptor.Min, descriptor.Sec, + descriptor.Frame); + } + + break; + case TocControl.DataTrack: + if(descriptor.PHOUR > 0) + { + sb.AppendFormat(Localization.Track_0_Data_track_recorded_uninterrupted_starts_at_4_1_2_3_and_ends_at_8_5_6_7, + descriptor.POINT, descriptor.PMIN, descriptor.PSEC, + descriptor.PFRAME, descriptor.PHOUR, descriptor.Min, descriptor.Sec, + descriptor.Frame, descriptor.HOUR); + } + else + { + sb.AppendFormat(Localization.Track_0_Data_track_recorded_uninterrupted_starts_at_1_2_3_and_ends_at_4_5_6, + descriptor.POINT, descriptor.PMIN, descriptor.PSEC, + descriptor.PFRAME, descriptor.Min, descriptor.Sec, + descriptor.Frame); + } + + break; + case TocControl.DataTrackIncremental: + if(descriptor.PHOUR > 0) + { + sb.AppendFormat(Localization.Track_0_Data_track_recorded_incrementally_starts_at_4_1_2_3_and_ends_at_8_5_6_7, + descriptor.POINT, descriptor.PMIN, descriptor.PSEC, + descriptor.PFRAME, descriptor.PHOUR, descriptor.Min, descriptor.Sec, + descriptor.Frame, descriptor.HOUR); + } + else + { + sb.AppendFormat(Localization.Track_0_Data_track_recorded_incrementally_starts_at_1_2_3_and_ends_at_4_5_6, + descriptor.POINT, descriptor.PMIN, descriptor.PSEC, + descriptor.PFRAME, descriptor.Min, descriptor.Sec, + descriptor.Frame); + } + + break; + } + + sb.AppendLine(); + } + else + goto default; + + break; + case 2: + var id = (uint)((descriptor.Min << 16) + (descriptor.Sec << 8) + descriptor.Frame); + sb.AppendFormat(Localization.Disc_ID_0_X6, id & 0x00FFFFFF).AppendLine(); + + break; + case 3: + tracks = new List(); + + if(descriptor.Min > 0) + tracks.Add($"{descriptor.Min}"); + + if(descriptor.Sec > 0) + tracks.Add($"{descriptor.Sec}"); + + if(descriptor.Frame > 0) + tracks.Add($"{descriptor.Frame}"); + + if(descriptor.PMIN > 0) + tracks.Add($"{descriptor.PMIN}"); + + if(descriptor.PSEC > 0) + tracks.Add($"{descriptor.PSEC}"); + + if(descriptor.PFRAME > 0) + tracks.Add($"{descriptor.PFRAME}"); + + sb.AppendFormat(Localization.Skip_track_assignment_0_says_that_tracks_1_should_be_skipped, + descriptor.POINT, string.Join(' ', tracks)); + + break; + case 4: + tracks = new List(); + + if(descriptor.Min > 0) + tracks.Add($"{descriptor.Min}"); + + if(descriptor.Sec > 0) + tracks.Add($"{descriptor.Sec}"); + + if(descriptor.Frame > 0) + tracks.Add($"{descriptor.Frame}"); + + if(descriptor.PMIN > 0) + tracks.Add($"{descriptor.PMIN}"); + + if(descriptor.PSEC > 0) + tracks.Add($"{descriptor.PSEC}"); + + if(descriptor.PFRAME > 0) + tracks.Add($"{descriptor.PFRAME}"); + + sb.AppendFormat(Localization.Unskip_track_assignment_0_says_that_tracks_1_should_not_be_skipped, + descriptor.POINT, string.Join(' ', tracks)); + + break; + case 5: + if(descriptor.PHOUR > 0) + { + sb.AppendFormat(Localization.Skip_time_interval_assignment_0_says_that_from_4_1_2_3_to_8_5_6_7_should_be_skipped, + descriptor.POINT, descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME, + descriptor.PHOUR, descriptor.Min, descriptor.Sec, descriptor.Frame, + descriptor.HOUR); + } + else + { + sb.AppendFormat(Localization.Skip_time_interval_assignment_0_says_that_from_1_2_3_to_4_5_6_should_be_skipped, + descriptor.POINT, descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME, + descriptor.Min, descriptor.Sec, descriptor.Frame); + } + + break; + case 6: + if(descriptor.PHOUR > 0) + { + sb.AppendFormat(Localization.Unskip_time_interval_assignment_0_says_that_from_4_1_2_3_to_8_5_6_7_should_not_be_skipped, + descriptor.POINT, descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME, + descriptor.PHOUR, descriptor.Min, descriptor.Sec, descriptor.Frame, + descriptor.HOUR); + } + else + { + sb.AppendFormat(Localization.Unskip_time_interval_assignment_0_says_that_from_1_2_3_to_4_5_6_should_not_be_skipped, + descriptor.POINT, descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME, + descriptor.Min, descriptor.Sec, descriptor.Frame); + } + + break; + default: + + sb.AppendLine($"ADR = {descriptor.ADR}"); + sb.AppendLine($"CONTROL = {descriptor.CONTROL}"); + sb.AppendLine($"TNO = {descriptor.TNO}"); + sb.AppendLine($"POINT = {descriptor.POINT}"); + sb.AppendLine($"Min = {descriptor.Min}"); + sb.AppendLine($"Sec = {descriptor.Sec}"); + sb.AppendLine($"Frame = {descriptor.Frame}"); + sb.AppendLine($"HOUR = {descriptor.HOUR}"); + sb.AppendLine($"PHOUR = {descriptor.PHOUR}"); + sb.AppendLine($"PMIN = {descriptor.PMIN}"); + sb.AppendLine($"PSEC = {descriptor.PSEC}"); + sb.AppendLine($"PFRAME = {descriptor.PFRAME}"); + + break; + } + } + + return sb.ToString(); + } + + public static string Prettify(byte[] CDPMAResponse) + { + CDPMA? decoded = Decode(CDPMAResponse); + + return Prettify(decoded); + } + +#region Nested type: CDPMA + + public struct CDPMA + { + /// Total size of returned session information minus this field + public ushort DataLength; + /// Reserved + public byte Reserved1; + /// Reserved + public byte Reserved2; + /// Track descriptors + public CDPMADescriptors[] PMADescriptors; + } + +#endregion + +#region Nested type: CDPMADescriptors + + public struct CDPMADescriptors + { + /// Byte 0 Reserved + public byte Reserved; + /// Byte 1, bits 7 to 4 Type of information in Q subchannel of block where this TOC entry was found + public byte ADR; + /// Byte 1, bits 3 to 0 Track attributes + public byte CONTROL; + /// Byte 2 + public byte TNO; + /// Byte 3 + public byte POINT; + /// Byte 4 + public byte Min; + /// Byte 5 + public byte Sec; + /// Byte 6 + public byte Frame; + /// Byte 7, bits 7 to 4 + public byte HOUR; + /// Byte 7, bits 3 to 0 + public byte PHOUR; + /// Byte 8 + public byte PMIN; + /// Byte 9 + public byte PSEC; + /// Byte 10 + public byte PFRAME; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/CD/Sector.cs b/Aaru.Decoders/CD/Sector.cs new file mode 100644 index 000000000..1aa029379 --- /dev/null +++ b/Aaru.Decoders/CD/Sector.cs @@ -0,0 +1,489 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : Sector.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes and descrambles CompactDisc sectors. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using Aaru.Checksums; + +namespace Aaru.Decoders.CD; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +public static class Sector +{ + public static readonly byte[] ScrambleTable = + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x28, + 0x00, 0x1E, 0x80, 0x08, 0x60, 0x06, 0xA8, 0x02, 0xFE, 0x81, 0x80, 0x60, 0x60, 0x28, 0x28, 0x1E, 0x9E, 0x88, + 0x68, 0x66, 0xAE, 0xAA, 0xFC, 0x7F, 0x01, 0xE0, 0x00, 0x48, 0x00, 0x36, 0x80, 0x16, 0xE0, 0x0E, 0xC8, 0x04, + 0x56, 0x83, 0x7E, 0xE1, 0xE0, 0x48, 0x48, 0x36, 0xB6, 0x96, 0xF6, 0xEE, 0xC6, 0xCC, 0x52, 0xD5, 0xFD, 0x9F, + 0x01, 0xA8, 0x00, 0x7E, 0x80, 0x20, 0x60, 0x18, 0x28, 0x0A, 0x9E, 0x87, 0x28, 0x62, 0x9E, 0xA9, 0xA8, 0x7E, + 0xFE, 0xA0, 0x40, 0x78, 0x30, 0x22, 0x94, 0x19, 0xAF, 0x4A, 0xFC, 0x37, 0x01, 0xD6, 0x80, 0x5E, 0xE0, 0x38, + 0x48, 0x12, 0xB6, 0x8D, 0xB6, 0xE5, 0xB6, 0xCB, 0x36, 0xD7, 0x56, 0xDE, 0xBE, 0xD8, 0x70, 0x5A, 0xA4, 0x3B, + 0x3B, 0x53, 0x53, 0x7D, 0xFD, 0xE1, 0x81, 0x88, 0x60, 0x66, 0xA8, 0x2A, 0xFE, 0x9F, 0x00, 0x68, 0x00, 0x2E, + 0x80, 0x1C, 0x60, 0x09, 0xE8, 0x06, 0xCE, 0x82, 0xD4, 0x61, 0x9F, 0x68, 0x68, 0x2E, 0xAE, 0x9C, 0x7C, 0x69, + 0xE1, 0xEE, 0xC8, 0x4C, 0x56, 0xB5, 0xFE, 0xF7, 0x00, 0x46, 0x80, 0x32, 0xE0, 0x15, 0x88, 0x0F, 0x26, 0x84, + 0x1A, 0xE3, 0x4B, 0x09, 0xF7, 0x46, 0xC6, 0xB2, 0xD2, 0xF5, 0x9D, 0x87, 0x29, 0xA2, 0x9E, 0xF9, 0xA8, 0x42, + 0xFE, 0xB1, 0x80, 0x74, 0x60, 0x27, 0x68, 0x1A, 0xAE, 0x8B, 0x3C, 0x67, 0x51, 0xEA, 0xBC, 0x4F, 0x31, 0xF4, + 0x14, 0x47, 0x4F, 0x72, 0xB4, 0x25, 0xB7, 0x5B, 0x36, 0xBB, 0x56, 0xF3, 0x7E, 0xC5, 0xE0, 0x53, 0x08, 0x3D, + 0xC6, 0x91, 0x92, 0xEC, 0x6D, 0x8D, 0xED, 0xA5, 0x8D, 0xBB, 0x25, 0xB3, 0x5B, 0x35, 0xFB, 0x57, 0x03, 0x7E, + 0x81, 0xE0, 0x60, 0x48, 0x28, 0x36, 0x9E, 0x96, 0xE8, 0x6E, 0xCE, 0xAC, 0x54, 0x7D, 0xFF, 0x61, 0x80, 0x28, + 0x60, 0x1E, 0xA8, 0x08, 0x7E, 0x86, 0xA0, 0x62, 0xF8, 0x29, 0x82, 0x9E, 0xE1, 0xA8, 0x48, 0x7E, 0xB6, 0xA0, + 0x76, 0xF8, 0x26, 0xC2, 0x9A, 0xD1, 0xAB, 0x1C, 0x7F, 0x49, 0xE0, 0x36, 0xC8, 0x16, 0xD6, 0x8E, 0xDE, 0xE4, + 0x58, 0x4B, 0x7A, 0xB7, 0x63, 0x36, 0xA9, 0xD6, 0xFE, 0xDE, 0xC0, 0x58, 0x50, 0x3A, 0xBC, 0x13, 0x31, 0xCD, + 0xD4, 0x55, 0x9F, 0x7F, 0x28, 0x20, 0x1E, 0x98, 0x08, 0x6A, 0x86, 0xAF, 0x22, 0xFC, 0x19, 0x81, 0xCA, 0xE0, + 0x57, 0x08, 0x3E, 0x86, 0x90, 0x62, 0xEC, 0x29, 0x8D, 0xDE, 0xE5, 0x98, 0x4B, 0x2A, 0xB7, 0x5F, 0x36, 0xB8, + 0x16, 0xF2, 0x8E, 0xC5, 0xA4, 0x53, 0x3B, 0x7D, 0xD3, 0x61, 0x9D, 0xE8, 0x69, 0x8E, 0xAE, 0xE4, 0x7C, 0x4B, + 0x61, 0xF7, 0x68, 0x46, 0xAE, 0xB2, 0xFC, 0x75, 0x81, 0xE7, 0x20, 0x4A, 0x98, 0x37, 0x2A, 0x96, 0x9F, 0x2E, + 0xE8, 0x1C, 0x4E, 0x89, 0xF4, 0x66, 0xC7, 0x6A, 0xD2, 0xAF, 0x1D, 0xBC, 0x09, 0xB1, 0xC6, 0xF4, 0x52, 0xC7, + 0x7D, 0x92, 0xA1, 0xAD, 0xB8, 0x7D, 0xB2, 0xA1, 0xB5, 0xB8, 0x77, 0x32, 0xA6, 0x95, 0xBA, 0xEF, 0x33, 0x0C, + 0x15, 0xC5, 0xCF, 0x13, 0x14, 0x0D, 0xCF, 0x45, 0x94, 0x33, 0x2F, 0x55, 0xDC, 0x3F, 0x19, 0xD0, 0x0A, 0xDC, + 0x07, 0x19, 0xC2, 0x8A, 0xD1, 0xA7, 0x1C, 0x7A, 0x89, 0xE3, 0x26, 0xC9, 0xDA, 0xD6, 0xDB, 0x1E, 0xDB, 0x48, + 0x5B, 0x76, 0xBB, 0x66, 0xF3, 0x6A, 0xC5, 0xEF, 0x13, 0x0C, 0x0D, 0xC5, 0xC5, 0x93, 0x13, 0x2D, 0xCD, 0xDD, + 0x95, 0x99, 0xAF, 0x2A, 0xFC, 0x1F, 0x01, 0xC8, 0x00, 0x56, 0x80, 0x3E, 0xE0, 0x10, 0x48, 0x0C, 0x36, 0x85, + 0xD6, 0xE3, 0x1E, 0xC9, 0xC8, 0x56, 0xD6, 0xBE, 0xDE, 0xF0, 0x58, 0x44, 0x3A, 0xB3, 0x53, 0x35, 0xFD, 0xD7, + 0x01, 0x9E, 0x80, 0x68, 0x60, 0x2E, 0xA8, 0x1C, 0x7E, 0x89, 0xE0, 0x66, 0xC8, 0x2A, 0xD6, 0x9F, 0x1E, 0xE8, + 0x08, 0x4E, 0x86, 0xB4, 0x62, 0xF7, 0x69, 0x86, 0xAE, 0xE2, 0xFC, 0x49, 0x81, 0xF6, 0xE0, 0x46, 0xC8, 0x32, + 0xD6, 0x95, 0x9E, 0xEF, 0x28, 0x4C, 0x1E, 0xB5, 0xC8, 0x77, 0x16, 0xA6, 0x8E, 0xFA, 0xE4, 0x43, 0x0B, 0x71, + 0xC7, 0x64, 0x52, 0xAB, 0x7D, 0xBF, 0x61, 0xB0, 0x28, 0x74, 0x1E, 0xA7, 0x48, 0x7A, 0xB6, 0xA3, 0x36, 0xF9, + 0xD6, 0xC2, 0xDE, 0xD1, 0x98, 0x5C, 0x6A, 0xB9, 0xEF, 0x32, 0xCC, 0x15, 0x95, 0xCF, 0x2F, 0x14, 0x1C, 0x0F, + 0x49, 0xC4, 0x36, 0xD3, 0x56, 0xDD, 0xFE, 0xD9, 0x80, 0x5A, 0xE0, 0x3B, 0x08, 0x13, 0x46, 0x8D, 0xF2, 0xE5, + 0x85, 0x8B, 0x23, 0x27, 0x59, 0xDA, 0xBA, 0xDB, 0x33, 0x1B, 0x55, 0xCB, 0x7F, 0x17, 0x60, 0x0E, 0xA8, 0x04, + 0x7E, 0x83, 0x60, 0x61, 0xE8, 0x28, 0x4E, 0x9E, 0xB4, 0x68, 0x77, 0x6E, 0xA6, 0xAC, 0x7A, 0xFD, 0xE3, 0x01, + 0x89, 0xC0, 0x66, 0xD0, 0x2A, 0xDC, 0x1F, 0x19, 0xC8, 0x0A, 0xD6, 0x87, 0x1E, 0xE2, 0x88, 0x49, 0xA6, 0xB6, + 0xFA, 0xF6, 0xC3, 0x06, 0xD1, 0xC2, 0xDC, 0x51, 0x99, 0xFC, 0x6A, 0xC1, 0xEF, 0x10, 0x4C, 0x0C, 0x35, 0xC5, + 0xD7, 0x13, 0x1E, 0x8D, 0xC8, 0x65, 0x96, 0xAB, 0x2E, 0xFF, 0x5C, 0x40, 0x39, 0xF0, 0x12, 0xC4, 0x0D, 0x93, + 0x45, 0xAD, 0xF3, 0x3D, 0x85, 0xD1, 0xA3, 0x1C, 0x79, 0xC9, 0xE2, 0xD6, 0xC9, 0x9E, 0xD6, 0xE8, 0x5E, 0xCE, + 0xB8, 0x54, 0x72, 0xBF, 0x65, 0xB0, 0x2B, 0x34, 0x1F, 0x57, 0x48, 0x3E, 0xB6, 0x90, 0x76, 0xEC, 0x26, 0xCD, + 0xDA, 0xD5, 0x9B, 0x1F, 0x2B, 0x48, 0x1F, 0x76, 0x88, 0x26, 0xE6, 0x9A, 0xCA, 0xEB, 0x17, 0x0F, 0x4E, 0x84, + 0x34, 0x63, 0x57, 0x69, 0xFE, 0xAE, 0xC0, 0x7C, 0x50, 0x21, 0xFC, 0x18, 0x41, 0xCA, 0xB0, 0x57, 0x34, 0x3E, + 0x97, 0x50, 0x6E, 0xBC, 0x2C, 0x71, 0xDD, 0xE4, 0x59, 0x8B, 0x7A, 0xE7, 0x63, 0x0A, 0xA9, 0xC7, 0x3E, 0xD2, + 0x90, 0x5D, 0xAC, 0x39, 0xBD, 0xD2, 0xF1, 0x9D, 0x84, 0x69, 0xA3, 0x6E, 0xF9, 0xEC, 0x42, 0xCD, 0xF1, 0x95, + 0x84, 0x6F, 0x23, 0x6C, 0x19, 0xED, 0xCA, 0xCD, 0x97, 0x15, 0xAE, 0x8F, 0x3C, 0x64, 0x11, 0xEB, 0x4C, 0x4F, + 0x75, 0xF4, 0x27, 0x07, 0x5A, 0x82, 0xBB, 0x21, 0xB3, 0x58, 0x75, 0xFA, 0xA7, 0x03, 0x3A, 0x81, 0xD3, 0x20, + 0x5D, 0xD8, 0x39, 0x9A, 0x92, 0xEB, 0x2D, 0x8F, 0x5D, 0xA4, 0x39, 0xBB, 0x52, 0xF3, 0x7D, 0x85, 0xE1, 0xA3, + 0x08, 0x79, 0xC6, 0xA2, 0xD2, 0xF9, 0x9D, 0x82, 0xE9, 0xA1, 0x8E, 0xF8, 0x64, 0x42, 0xAB, 0x71, 0xBF, 0x64, + 0x70, 0x2B, 0x64, 0x1F, 0x6B, 0x48, 0x2F, 0x76, 0x9C, 0x26, 0xE9, 0xDA, 0xCE, 0xDB, 0x14, 0x5B, 0x4F, 0x7B, + 0x74, 0x23, 0x67, 0x59, 0xEA, 0xBA, 0xCF, 0x33, 0x14, 0x15, 0xCF, 0x4F, 0x14, 0x34, 0x0F, 0x57, 0x44, 0x3E, + 0xB3, 0x50, 0x75, 0xFC, 0x27, 0x01, 0xDA, 0x80, 0x5B, 0x20, 0x3B, 0x58, 0x13, 0x7A, 0x8D, 0xE3, 0x25, 0x89, + 0xDB, 0x26, 0xDB, 0x5A, 0xDB, 0x7B, 0x1B, 0x63, 0x4B, 0x69, 0xF7, 0x6E, 0xC6, 0xAC, 0x52, 0xFD, 0xFD, 0x81, + 0x81, 0xA0, 0x60, 0x78, 0x28, 0x22, 0x9E, 0x99, 0xA8, 0x6A, 0xFE, 0xAF, 0x00, 0x7C, 0x00, 0x21, 0xC0, 0x18, + 0x50, 0x0A, 0xBC, 0x07, 0x31, 0xC2, 0x94, 0x51, 0xAF, 0x7C, 0x7C, 0x21, 0xE1, 0xD8, 0x48, 0x5A, 0xB6, 0xBB, + 0x36, 0xF3, 0x56, 0xC5, 0xFE, 0xD3, 0x00, 0x5D, 0xC0, 0x39, 0x90, 0x12, 0xEC, 0x0D, 0x8D, 0xC5, 0xA5, 0x93, + 0x3B, 0x2D, 0xD3, 0x5D, 0x9D, 0xF9, 0xA9, 0x82, 0xFE, 0xE1, 0x80, 0x48, 0x60, 0x36, 0xA8, 0x16, 0xFE, 0x8E, + 0xC0, 0x64, 0x50, 0x2B, 0x7C, 0x1F, 0x61, 0xC8, 0x28, 0x56, 0x9E, 0xBE, 0xE8, 0x70, 0x4E, 0xA4, 0x34, 0x7B, + 0x57, 0x63, 0x7E, 0xA9, 0xE0, 0x7E, 0xC8, 0x20, 0x56, 0x98, 0x3E, 0xEA, 0x90, 0x4F, 0x2C, 0x34, 0x1D, 0xD7, + 0x49, 0x9E, 0xB6, 0xE8, 0x76, 0xCE, 0xA6, 0xD4, 0x7A, 0xDF, 0x63, 0x18, 0x29, 0xCA, 0x9E, 0xD7, 0x28, 0x5E, + 0x9E, 0xB8, 0x68, 0x72, 0xAE, 0xA5, 0xBC, 0x7B, 0x31, 0xE3, 0x54, 0x49, 0xFF, 0x76, 0xC0, 0x26, 0xD0, 0x1A, + 0xDC, 0x0B, 0x19, 0xC7, 0x4A, 0xD2, 0xB7, 0x1D, 0xB6, 0x89, 0xB6, 0xE6, 0xF6, 0xCA, 0xC6, 0xD7, 0x12, 0xDE, + 0x8D, 0x98, 0x65, 0xAA, 0xAB, 0x3F, 0x3F, 0x50, 0x10, 0x3C, 0x0C, 0x11, 0xC5, 0xCC, 0x53, 0x15, 0xFD, 0xCF, + 0x01, 0x94, 0x00, 0x6F, 0x40, 0x2C, 0x30, 0x1D, 0xD4, 0x09, 0x9F, 0x46, 0xE8, 0x32, 0xCE, 0x95, 0x94, 0x6F, + 0x2F, 0x6C, 0x1C, 0x2D, 0xC9, 0xDD, 0x96, 0xD9, 0xAE, 0xDA, 0xFC, 0x5B, 0x01, 0xFB, 0x40, 0x43, 0x70, 0x31, + 0xE4, 0x14, 0x4B, 0x4F, 0x77, 0x74, 0x26, 0xA7, 0x5A, 0xFA, 0xBB, 0x03, 0x33, 0x41, 0xD5, 0xF0, 0x5F, 0x04, + 0x38, 0x03, 0x52, 0x81, 0xFD, 0xA0, 0x41, 0xB8, 0x30, 0x72, 0x94, 0x25, 0xAF, 0x5B, 0x3C, 0x3B, 0x51, 0xD3, + 0x7C, 0x5D, 0xE1, 0xF9, 0x88, 0x42, 0xE6, 0xB1, 0x8A, 0xF4, 0x67, 0x07, 0x6A, 0x82, 0xAF, 0x21, 0xBC, 0x18, + 0x71, 0xCA, 0xA4, 0x57, 0x3B, 0x7E, 0x93, 0x60, 0x6D, 0xE8, 0x2D, 0x8E, 0x9D, 0xA4, 0x69, 0xBB, 0x6E, 0xF3, + 0x6C, 0x45, 0xED, 0xF3, 0x0D, 0x85, 0xC5, 0xA3, 0x13, 0x39, 0xCD, 0xD2, 0xD5, 0x9D, 0x9F, 0x29, 0xA8, 0x1E, + 0xFE, 0x88, 0x40, 0x66, 0xB0, 0x2A, 0xF4, 0x1F, 0x07, 0x48, 0x02, 0xB6, 0x81, 0xB6, 0xE0, 0x76, 0xC8, 0x26, + 0xD6, 0x9A, 0xDE, 0xEB, 0x18, 0x4F, 0x4A, 0xB4, 0x37, 0x37, 0x56, 0x96, 0xBE, 0xEE, 0xF0, 0x4C, 0x44, 0x35, + 0xF3, 0x57, 0x05, 0xFE, 0x83, 0x00, 0x61, 0xC0, 0x28, 0x50, 0x1E, 0xBC, 0x08, 0x71, 0xC6, 0xA4, 0x52, 0xFB, + 0x7D, 0x83, 0x61, 0xA1, 0xE8, 0x78, 0x4E, 0xA2, 0xB4, 0x79, 0xB7, 0x62, 0xF6, 0xA9, 0x86, 0xFE, 0xE2, 0xC0, + 0x49, 0x90, 0x36, 0xEC, 0x16, 0xCD, 0xCE, 0xD5, 0x94, 0x5F, 0x2F, 0x78, 0x1C, 0x22, 0x89, 0xD9, 0xA6, 0xDA, + 0xFA, 0xDB, 0x03, 0x1B, 0x41, 0xCB, 0x70, 0x57, 0x64, 0x3E, 0xAB, 0x50, 0x7F, 0x7C, 0x20, 0x21, 0xD8, 0x18, + 0x5A, 0x8A, 0xBB, 0x27, 0x33, 0x5A, 0x95, 0xFB, 0x2F, 0x03, 0x5C, 0x01, 0xF9, 0xC0, 0x42, 0xD0, 0x31, 0x9C, + 0x14, 0x69, 0xCF, 0x6E, 0xD4, 0x2C, 0x5F, 0x5D, 0xF8, 0x39, 0x82, 0x92, 0xE1, 0xAD, 0x88, 0x7D, 0xA6, 0xA1, + 0xBA, 0xF8, 0x73, 0x02, 0xA5, 0xC1, 0xBB, 0x10, 0x73, 0x4C, 0x25, 0xF5, 0xDB, 0x07, 0x1B, 0x42, 0x8B, 0x71, + 0xA7, 0x64, 0x7A, 0xAB, 0x63, 0x3F, 0x69, 0xD0, 0x2E, 0xDC, 0x1C, 0x59, 0xC9, 0xFA, 0xD6, 0xC3, 0x1E, 0xD1, + 0xC8, 0x5C, 0x56, 0xB9, 0xFE, 0xF2, 0xC0, 0x45, 0x90, 0x33, 0x2C, 0x15, 0xDD, 0xCF, 0x19, 0x94, 0x0A, 0xEF, + 0x47, 0x0C, 0x32, 0x85, 0xD5, 0xA3, 0x1F, 0x39, 0xC8, 0x12, 0xD6, 0x8D, 0x9E, 0xE5, 0xA8, 0x4B, 0x3E, 0xB7, + 0x50, 0x76, 0xBC, 0x26, 0xF1, 0xDA, 0xC4, 0x5B, 0x13, 0x7B, 0x4D, 0xE3, 0x75, 0x89, 0xE7, 0x26, 0xCA, 0x9A, + 0xD7, 0x2B, 0x1E, 0x9F, 0x48, 0x68, 0x36, 0xAE, 0x96, 0xFC, 0x6E, 0xC1, 0xEC, 0x50, 0x4D, 0xFC, 0x35, 0x81, + 0xD7, 0x20, 0x5E, 0x98, 0x38, 0x6A, 0x92, 0xAF, 0x2D, 0xBC, 0x1D, 0xB1, 0xC9, 0xB4, 0x56, 0xF7, 0x7E, 0xC6, + 0xA0, 0x52, 0xF8, 0x3D, 0x82, 0x91, 0xA1, 0xAC, 0x78, 0x7D, 0xE2, 0xA1, 0x89, 0xB8, 0x66, 0xF2, 0xAA, 0xC5, + 0xBF, 0x13, 0x30, 0x0D, 0xD4, 0x05, 0x9F, 0x43, 0x28, 0x31, 0xDE, 0x94, 0x58, 0x6F, 0x7A, 0xAC, 0x23, 0x3D, + 0xD9, 0xD1, 0x9A, 0xDC, 0x6B, 0x19, 0xEF, 0x4A, 0xCC, 0x37, 0x15, 0xD6, 0x8F, 0x1E, 0xE4, 0x08, 0x4B, 0x46, + 0xB7, 0x72, 0xF6, 0xA5, 0x86, 0xFB, 0x22, 0xC3, 0x59, 0x91, 0xFA, 0xEC, 0x43, 0x0D, 0xF1, 0xC5, 0x84, 0x53, + 0x23, 0x7D, 0xD9, 0xE1, 0x9A, 0xC8, 0x6B, 0x16, 0xAF, 0x4E, 0xFC, 0x34, 0x41, 0xD7, 0x70, 0x5E, 0xA4, 0x38, + 0x7B, 0x52, 0xA3, 0x7D, 0xB9, 0xE1, 0xB2, 0xC8, 0x75, 0x96, 0xA7, 0x2E, 0xFA, 0x9C, 0x43, 0x29, 0xF1, 0xDE, + 0xC4, 0x58, 0x53, 0x7A, 0xBD, 0xE3, 0x31, 0x89, 0xD4, 0x66, 0xDF, 0x6A, 0xD8, 0x2F, 0x1A, 0x9C, 0x0B, 0x29, + 0xC7, 0x5E, 0xD2, 0xB8, 0x5D, 0xB2, 0xB9, 0xB5, 0xB2, 0xF7, 0x35, 0x86, 0x97, 0x22, 0xEE, 0x99, 0x8C, 0x6A, + 0xE5, 0xEF, 0x0B, 0x0C, 0x07, 0x45, 0xC2, 0xB3, 0x11, 0xB5, 0xCC, 0x77, 0x15, 0xE6, 0x8F, 0x0A, 0xE4, 0x07, + 0x0B, 0x42, 0x87, 0x71, 0xA2, 0xA4, 0x79, 0xBB, 0x62, 0xF3, 0x69, 0x85, 0xEE, 0xE3, 0x0C, 0x49, 0xC5, 0xF6, + 0xD3, 0x06, 0xDD, 0xC2, 0xD9, 0x91, 0x9A, 0xEC, 0x6B, 0x0D, 0xEF, 0x45, 0x8C, 0x33, 0x25, 0xD5, 0xDB, 0x1F, + 0x1B, 0x48, 0x0B, 0x76, 0x87, 0x66, 0xE2, 0xAA, 0xC9, 0xBF, 0x16, 0xF0, 0x0E, 0xC4, 0x04, 0x53, 0x43, 0x7D, + 0xF1, 0xE1, 0x84, 0x48, 0x63, 0x76, 0xA9, 0xE6, 0xFE, 0xCA, 0xC0, 0x57, 0x10, 0x3E, 0x8C, 0x10, 0x65, 0xCC, + 0x2B, 0x15, 0xDF, 0x4F, 0x18, 0x34, 0x0A, 0x97, 0x47, 0x2E, 0xB2, 0x9C, 0x75, 0xA9, 0xE7, 0x3E, 0xCA, 0x90, + 0x57, 0x2C, 0x3E, 0x9D, 0xD0, 0x69, 0x9C, 0x2E, 0xE9, 0xDC, 0x4E, 0xD9, 0xF4, 0x5A, 0xC7, 0x7B, 0x12, 0xA3, + 0x4D, 0xB9, 0xF5, 0xB2, 0xC7, 0x35, 0x92, 0x97, 0x2D, 0xAE, 0x9D, 0xBC, 0x69, 0xB1, 0xEE, 0xF4, 0x4C, 0x47, + 0x75, 0xF2, 0xA7, 0x05, 0xBA, 0x83, 0x33, 0x21, 0xD5, 0xD8, 0x5F, 0x1A, 0xB8, 0x0B, 0x32, 0x87, 0x55, 0xA2, + 0xBF, 0x39, 0xB0, 0x12, 0xF4, 0x0D, 0x87, 0x45, 0xA2, 0xB3, 0x39, 0xB5, 0xD2, 0xF7, 0x1D, 0x86, 0x89, 0xA2, + 0xE6, 0xF9, 0x8A, 0xC2, 0xE7, 0x11, 0x8A, 0x8C, 0x67, 0x25, 0xEA, 0x9B, 0x0F, 0x2B, 0x44, 0x1F, 0x73, 0x48, + 0x25, 0xF6, 0x9B, 0x06, 0xEB, 0x42, 0xCF, 0x71, 0x94, 0x24, 0x6F, 0x5B, 0x6C, 0x3B, 0x6D, 0xD3, 0x6D, 0x9D, + 0xED, 0xA9, 0x8D, 0xBE, 0xE5, 0xB0, 0x4B, 0x34, 0x37, 0x57, 0x56, 0xBE, 0xBE, 0xF0, 0x70, 0x44, 0x24, 0x33, + 0x5B, 0x55, 0xFB, 0x7F, 0x03, 0x60, 0x01, 0xE8, 0x00, 0x4E, 0x80, 0x34, 0x60, 0x17, 0x68, 0x0E, 0xAE, 0x84, + 0x7C, 0x63, 0x61, 0xE9, 0xE8, 0x4E, 0xCE, 0xB4, 0x54, 0x77, 0x7F, 0x66, 0xA0, 0x2A, 0xF8, 0x1F, 0x02, 0x88, + 0x01, 0xA6, 0x80, 0x7A, 0xE0, 0x23, 0x08, 0x19, 0xC6, 0x8A, 0xD2, 0xE7, 0x1D, 0x8A, 0x89, 0xA7, 0x26, 0xFA, + 0x9A, 0xC3, 0x2B, 0x11, 0xDF, 0x4C, 0x58, 0x35, 0xFA, 0x97, 0x03, 0x2E, 0x81, 0xDC, 0x60, 0x59, 0xE8, 0x3A, + 0xCE, 0x93, 0x14, 0x6D, 0xCF, 0x6D, 0x94, 0x2D, 0xAF, 0x5D, 0xBC, 0x39, 0xB1, 0xD2, 0xF4, 0x5D, 0x87, 0x79, + 0xA2, 0xA2, 0xF9, 0xB9, 0x82, 0xF2, 0xE1, 0x85, 0x88, 0x63, 0x26, 0xA9, 0xDA, 0xFE, 0xDB, 0x00, 0x5B, 0x40, + 0x3B, 0x70, 0x13, 0x64, 0x0D, 0xEB, 0x45, 0x8F, 0x73, 0x24, 0x25, 0xDB, 0x5B, 0x1B, 0x7B, 0x4B, 0x63, 0x77, + 0x69, 0xE6, 0xAE, 0xCA, 0xFC, 0x57, 0x01, 0xFE, 0x80, 0x40, 0x60, 0x30, 0x28, 0x14, 0x1E, 0x8F, 0x48, 0x64, + 0x36, 0xAB, 0x56, 0xFF, 0x7E, 0xC0, 0x20, 0x50, 0x18, 0x3C, 0x0A, 0x91, 0xC7, 0x2C, 0x52, 0x9D, 0xFD, 0xA9, + 0x81, 0xBE, 0xE0, 0x70, 0x48, 0x24, 0x36, 0x9B, 0x56, 0xEB, 0x7E, 0xCF, 0x60, 0x54, 0x28, 0x3F, 0x5E, 0x90, + 0x38, 0x6C, 0x12, 0xAD, 0xCD, 0xBD, 0x95, 0xB1, 0xAF, 0x34, 0x7C, 0x17, 0x61, 0xCE, 0xA8, 0x54, 0x7E, 0xBF, + 0x60, 0x70, 0x28, 0x24, 0x1E, 0x9B, 0x48, 0x6B, 0x76, 0xAF, 0x66, 0xFC, 0x2A, 0xC1, 0xDF, 0x10, 0x58, 0x0C, + 0x3A, 0x85, 0xD3, 0x23, 0x1D, 0xD9, 0xC9, 0x9A, 0xD6, 0xEB, 0x1E, 0xCF, 0x48, 0x54, 0x36, 0xBF, 0x56, 0xF0, + 0x3E, 0xC4, 0x10, 0x53, 0x4C, 0x3D, 0xF5, 0xD1, 0x87, 0x1C, 0x62, 0x89, 0xE9, 0xA6, 0xCE, 0xFA, 0xD4, 0x43, + 0x1F, 0x71, 0xC8, 0x24, 0x56, 0x9B, 0x7E, 0xEB, 0x60, 0x4F, 0x68, 0x34, 0x2E, 0x97, 0x5C, 0x6E, 0xB9, 0xEC, + 0x72, 0xCD, 0xE5, 0x95, 0x8B, 0x2F, 0x27, 0x5C, 0x1A, 0xB9, 0xCB, 0x32, 0xD7, 0x55, 0x9E, 0xBF, 0x28, 0x70, + 0x1E, 0xA4, 0x08, 0x7B, 0x46, 0xA3, 0x72, 0xF9, 0xE5, 0x82, 0xCB, 0x21, 0x97, 0x58, 0x6E, 0xBA, 0xAC, 0x73, + 0x3D, 0xE5, 0xD1, 0x8B, 0x1C, 0x67, 0x49, 0xEA, 0xB6, 0xCF, 0x36, 0xD4, 0x16, 0xDF, 0x4E, 0xD8, 0x34, 0x5A, + 0x97, 0x7B, 0x2E, 0xA3, 0x5C, 0x79, 0xF9, 0xE2, 0xC2, 0xC9, 0x91, 0x96, 0xEC, 0x6E, 0xCD, 0xEC, 0x55, 0x8D, + 0xFF, 0x25, 0x80, 0x1B, 0x20, 0x0B, 0x58, 0x07, 0x7A, 0x82, 0xA3, 0x21, 0xB9, 0xD8, 0x72, 0xDA, 0xA5, 0x9B, + 0x3B, 0x2B, 0x53, 0x5F, 0x7D, 0xF8, 0x21, 0x82, 0x98, 0x61, 0xAA, 0xA8, 0x7F, 0x3E, 0xA0, 0x10, 0x78, 0x0C, + 0x22, 0x85, 0xD9, 0xA3, 0x1A, 0xF9, 0xCB, 0x02, 0xD7, 0x41, 0x9E, 0xB0, 0x68, 0x74, 0x2E, 0xA7, 0x5C, 0x7A, + 0xB9, 0xE3, 0x32, 0xC9, 0xD5, 0x96, 0xDF, 0x2E, 0xD8, 0x1C, 0x5A, 0x89, 0xFB, 0x26, 0xC3, 0x5A, 0xD1, 0xFB, + 0x1C, 0x43, 0x49, 0xF1, 0xF6, 0xC4, 0x46, 0xD3, 0x72, 0xDD, 0xE5, 0x99 + }; + + public static readonly byte[] SyncMark = + { + 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00 + }; + + public static byte[] Scramble(byte[] sector) + { + if(sector == null || sector.Length < 2352) + return sector; + + var sync = new byte[12]; + Array.Copy(sector, 0, sync, 0, 12); + + if(!SyncMark.SequenceEqual(sync)) + return sector; + + var scrambled = new byte[sector.Length]; + + for(var i = 0; i < 2352; i++) + scrambled[i] = (byte)(sector[i] ^ ScrambleTable[i]); + + if(sector.Length <= 2352) + return scrambled; + + for(var i = 2352; i < sector.Length; i++) + scrambled[i] = sector[i]; + + return scrambled; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static byte[] GetUserData(byte[] data, bool interleaved = false, byte fileNumber = 0) + { + switch(data.Length) + { + case 2352 when data[0] != 0x00 || + data[1] != 0xFF || + data[2] != 0xFF || + data[3] != 0xFF || + data[4] != 0xFF || + data[5] != 0xFF || + data[6] != 0xFF || + data[7] != 0xFF || + data[8] != 0xFF || + data[9] != 0xFF || + data[10] != 0xFF || + data[11] != 0x00: + return data; + case 2352: + switch(data[15]) + { + case 0: + return new byte[2048]; + case 1: + var sector = new byte[2048]; + Array.Copy(data, 16, sector, 0, 2048); + + return sector; + case 2: + return GetUserDataFromMode2(data, interleaved, fileNumber); + default: + return data; + } + case 2336: + return GetUserDataFromMode2(data, interleaved, fileNumber); + default: + return data; + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static byte[] GetUserDataFromMode2(byte[] data, bool interleaved = false, byte fileNumber = 0) + { + if(data.Length != 2352 && data.Length != 2336) + return data; + + var pos = 0; + + if(data.Length == 2352) + { + if(data[0] != 0x00 || + data[1] != 0xFF || + data[2] != 0xFF || + data[3] != 0xFF || + data[4] != 0xFF || + data[5] != 0xFF || + data[6] != 0xFF || + data[7] != 0xFF || + data[8] != 0xFF || + data[9] != 0xFF || + data[10] != 0xFF || + data[11] != 0x00 || + data[15] != 0x02) + return data; + + pos = 16; + } + + // This is not the sector you are looking for + if(interleaved && data[pos] != fileNumber) + return null; + + int len = (data[pos + 2] & 0x20) == 0x20 ? 2324 : 2048; + pos += 8; + + var sector = new byte[len]; + Array.Copy(data, pos, sector, 0, len); + + return sector; + } + + public static string Prettify(byte[] buffer) + { + if(buffer is null || buffer.Length <= 0) + return null; + + if(buffer[0] != 0x00 || + buffer[1] != 0xFF || + buffer[2] != 0xFF || + buffer[3] != 0xFF || + buffer[4] != 0xFF || + buffer[5] != 0xFF || + buffer[6] != 0xFF || + buffer[7] != 0xFF || + buffer[8] != 0xFF || + buffer[9] != 0xFF || + buffer[10] != 0xFF || + buffer[11] != 0x00) + return Localization.CD_sector; + + var sb = new StringBuilder(); + + sb.AppendLine(Localization.CD_ROM_sector); + + byte min = buffer[12]; + byte sec = buffer[13]; + byte frame = buffer[14]; + var lba = 0; + var moreThan90 = false; + + if(min > 0x90) + { + lba += 405000; + min -= 0x90; + moreThan90 = true; + } + + lba += ((min >> 4) * 10 + (min & 0x0F)) * 75 * 60; + lba += ((sec >> 4) * 10 + (sec & 0x0F)) * 75; + lba += (frame >> 4) * 10 + (frame & 0x0F); + lba -= 150; + + if(moreThan90) + min += 0x90; + + sb.AppendFormat(Localization.Position_0_1_2_LBA_3, min, sec, frame, lba).AppendLine(); + + switch(buffer[15] & 0x03) + { + case 0: + sb.AppendLine(Localization.Mode_0); + + break; + case 1: + sb.AppendLine(Localization.Mode_1); + + break; + case 2: + sb.AppendLine(Localization.Mode_2); + + break; + case 3: + sb.AppendLine(Localization.Invalid_mode_3); + + break; + } + + switch((buffer[15] & 0xE0) >> 5) + { + case 0: + sb.AppendLine(Localization.User_data_block); + + break; + case 1: + sb.AppendLine(Localization.Fourth_run_in_block); + + break; + case 2: + sb.AppendLine(Localization.Third_run_in_block); + + break; + case 3: + sb.AppendLine(Localization.Second_run_in_block); + + break; + case 4: + sb.AppendLine(Localization.First_run_in_block); + + break; + case 5: + sb.AppendLine(Localization.Link_block); + + break; + case 6: + sb.AppendLine(Localization.Second_run_out_block); + + break; + case 7: + sb.AppendLine(Localization.First_run_out_block); + + break; + } + + CdChecksums.CheckCdSector(buffer, out bool? correctEccP, out bool? correctEccQ, out bool? correctEdc); + + var empty = true; + + switch(buffer[15] & 0x03) + { + case 0: + + for(var i = 16; i < 2352; i++) + { + if(buffer[i] == 0x00) + continue; + + empty = false; + + break; + } + + sb.AppendLine(empty ? Localization.Correct_sector_contents : Localization.Incorrect_sector_contents); + + break; + case 1: + sb.AppendLine(correctEdc == true ? Localization.Correct_EDC : Localization.Incorrect_EDC); + sb.AppendLine(correctEccP == true ? Localization.Correct_ECC_P : Localization.Incorrect_ECC_P); + sb.AppendLine(correctEccQ == true ? Localization.Correct_ECC_Q : Localization.Incorrect_ECC_Q); + + for(var i = 2068; i < 2076; i++) + { + if(buffer[i] == 0x00) + continue; + + empty = false; + + break; + } + + sb.AppendLine(empty ? Localization.Correct_zero_fill : Localization.Incorrect_zero_fill); + + break; + case 2: + if(buffer[16] != buffer[20] || + buffer[17] != buffer[21] || + buffer[18] != buffer[22] || + buffer[19] != buffer[23]) + { + sb.AppendLine(Localization.Subheader_copies_differ); + sb.AppendLine(correctEdc == true ? Localization.Correct_EDC : Localization.Incorrect_EDC); + sb.AppendLine(correctEccP == true ? Localization.Correct_ECC_P : Localization.Incorrect_ECC_P); + sb.AppendLine(correctEccQ == true ? Localization.Correct_ECC_Q : Localization.Incorrect_ECC_Q); + + break; + } + + sb.AppendFormat(Localization.File_number_0, buffer[16]).AppendLine(); + sb.AppendFormat(Localization.Channel_number_0, buffer[17]).AppendLine(); + sb.AppendFormat(Localization.Coding_information_number_0, buffer[19]).AppendLine(); + + if((buffer[18] & 0x80) == 0x80) + sb.AppendLine(Localization.End_of_file); + + if((buffer[18] & 0x40) == 0x40) + sb.AppendLine(Localization.Real_time_block); + + sb.AppendLine((buffer[18] & 0x20) == 0x20 ? Localization.Form_2 : Localization.Form_1); + + if((buffer[18] & 0x10) == 0x10) + sb.AppendLine(Localization.Trigger_block); + + if((buffer[18] & 0x08) == 0x08) + sb.AppendLine(Localization.Data_block); + + if((buffer[18] & 0x04) == 0x04) + sb.AppendLine(Localization.Audio_block); + + if((buffer[18] & 0x02) == 0x02) + sb.AppendLine(Localization.Video_block); + + if((buffer[18] & 0x01) == 0x01) + sb.AppendLine(Localization.End_of_record); + + if((buffer[18] & 0x20) != 0x20) + { + sb.AppendLine(correctEccP == true ? Localization.Correct_ECC_P : Localization.Incorrect_ECC_P); + sb.AppendLine(correctEccQ == true ? Localization.Correct_ECC_Q : Localization.Incorrect_ECC_Q); + } + + sb.AppendLine(correctEdc == true ? Localization.Correct_EDC : Localization.Incorrect_EDC); + + break; + } + + return sb.ToString(); + } +} \ No newline at end of file diff --git a/Aaru.Decoders/CD/SectorBuilder.cs b/Aaru.Decoders/CD/SectorBuilder.cs new file mode 100644 index 000000000..3cdf3bb2d --- /dev/null +++ b/Aaru.Decoders/CD/SectorBuilder.cs @@ -0,0 +1,239 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : SectorBuilder.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ License ] -------------------------------------------------------------- +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using Aaru.CommonTypes.Enums; + +namespace Aaru.Decoders.CD; + +public class SectorBuilder +{ + readonly byte[] _eccBTable; + readonly byte[] _eccFTable; + readonly uint[] _edcTable; + + public SectorBuilder() + { + _eccFTable = new byte[256]; + _eccBTable = new byte[256]; + _edcTable = new uint[256]; + + for(uint i = 0; i < 256; i++) + { + uint edc = i; + var j = (uint)(i << 1 ^ ((i & 0x80) == 0x80 ? 0x11D : 0)); + _eccFTable[i] = (byte)j; + _eccBTable[i ^ j] = (byte)i; + + for(j = 0; j < 8; j++) + edc = edc >> 1 ^ ((edc & 1) > 0 ? 0xD8018001 : 0); + + _edcTable[i] = edc; + } + } + + static (byte minute, byte second, byte frame) LbaToMsf(long pos) => + ((byte)((pos + 150) / 75 / 60), (byte)((pos + 150) / 75 % 60), (byte)((pos + 150) % 75)); + + public void ReconstructPrefix(ref byte[] sector, // must point to a full 2352-byte sector + TrackType type, long lba) + { + // + // Sync + // + sector[0x000] = 0x00; + sector[0x001] = 0xFF; + sector[0x002] = 0xFF; + sector[0x003] = 0xFF; + sector[0x004] = 0xFF; + sector[0x005] = 0xFF; + sector[0x006] = 0xFF; + sector[0x007] = 0xFF; + sector[0x008] = 0xFF; + sector[0x009] = 0xFF; + sector[0x00A] = 0xFF; + sector[0x00B] = 0x00; + + (byte minute, byte second, byte frame) msf = LbaToMsf(lba); + + sector[0x00C] = (byte)((msf.minute / 10 << 4) + msf.minute % 10); + sector[0x00D] = (byte)((msf.second / 10 << 4) + msf.second % 10); + sector[0x00E] = (byte)((msf.frame / 10 << 4) + msf.frame % 10); + + switch(type) + { + case TrackType.CdMode1: + // + // Mode + // + sector[0x00F] = 0x01; + + break; + case TrackType.CdMode2Form1: + case TrackType.CdMode2Form2: + case TrackType.CdMode2Formless: + // + // Mode + // + sector[0x00F] = 0x02; + + // + // Flags + // + sector[0x010] = sector[0x014]; + sector[0x011] = sector[0x015]; + sector[0x012] = sector[0x016]; + sector[0x013] = sector[0x017]; + + break; + default: + return; + } + } + + uint ComputeEdc(uint edc, byte[] src, int size, int srcOffset = 0) + { + int pos = srcOffset; + + for(; size > 0; size--) + edc = edc >> 8 ^ _edcTable[(edc ^ src[pos++]) & 0xFF]; + + return edc; + } + + public void ReconstructEcc(ref byte[] sector, // must point to a full 2352-byte sector + TrackType type) + { + byte[] computedEdc; + + switch(type) + { + // + // Compute EDC + // + case TrackType.CdMode1: + computedEdc = BitConverter.GetBytes(ComputeEdc(0, sector, 0x810)); + sector[0x810] = computedEdc[0]; + sector[0x811] = computedEdc[1]; + sector[0x812] = computedEdc[2]; + sector[0x813] = computedEdc[3]; + + break; + case TrackType.CdMode2Form1: + computedEdc = BitConverter.GetBytes(ComputeEdc(0, sector, 0x808, 0x10)); + sector[0x818] = computedEdc[0]; + sector[0x819] = computedEdc[1]; + sector[0x81A] = computedEdc[2]; + sector[0x81B] = computedEdc[3]; + + break; + case TrackType.CdMode2Form2: + computedEdc = BitConverter.GetBytes(ComputeEdc(0, sector, 0x91C, 0x10)); + sector[0x92C] = computedEdc[0]; + sector[0x92D] = computedEdc[1]; + sector[0x92E] = computedEdc[2]; + sector[0x92F] = computedEdc[3]; + + break; + default: + return; + } + + var zeroaddress = new byte[4]; + + switch(type) + { + // + // Compute ECC + // + case TrackType.CdMode1: + // + // Reserved + // + sector[0x814] = 0x00; + sector[0x815] = 0x00; + sector[0x816] = 0x00; + sector[0x817] = 0x00; + sector[0x818] = 0x00; + sector[0x819] = 0x00; + sector[0x81A] = 0x00; + sector[0x81B] = 0x00; + EccWriteSector(sector, sector, ref sector, 0xC, 0x10, 0x81C); + + break; + case TrackType.CdMode2Form1: + EccWriteSector(zeroaddress, sector, ref sector, 0, 0x10, 0x81C); + + break; + default: + return; + } + + // + // Done + // + } + + void EccWriteSector(byte[] address, byte[] data, ref byte[] ecc, int addressOffset, int dataOffset, int eccOffset) + { + WriteEcc(address, data, 86, 24, 2, 86, ref ecc, addressOffset, dataOffset, eccOffset); // P + WriteEcc(address, data, 52, 43, 86, 88, ref ecc, addressOffset, dataOffset, eccOffset + 0xAC); // Q + } + + void WriteEcc(byte[] address, byte[] data, uint majorCount, uint minorCount, uint majorMult, uint minorInc, + ref byte[] ecc, int addressOffset, int dataOffset, int eccOffset) + { + uint size = majorCount * minorCount; + uint major; + + for(major = 0; major < majorCount; major++) + { + uint idx = (major >> 1) * majorMult + (major & 1); + byte eccA = 0; + byte eccB = 0; + uint minor; + + for(minor = 0; minor < minorCount; minor++) + { + byte temp = idx < 4 ? address[idx + addressOffset] : data[idx + dataOffset - 4]; + idx += minorInc; + + if(idx >= size) + idx -= size; + + eccA ^= temp; + eccB ^= temp; + eccA = _eccFTable[eccA]; + } + + eccA = _eccBTable[_eccFTable[eccA] ^ eccB]; + ecc[major + eccOffset] = eccA; + ecc[major + majorCount + eccOffset] = (byte)(eccA ^ eccB); + } + } +} \ No newline at end of file diff --git a/Aaru.Decoders/CD/Session.cs b/Aaru.Decoders/CD/Session.cs new file mode 100644 index 000000000..8ce02683c --- /dev/null +++ b/Aaru.Decoders/CD/Session.cs @@ -0,0 +1,235 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : Session.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes CD session structures. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; +using Aaru.Console; +using Aaru.Helpers; + +namespace Aaru.Decoders.CD; + +// Information from the following standards: +// ANSI X3.304-1997 +// T10/1048-D revision 9.0 +// T10/1048-D revision 10a +// T10/1228-D revision 7.0c +// T10/1228-D revision 11a +// T10/1363-D revision 10g +// T10/1545-D revision 1d +// T10/1545-D revision 5 +// T10/1545-D revision 5a +// T10/1675-D revision 2c +// T10/1675-D revision 4 T10/1836-D revision 2g +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static class Session +{ + const string MODULE_NAME = "CD Session Info decoder"; + + public static CDSessionInfo? Decode(byte[] CDSessionInfoResponse) + { + if(CDSessionInfoResponse is not { Length: > 4 }) + return null; + + var decoded = new CDSessionInfo + { + DataLength = BigEndianBitConverter.ToUInt16(CDSessionInfoResponse, 0), + FirstCompleteSession = CDSessionInfoResponse[2], + LastCompleteSession = CDSessionInfoResponse[3] + }; + + decoded.TrackDescriptors = new TrackDataDescriptor[(decoded.DataLength - 2) / 8]; + + if(decoded.DataLength + 2 != CDSessionInfoResponse.Length) + { + AaruConsole.DebugWriteLine(MODULE_NAME, + Localization. + Expected_CDSessionInfo_size_0_bytes_is_not_received_size_1_bytes_not_decoding, + decoded.DataLength + 2, CDSessionInfoResponse.Length); + + return null; + } + + for(var i = 0; i < (decoded.DataLength - 2) / 8; i++) + { + decoded.TrackDescriptors[i].Reserved1 = CDSessionInfoResponse[0 + i * 8 + 4]; + decoded.TrackDescriptors[i].ADR = (byte)((CDSessionInfoResponse[1 + i * 8 + 4] & 0xF0) >> 4); + decoded.TrackDescriptors[i].CONTROL = (byte)(CDSessionInfoResponse[1 + i * 8 + 4] & 0x0F); + decoded.TrackDescriptors[i].TrackNumber = CDSessionInfoResponse[2 + i * 8 + 4]; + decoded.TrackDescriptors[i].Reserved2 = CDSessionInfoResponse[3 + i * 8 + 4]; + + decoded.TrackDescriptors[i].TrackStartAddress = + BigEndianBitConverter.ToUInt32(CDSessionInfoResponse, 4 + i * 8 + 4); + } + + return decoded; + } + + public static string Prettify(CDSessionInfo? CDSessionInfoResponse) + { + if(CDSessionInfoResponse == null) + return null; + + CDSessionInfo response = CDSessionInfoResponse.Value; + + var sb = new StringBuilder(); + + sb.AppendFormat(Localization.First_complete_session_number_0, response.FirstCompleteSession).AppendLine(); + sb.AppendFormat(Localization.Last_complete_session_number_0, response.LastCompleteSession).AppendLine(); + + foreach(TrackDataDescriptor descriptor in response.TrackDescriptors) + { + sb.AppendFormat(Localization.First_track_number_in_last_complete_session_0, descriptor.TrackNumber). + AppendLine(); + + sb.AppendFormat(Localization.Track_starts_at_LBA_0_or_MSF_2_3, descriptor.TrackStartAddress, + (descriptor.TrackStartAddress & 0x0000FF00) >> 8, + (descriptor.TrackStartAddress & 0x00FF0000) >> 16, + (descriptor.TrackStartAddress & 0xFF000000) >> 24). + AppendLine(); + + switch((TocAdr)descriptor.ADR) + { + case TocAdr.NoInformation: + sb.AppendLine(Localization.Q_subchannel_mode_not_given); + + break; + case TocAdr.CurrentPosition: + sb.AppendLine(Localization.Q_subchannel_stores_current_position); + + break; + case TocAdr.ISRC: + sb.AppendLine(Localization.Q_subchannel_stores_ISRC); + + break; + case TocAdr.MediaCatalogNumber: + sb.AppendLine(Localization.Q_subchannel_stores_media_catalog_number); + + break; + } + + if((descriptor.CONTROL & (byte)TocControl.ReservedMask) == (byte)TocControl.ReservedMask) + sb.AppendFormat(Localization.Reserved_flags_0_set, descriptor.CONTROL).AppendLine(); + else + { + switch((TocControl)(descriptor.CONTROL & 0x0D)) + { + case TocControl.TwoChanNoPreEmph: + sb.AppendLine(Localization.Stereo_audio_track_with_no_pre_emphasis); + + break; + case TocControl.TwoChanPreEmph: + sb.AppendLine(Localization.Stereo_audio_track_with_50_15_us_pre_emphasis); + + break; + case TocControl.FourChanNoPreEmph: + sb.AppendLine(Localization.Quadraphonic_audio_track_with_no_pre_emphasis); + + break; + case TocControl.FourChanPreEmph: + sb.AppendLine(Localization.Stereo_audio_track_with_50_15_us_pre_emphasis); + + break; + case TocControl.DataTrack: + sb.AppendLine(Localization.Data_track_recorded_uninterrupted); + + break; + case TocControl.DataTrackIncremental: + sb.AppendLine(Localization.Data_track_recorded_incrementally); + + break; + } + + sb.AppendLine((descriptor.CONTROL & (byte)TocControl.CopyPermissionMask) == + (byte)TocControl.CopyPermissionMask + ? Localization.Digital_copy_of_track_is_permitted + : Localization.Digital_copy_of_track_is_prohibited); + + #if DEBUG + if(descriptor.Reserved1 != 0) + sb.AppendFormat(Localization.Reserved1_equals_0_X8, descriptor.Reserved1).AppendLine(); + + if(descriptor.Reserved2 != 0) + sb.AppendFormat(Localization.Reserved2_equals_0_X8, descriptor.Reserved2).AppendLine(); + #endif + + sb.AppendLine(); + } + } + + return sb.ToString(); + } + + public static string Prettify(byte[] CDSessionInfoResponse) + { + CDSessionInfo? decoded = Decode(CDSessionInfoResponse); + + return Prettify(decoded); + } + +#region Nested type: CDSessionInfo + + public struct CDSessionInfo + { + /// Total size of returned session information minus this field + public ushort DataLength; + /// First track number in hex + public byte FirstCompleteSession; + /// Last track number in hex + public byte LastCompleteSession; + /// Track descriptors + public TrackDataDescriptor[] TrackDescriptors; + } + +#endregion + +#region Nested type: TrackDataDescriptor + + public struct TrackDataDescriptor + { + /// Byte 0 Reserved + public byte Reserved1; + /// Byte 1, bits 7 to 4 Type of information in Q subchannel of block where this TOC entry was found + public byte ADR; + /// Byte 1, bits 3 to 0 Track attributes + public byte CONTROL; + /// Byte 2 First track number in last complete session + public byte TrackNumber; + /// Byte 3 Reserved + public byte Reserved2; + /// Bytes 4 to 7 First track number in last complete session start address in LBA or in MSF + public uint TrackStartAddress; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/CD/Subchannel.cs b/Aaru.Decoders/CD/Subchannel.cs new file mode 100644 index 000000000..24e679e4a --- /dev/null +++ b/Aaru.Decoders/CD/Subchannel.cs @@ -0,0 +1,843 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : Subchannel.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ License ] -------------------------------------------------------------- +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using Aaru.Checksums; + +namespace Aaru.Decoders.CD; + +public static class Subchannel +{ + static readonly string[] _isrcTable = + { + // 0x00 + "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "", "", "", "", "", "", + + // 0x10 + "", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", + + // 0x20 + "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "", "", "", "", "", + + // 0x30 + "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" + }; + + public static void BinaryToBcdQ(byte[] q) + { + if((q[0] & 0xF) == 1 || (q[0] & 0xF) == 5) + { + q[1] = (byte)((q[1] / 10 << 4) + q[1] % 10); + q[2] = (byte)((q[2] / 10 << 4) + q[2] % 10); + q[3] = (byte)((q[3] / 10 << 4) + q[3] % 10); + q[4] = (byte)((q[4] / 10 << 4) + q[4] % 10); + q[5] = (byte)((q[5] / 10 << 4) + q[5] % 10); + q[6] = (byte)((q[6] / 10 << 4) + q[6] % 10); + q[7] = (byte)((q[7] / 10 << 4) + q[7] % 10); + q[8] = (byte)((q[8] / 10 << 4) + q[8] % 10); + } + + q[9] = (byte)((q[9] / 10 << 4) + q[9] % 10); + } + + public static void BcdToBinaryQ(byte[] q) + { + if((q[0] & 0xF) == 1 || (q[0] & 0xF) == 5) + { + q[1] = (byte)(q[1] / 16 * 10 + (q[1] & 0x0F)); + q[2] = (byte)(q[2] / 16 * 10 + (q[2] & 0x0F)); + q[3] = (byte)(q[3] / 16 * 10 + (q[3] & 0x0F)); + q[4] = (byte)(q[4] / 16 * 10 + (q[4] & 0x0F)); + q[5] = (byte)(q[5] / 16 * 10 + (q[5] & 0x0F)); + q[6] = (byte)(q[6] / 16 * 10 + (q[6] & 0x0F)); + q[7] = (byte)(q[7] / 16 * 10 + (q[7] & 0x0F)); + q[8] = (byte)(q[8] / 16 * 10 + (q[8] & 0x0F)); + } + + q[9] = (byte)(q[9] / 16 * 10 + (q[9] & 0x0F)); + } + + public static byte[] ConvertQToRaw(byte[] subchannel) + { + var pos = 0; + var subBuf = new byte[subchannel.Length * 6]; + + for(var i = 0; i < subchannel.Length; i += 16) + { + // P + if((subchannel[i + 15] & 0x80) <= 0) + pos += 12; + else + { + subBuf[pos++] = 0xFF; + subBuf[pos++] = 0xFF; + subBuf[pos++] = 0xFF; + subBuf[pos++] = 0xFF; + subBuf[pos++] = 0xFF; + subBuf[pos++] = 0xFF; + subBuf[pos++] = 0xFF; + subBuf[pos++] = 0xFF; + subBuf[pos++] = 0xFF; + subBuf[pos++] = 0xFF; + subBuf[pos++] = 0xFF; + subBuf[pos++] = 0xFF; + } + + // Q + subBuf[pos++] = subchannel[i + 0]; + subBuf[pos++] = subchannel[i + 1]; + subBuf[pos++] = subchannel[i + 2]; + subBuf[pos++] = subchannel[i + 3]; + subBuf[pos++] = subchannel[i + 4]; + subBuf[pos++] = subchannel[i + 5]; + subBuf[pos++] = subchannel[i + 6]; + subBuf[pos++] = subchannel[i + 7]; + subBuf[pos++] = subchannel[i + 8]; + subBuf[pos++] = subchannel[i + 9]; + subBuf[pos++] = subchannel[i + 10]; + subBuf[pos++] = subchannel[i + 11]; + + // R to W + pos += 72; + } + + return Interleave(subBuf); + } + + public static byte[] Interleave(byte[] subchannel) + { + var subBuf = new byte[subchannel.Length]; + + var outPos = 0; + + for(var inPos = 0; inPos < subchannel.Length; inPos += 96) + { + for(var i = 0; i < 12; i++) + { + // P + subBuf[outPos + 0] += (byte)(subchannel[inPos + i + 0] & 0x80); + subBuf[outPos + 1] += (byte)((subchannel[inPos + i + 0] & 0x40) << 1); + subBuf[outPos + 2] += (byte)((subchannel[inPos + i + 0] & 0x20) << 2); + subBuf[outPos + 3] += (byte)((subchannel[inPos + i + 0] & 0x10) << 3); + subBuf[outPos + 4] += (byte)((subchannel[inPos + i + 0] & 0x08) << 4); + subBuf[outPos + 5] += (byte)((subchannel[inPos + i + 0] & 0x04) << 5); + subBuf[outPos + 6] += (byte)((subchannel[inPos + i + 0] & 0x02) << 6); + subBuf[outPos + 7] += (byte)((subchannel[inPos + i + 0] & 0x01) << 7); + + // Q + subBuf[outPos + 0] += (byte)((subchannel[inPos + i + 12] & 0x80) >> 1); + subBuf[outPos + 1] += (byte)(subchannel[inPos + i + 12] & 0x40); + subBuf[outPos + 2] += (byte)((subchannel[inPos + i + 12] & 0x20) << 1); + subBuf[outPos + 3] += (byte)((subchannel[inPos + i + 12] & 0x10) << 2); + subBuf[outPos + 4] += (byte)((subchannel[inPos + i + 12] & 0x08) << 3); + subBuf[outPos + 5] += (byte)((subchannel[inPos + i + 12] & 0x04) << 4); + subBuf[outPos + 6] += (byte)((subchannel[inPos + i + 12] & 0x02) << 5); + subBuf[outPos + 7] += (byte)((subchannel[inPos + i + 12] & 0x01) << 6); + + // R + subBuf[outPos + 0] += (byte)((subchannel[inPos + i + 24] & 0x80) >> 2); + subBuf[outPos + 1] += (byte)((subchannel[inPos + i + 24] & 0x40) >> 1); + subBuf[outPos + 2] += (byte)(subchannel[inPos + i + 24] & 0x20); + subBuf[outPos + 3] += (byte)((subchannel[inPos + i + 24] & 0x10) << 1); + subBuf[outPos + 4] += (byte)((subchannel[inPos + i + 24] & 0x08) << 2); + subBuf[outPos + 5] += (byte)((subchannel[inPos + i + 24] & 0x04) << 3); + subBuf[outPos + 6] += (byte)((subchannel[inPos + i + 24] & 0x02) << 4); + subBuf[outPos + 7] += (byte)((subchannel[inPos + i + 24] & 0x01) << 5); + + // S + subBuf[outPos + 0] += (byte)((subchannel[inPos + i + 36] & 0x80) >> 3); + subBuf[outPos + 1] += (byte)((subchannel[inPos + i + 36] & 0x40) >> 2); + subBuf[outPos + 2] += (byte)((subchannel[inPos + i + 36] & 0x20) >> 1); + subBuf[outPos + 3] += (byte)(subchannel[inPos + i + 36] & 0x10); + subBuf[outPos + 4] += (byte)((subchannel[inPos + i + 36] & 0x08) << 1); + subBuf[outPos + 5] += (byte)((subchannel[inPos + i + 36] & 0x04) << 2); + subBuf[outPos + 6] += (byte)((subchannel[inPos + i + 36] & 0x02) << 3); + subBuf[outPos + 7] += (byte)((subchannel[inPos + i + 36] & 0x01) << 4); + + // T + subBuf[outPos + 0] += (byte)((subchannel[inPos + i + 48] & 0x80) >> 4); + subBuf[outPos + 1] += (byte)((subchannel[inPos + i + 48] & 0x40) >> 3); + subBuf[outPos + 2] += (byte)((subchannel[inPos + i + 48] & 0x20) >> 2); + subBuf[outPos + 3] += (byte)((subchannel[inPos + i + 48] & 0x10) >> 1); + subBuf[outPos + 4] += (byte)(subchannel[inPos + i + 48] & 0x08); + subBuf[outPos + 5] += (byte)((subchannel[inPos + i + 48] & 0x04) << 1); + subBuf[outPos + 6] += (byte)((subchannel[inPos + i + 48] & 0x02) << 2); + subBuf[outPos + 7] += (byte)((subchannel[inPos + i + 48] & 0x01) << 3); + + // U + subBuf[outPos + 0] += (byte)((subchannel[inPos + i + 60] & 0x80) >> 5); + subBuf[outPos + 1] += (byte)((subchannel[inPos + i + 60] & 0x40) >> 4); + subBuf[outPos + 2] += (byte)((subchannel[inPos + i + 60] & 0x20) >> 3); + subBuf[outPos + 3] += (byte)((subchannel[inPos + i + 60] & 0x10) >> 2); + subBuf[outPos + 4] += (byte)((subchannel[inPos + i + 60] & 0x08) >> 1); + subBuf[outPos + 5] += (byte)(subchannel[inPos + i + 60] & 0x04); + subBuf[outPos + 6] += (byte)((subchannel[inPos + i + 60] & 0x02) << 1); + subBuf[outPos + 7] += (byte)((subchannel[inPos + i + 60] & 0x01) << 2); + + // V + subBuf[outPos + 0] += (byte)((subchannel[inPos + i + 72] & 0x80) >> 6); + subBuf[outPos + 1] += (byte)((subchannel[inPos + i + 72] & 0x40) >> 5); + subBuf[outPos + 2] += (byte)((subchannel[inPos + i + 72] & 0x20) >> 4); + subBuf[outPos + 3] += (byte)((subchannel[inPos + i + 72] & 0x10) >> 3); + subBuf[outPos + 4] += (byte)((subchannel[inPos + i + 72] & 0x08) >> 2); + subBuf[outPos + 5] += (byte)((subchannel[inPos + i + 72] & 0x04) >> 1); + subBuf[outPos + 6] += (byte)(subchannel[inPos + i + 72] & 0x02); + subBuf[outPos + 7] += (byte)((subchannel[inPos + i + 72] & 0x01) << 1); + + // W + subBuf[outPos + 0] += (byte)((subchannel[inPos + i + 84] & 0x80) >> 7); + subBuf[outPos + 1] += (byte)((subchannel[inPos + i + 84] & 0x40) >> 6); + subBuf[outPos + 2] += (byte)((subchannel[inPos + i + 84] & 0x20) >> 5); + subBuf[outPos + 3] += (byte)((subchannel[inPos + i + 84] & 0x10) >> 4); + subBuf[outPos + 4] += (byte)((subchannel[inPos + i + 84] & 0x08) >> 3); + subBuf[outPos + 5] += (byte)((subchannel[inPos + i + 84] & 0x04) >> 2); + subBuf[outPos + 6] += (byte)((subchannel[inPos + i + 84] & 0x02) >> 1); + subBuf[outPos + 7] += (byte)(subchannel[inPos + i + 84] & 0x01); + outPos += 8; + } + } + + return subBuf; + } + + public static byte[] Deinterleave(byte[] subchannel) + { + var subBuf = new byte[subchannel.Length]; + var inPos = 0; + + for(var outPos = 0; outPos < subchannel.Length; outPos += 96) + { + for(var i = 0; i < 12; i++) + { + // P + subBuf[outPos + i + 0] += (byte)((subchannel[inPos + 0] & 0x80) >> 0); + subBuf[outPos + i + 0] += (byte)((subchannel[inPos + 1] & 0x80) >> 1); + subBuf[outPos + i + 0] += (byte)((subchannel[inPos + 2] & 0x80) >> 2); + subBuf[outPos + i + 0] += (byte)((subchannel[inPos + 3] & 0x80) >> 3); + subBuf[outPos + i + 0] += (byte)((subchannel[inPos + 4] & 0x80) >> 4); + subBuf[outPos + i + 0] += (byte)((subchannel[inPos + 5] & 0x80) >> 5); + subBuf[outPos + i + 0] += (byte)((subchannel[inPos + 6] & 0x80) >> 6); + subBuf[outPos + i + 0] += (byte)((subchannel[inPos + 7] & 0x80) >> 7); + + // Q + subBuf[outPos + i + 12] += (byte)((subchannel[inPos + 0] & 0x40) << 1); + subBuf[outPos + i + 12] += (byte)((subchannel[inPos + 1] & 0x40) >> 0); + subBuf[outPos + i + 12] += (byte)((subchannel[inPos + 2] & 0x40) >> 1); + subBuf[outPos + i + 12] += (byte)((subchannel[inPos + 3] & 0x40) >> 2); + subBuf[outPos + i + 12] += (byte)((subchannel[inPos + 4] & 0x40) >> 3); + subBuf[outPos + i + 12] += (byte)((subchannel[inPos + 5] & 0x40) >> 4); + subBuf[outPos + i + 12] += (byte)((subchannel[inPos + 6] & 0x40) >> 5); + subBuf[outPos + i + 12] += (byte)((subchannel[inPos + 7] & 0x40) >> 6); + + // R + subBuf[outPos + i + 24] += (byte)((subchannel[inPos + 0] & 0x20) << 2); + subBuf[outPos + i + 24] += (byte)((subchannel[inPos + 1] & 0x20) << 1); + subBuf[outPos + i + 24] += (byte)((subchannel[inPos + 2] & 0x20) >> 0); + subBuf[outPos + i + 24] += (byte)((subchannel[inPos + 3] & 0x20) >> 1); + subBuf[outPos + i + 24] += (byte)((subchannel[inPos + 4] & 0x20) >> 2); + subBuf[outPos + i + 24] += (byte)((subchannel[inPos + 5] & 0x20) >> 3); + subBuf[outPos + i + 24] += (byte)((subchannel[inPos + 6] & 0x20) >> 4); + subBuf[outPos + i + 24] += (byte)((subchannel[inPos + 7] & 0x20) >> 5); + + // S + subBuf[outPos + i + 36] += (byte)((subchannel[inPos + 0] & 0x10) << 3); + subBuf[outPos + i + 36] += (byte)((subchannel[inPos + 1] & 0x10) << 2); + subBuf[outPos + i + 36] += (byte)((subchannel[inPos + 2] & 0x10) << 1); + subBuf[outPos + i + 36] += (byte)((subchannel[inPos + 3] & 0x10) >> 0); + subBuf[outPos + i + 36] += (byte)((subchannel[inPos + 4] & 0x10) >> 1); + subBuf[outPos + i + 36] += (byte)((subchannel[inPos + 5] & 0x10) >> 2); + subBuf[outPos + i + 36] += (byte)((subchannel[inPos + 6] & 0x10) >> 3); + subBuf[outPos + i + 36] += (byte)((subchannel[inPos + 7] & 0x10) >> 4); + + // T + subBuf[outPos + i + 48] += (byte)((subchannel[inPos + 0] & 0x8) << 4); + subBuf[outPos + i + 48] += (byte)((subchannel[inPos + 1] & 0x8) << 3); + subBuf[outPos + i + 48] += (byte)((subchannel[inPos + 2] & 0x8) << 2); + subBuf[outPos + i + 48] += (byte)((subchannel[inPos + 3] & 0x8) << 1); + subBuf[outPos + i + 48] += (byte)((subchannel[inPos + 4] & 0x8) >> 0); + subBuf[outPos + i + 48] += (byte)((subchannel[inPos + 5] & 0x8) >> 1); + subBuf[outPos + i + 48] += (byte)((subchannel[inPos + 6] & 0x8) >> 2); + subBuf[outPos + i + 48] += (byte)((subchannel[inPos + 7] & 0x8) >> 3); + + // U + subBuf[outPos + i + 60] += (byte)((subchannel[inPos + 0] & 0x4) << 5); + subBuf[outPos + i + 60] += (byte)((subchannel[inPos + 1] & 0x4) << 4); + subBuf[outPos + i + 60] += (byte)((subchannel[inPos + 2] & 0x4) << 3); + subBuf[outPos + i + 60] += (byte)((subchannel[inPos + 3] & 0x4) << 2); + subBuf[outPos + i + 60] += (byte)((subchannel[inPos + 4] & 0x4) << 1); + subBuf[outPos + i + 60] += (byte)((subchannel[inPos + 5] & 0x4) >> 0); + subBuf[outPos + i + 60] += (byte)((subchannel[inPos + 6] & 0x4) >> 1); + subBuf[outPos + i + 60] += (byte)((subchannel[inPos + 7] & 0x4) >> 2); + + // V + subBuf[outPos + i + 72] += (byte)((subchannel[inPos + 0] & 0x2) << 6); + subBuf[outPos + i + 72] += (byte)((subchannel[inPos + 1] & 0x2) << 5); + subBuf[outPos + i + 72] += (byte)((subchannel[inPos + 2] & 0x2) << 4); + subBuf[outPos + i + 72] += (byte)((subchannel[inPos + 3] & 0x2) << 3); + subBuf[outPos + i + 72] += (byte)((subchannel[inPos + 4] & 0x2) << 2); + subBuf[outPos + i + 72] += (byte)((subchannel[inPos + 5] & 0x2) << 1); + subBuf[outPos + i + 72] += (byte)((subchannel[inPos + 6] & 0x2) >> 0); + subBuf[outPos + i + 72] += (byte)((subchannel[inPos + 7] & 0x2) >> 1); + + // W + subBuf[outPos + i + 84] += (byte)((subchannel[inPos + 0] & 0x1) << 7); + subBuf[outPos + i + 84] += (byte)((subchannel[inPos + 1] & 0x1) << 6); + subBuf[outPos + i + 84] += (byte)((subchannel[inPos + 2] & 0x1) << 5); + subBuf[outPos + i + 84] += (byte)((subchannel[inPos + 3] & 0x1) << 4); + subBuf[outPos + i + 84] += (byte)((subchannel[inPos + 4] & 0x1) << 3); + subBuf[outPos + i + 84] += (byte)((subchannel[inPos + 5] & 0x1) << 2); + subBuf[outPos + i + 84] += (byte)((subchannel[inPos + 6] & 0x1) << 1); + subBuf[outPos + i + 84] += (byte)((subchannel[inPos + 7] & 0x1) >> 0); + + inPos += 8; + } + } + + return subBuf; + } + + public static string PrettifyQ(byte[] subBuf, bool bcd, long lba, bool corruptedPause, bool pause, bool rwEmpty) + { + CRC16CcittContext.Data(subBuf, 10, out byte[] crc); + + bool crcOk = crc[0] == subBuf[10] && crc[1] == subBuf[11]; + long minute = (lba + 150) / 4500; + long second = (lba + 150) % 4500 / 75; + long frame = (lba + 150) % 4500 % 75; + string area; + int control = (subBuf[0] & 0xF0) / 16; + int adr = subBuf[0] & 0x0F; + + string controlInfo = ((control & 0xC) / 4) switch + { + 0 => (control & 0x01) == 1 + ? Localization.Subchannel_PrettifyQ_stereo_audio_with_pre_emphasis + : Localization.Subchannel_PrettifyQ_stereo_audio_without_pre_emphasis, + 1 => (control & 0x01) == 1 + ? Localization.Subchannel_PrettifyQ_incremental_data + : Localization.Subchannel_PrettifyQ_uninterrupted_data, + 2 => (control & 0x01) == 1 + ? Localization.Subchannel_PrettifyQ_quadraphonic_audio_with_pre_emphasis + : Localization.Subchannel_PrettifyQ_quadraphonic_audio_without_pre_emphasis, + _ => string.Format(Localization.Subchannel_PrettifyQ_reserved_control_value__0_, + control & 0x01) + }; + + string copy = (control & 0x02) > 0 + ? Localization.Subchannel_PrettifyQ_copy_permitted + : Localization.Subchannel_PrettifyQ_copy_prohibited; + + if(bcd) + BcdToBinaryQ(subBuf); + + int qPos = subBuf[3] * 60 * 75 + subBuf[4] * 75 + subBuf[5] - 150; + byte pmin = subBuf[7]; + byte psec = subBuf[8]; + + int qStart = subBuf[7] * 60 * 75 + subBuf[8] * 75 + subBuf[9] - 150; + int nextPos = subBuf[3] * 60 * 75 + subBuf[4] * 75 + subBuf[5] - 150; + byte zero = subBuf[6]; + int maxOut = subBuf[7] * 60 * 75 + subBuf[8] * 75 + subBuf[9] - 150; + bool final = subBuf[3] == 0xFF && subBuf[4] == 0xFF && subBuf[5] == 0xFF; + + BinaryToBcdQ(subBuf); + + if(lba < 0) + { + area = Localization.Subchannel_PrettifyQ_Lead_In; + + switch(adr) + { + case 1 when subBuf[2] < 0xA0: + return + string.Format( + Localization. + Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_position_9_10_11_LBA_12_track_13_starts_at_14_15_16_LBA_17_Q_CRC_18_19_20_R_W_21, + minute, second, frame, lba, area, + corruptedPause ? Localization.Subchannel_PrettifyQ_corrupted_pause : + pause ? Localization.Subchannel_PrettifyQ_pause : + Localization.Subchannel_PrettifyQ_not_pause, controlInfo, copy, + adr, + subBuf[3], subBuf[4], subBuf[5], qPos, subBuf[2], subBuf[7], subBuf[8], subBuf[9], + qStart, subBuf[10], subBuf[11], + crcOk + ? Localization.Subchannel_PrettifyQ_OK + : Localization.Subchannel_PrettifyQ_BAD, + rwEmpty + ? Localization.Subchannel_PrettifyQ_empty + : Localization.Subchannel_PrettifyQ_not_empty); + case 1 when subBuf[2] == 0xA0: + { + string format = subBuf[8] switch + { + 0x00 => Localization.Subchannel_PrettifyQ_CD_DA_CD_ROM, + 0x10 => Localization.Subchannel_PrettifyQ_CD_i, + 0x20 => Localization.Subchannel_PrettifyQ_CD_ROM_XA, + _ => string.Format(Localization.Subchannel_PrettifyQ_unknown_0, subBuf[0]) + }; + + return + string.Format( + Localization. + Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_position_9_10_11_LBA_12_track_13_is_first_program_area_track_in_14_format_Q_CRC_15_16_17_R_W_18, + minute, second, frame, lba, area, + corruptedPause ? Localization.Subchannel_PrettifyQ_corrupted_pause : + pause ? Localization.Subchannel_PrettifyQ_pause : + Localization.Subchannel_PrettifyQ_not_pause, controlInfo, copy, + adr, + subBuf[3], subBuf[4], subBuf[5], qPos, subBuf[2], format, subBuf[10], subBuf[11], + crcOk + ? Localization.Subchannel_PrettifyQ_OK + : Localization.Subchannel_PrettifyQ_BAD, + rwEmpty + ? Localization.Subchannel_PrettifyQ_empty + : Localization.Subchannel_PrettifyQ_not_empty); + } + case 1 when subBuf[2] == 0xA1: + return + string.Format( + Localization. + Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_position_9_10_11_LBA_12_track_13_is_last_program_area_track_Q_CRC_14_15_16_R_W_17, + minute, second, frame, lba, area, + corruptedPause ? Localization.Subchannel_PrettifyQ_corrupted_pause : + pause ? Localization.Subchannel_PrettifyQ_pause : + Localization.Subchannel_PrettifyQ_not_pause, controlInfo, copy, + adr, + subBuf[3], subBuf[4], subBuf[5], qPos, subBuf[2], subBuf[10], subBuf[11], + crcOk + ? Localization.Subchannel_PrettifyQ_OK + : Localization.Subchannel_PrettifyQ_BAD, + rwEmpty + ? Localization.Subchannel_PrettifyQ_empty + : Localization.Subchannel_PrettifyQ_not_empty); + case 1: + return subBuf[2] == 0xA2 + ? string.Format( + Localization. + Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_position_9_10_11_LBA_12_track_13_starts_at_14_15_16_LBA_17_Q_CRC_18_19_20_R_W_21, + minute, second, frame, lba, area, + corruptedPause ? Localization.Subchannel_PrettifyQ_corrupted_pause : + pause ? Localization.Subchannel_PrettifyQ_pause : + Localization.Subchannel_PrettifyQ_not_pause, + controlInfo, copy, + adr, subBuf[3], subBuf[4], subBuf[5], qPos, subBuf[2], subBuf[7], + subBuf[8], subBuf[9], qStart, subBuf[10], subBuf[11], + crcOk + ? Localization.Subchannel_PrettifyQ_OK + : Localization.Subchannel_PrettifyQ_BAD, + rwEmpty + ? Localization.Subchannel_PrettifyQ_empty + : Localization.Subchannel_PrettifyQ_not_empty) + : string.Format( + Localization. + Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_8_9_10_11_12_13_14_15_16_17_CRC_18_19_20_R_W_21, + minute, second, frame, lba, area, + corruptedPause ? Localization.Subchannel_PrettifyQ_corrupted_pause : + pause ? Localization.Subchannel_PrettifyQ_pause : + Localization.Subchannel_PrettifyQ_not_pause, + controlInfo, copy, + subBuf[0], subBuf[1], subBuf[2], subBuf[3], subBuf[4], subBuf[5], + subBuf[6], subBuf[7], subBuf[8], subBuf[9], subBuf[10], subBuf[11], + crcOk + ? Localization.Subchannel_PrettifyQ_OK + : Localization.Subchannel_PrettifyQ_BAD, + rwEmpty + ? Localization.Subchannel_PrettifyQ_empty + : Localization.Subchannel_PrettifyQ_not_empty); + case 2: + return + string.Format(Localization.Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_MCN_9_frame_10_CRC_11_12_13_R_W_14, + minute, second, frame, lba, area, + corruptedPause ? Localization.Subchannel_PrettifyQ_corrupted_pause : + pause ? Localization.Subchannel_PrettifyQ_pause : + Localization.Subchannel_PrettifyQ_not_pause, controlInfo, copy, + adr, + DecodeMcn(subBuf), subBuf[9], subBuf[10], subBuf[11], + crcOk + ? Localization.Subchannel_PrettifyQ_OK + : Localization.Subchannel_PrettifyQ_BAD, + rwEmpty + ? Localization.Subchannel_PrettifyQ_empty + : Localization.Subchannel_PrettifyQ_not_empty); + } + + if(adr != 5) + { + return + string.Format( + Localization. + Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_8_9_10_11_12_13_14_15_16_17_CRC_18_19_20_R_W_21, + minute, second, frame, lba, area, + corruptedPause ? Localization.Subchannel_PrettifyQ_corrupted_pause : + pause ? Localization.Subchannel_PrettifyQ_pause : + Localization.Subchannel_PrettifyQ_not_pause, controlInfo, copy, + subBuf[0], + subBuf[1], subBuf[2], subBuf[3], subBuf[4], subBuf[5], subBuf[6], subBuf[7], + subBuf[8], subBuf[9], subBuf[10], subBuf[11], + crcOk ? Localization.Subchannel_PrettifyQ_OK : Localization.Subchannel_PrettifyQ_BAD, + rwEmpty + ? Localization.Subchannel_PrettifyQ_empty + : Localization.Subchannel_PrettifyQ_not_empty); + } + + switch(subBuf[2]) + { + case <= 0x40: + return + string.Format( + Localization. + Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_skip_interval_start_time_9_10_11_skip_interval_stop_time_12_13_14_CRC_15_16_17_R_W_18, + minute, second, frame, lba, area, + corruptedPause ? Localization.Subchannel_PrettifyQ_corrupted_pause : + pause ? Localization.Subchannel_PrettifyQ_pause : + Localization.Subchannel_PrettifyQ_not_pause, controlInfo, copy, + adr, + subBuf[7], subBuf[8], subBuf[9], subBuf[3], subBuf[4], subBuf[5], subBuf[10], + subBuf[11], + crcOk + ? Localization.Subchannel_PrettifyQ_OK + : Localization.Subchannel_PrettifyQ_BAD, + rwEmpty + ? Localization.Subchannel_PrettifyQ_empty + : Localization.Subchannel_PrettifyQ_not_empty); + case 0xB0: + return final + ? string.Format( + Localization. + Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_next_program_area_can_start_at_9_10_11_LBA_12_last_session_13_mode_5_pointers_CRC_14_15_16_R_W_17, + minute, second, frame, lba, area, + corruptedPause ? Localization.Subchannel_PrettifyQ_corrupted_pause : + pause ? Localization.Subchannel_PrettifyQ_pause : + Localization.Subchannel_PrettifyQ_not_pause, + controlInfo, copy, + adr, subBuf[3], subBuf[4], subBuf[5], nextPos, zero, subBuf[10], + subBuf[11], + crcOk + ? Localization.Subchannel_PrettifyQ_OK + : Localization.Subchannel_PrettifyQ_BAD, + rwEmpty + ? Localization.Subchannel_PrettifyQ_empty + : Localization.Subchannel_PrettifyQ_not_empty) + : string.Format( + Localization. + Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_next_program_area_can_start_at_9_10_11_LBA_12_maximum_Lead_out_at_13_14_15_LBA_16_17_mode_5_pointers_CRC_18_19_20_R_W_21, + minute, second, frame, lba, area, + corruptedPause ? Localization.Subchannel_PrettifyQ_corrupted_pause : + pause ? Localization.Subchannel_PrettifyQ_pause : + Localization.Subchannel_PrettifyQ_not_pause, + controlInfo, copy, + adr, subBuf[3], subBuf[4], subBuf[5], nextPos, subBuf[7], subBuf[8], + subBuf[9], maxOut, zero, subBuf[10], subBuf[11], + crcOk + ? Localization.Subchannel_PrettifyQ_OK + : Localization.Subchannel_PrettifyQ_BAD, + rwEmpty + ? Localization.Subchannel_PrettifyQ_empty + : Localization.Subchannel_PrettifyQ_not_empty); + case 0xB1: + return + string.Format( + Localization. + Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_9_skip_interval_pointers_10_skip_track_assignments_CRC_11_12_13_R_W_14, + minute, second, frame, lba, area, + corruptedPause ? Localization.Subchannel_PrettifyQ_corrupted_pause : + pause ? Localization.Subchannel_PrettifyQ_pause : + Localization.Subchannel_PrettifyQ_not_pause, controlInfo, copy, + adr, pmin, + psec, subBuf[10], subBuf[11], + crcOk + ? Localization.Subchannel_PrettifyQ_OK + : Localization.Subchannel_PrettifyQ_BAD, + rwEmpty + ? Localization.Subchannel_PrettifyQ_empty + : Localization.Subchannel_PrettifyQ_not_empty); + } + + if(subBuf[2] != 0xB2 && subBuf[2] != 0xB3 && subBuf[2] != 0xB4) + { + return subBuf[2] == 0xC0 + ? string.Format( + Localization. + Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_ATIP_values_9_10_11_first_disc_Lead_in_starts_at_12_13_14_LBA_15_CRC_16_17_18_R_W_19, + minute, second, frame, lba, area, + corruptedPause ? Localization.Subchannel_PrettifyQ_corrupted_pause : + pause ? Localization.Subchannel_PrettifyQ_pause : + Localization.Subchannel_PrettifyQ_not_pause, controlInfo, + copy, adr, + subBuf[3], subBuf[4], subBuf[5], subBuf[7], subBuf[8], subBuf[9], qStart, + subBuf[10], subBuf[11], + crcOk + ? Localization.Subchannel_PrettifyQ_OK + : Localization.Subchannel_PrettifyQ_BAD, + rwEmpty + ? Localization.Subchannel_PrettifyQ_empty + : Localization.Subchannel_PrettifyQ_not_empty) + : string.Format( + Localization. + Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_8_9_10_11_12_13_14_15_16_17_CRC_18_19_20_R_W_21, + minute, second, frame, lba, area, + corruptedPause ? Localization.Subchannel_PrettifyQ_corrupted_pause : + pause ? Localization.Subchannel_PrettifyQ_pause : + Localization.Subchannel_PrettifyQ_not_pause, controlInfo, + copy, + subBuf[0], subBuf[1], subBuf[2], subBuf[3], subBuf[4], subBuf[5], subBuf[6], + subBuf[7], subBuf[8], subBuf[9], subBuf[10], subBuf[11], + crcOk + ? Localization.Subchannel_PrettifyQ_OK + : Localization.Subchannel_PrettifyQ_BAD, + rwEmpty + ? Localization.Subchannel_PrettifyQ_empty + : Localization.Subchannel_PrettifyQ_not_empty); + } + + var skipTracks = $"{subBuf[3]:X2}"; + + if(subBuf[4] > 0) + skipTracks += $", {subBuf[4]:X2}"; + + if(subBuf[5] > 0) + skipTracks += $", {subBuf[4]:X2}"; + + if(subBuf[7] > 0) + skipTracks += $", {subBuf[4]:X2}"; + + if(subBuf[8] > 0) + skipTracks += $", {subBuf[4]:X2}"; + + if(subBuf[9] > 0) + skipTracks += $", {subBuf[4]:X2}"; + + return + string.Format(Localization.Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_tracks_9_to_be_skipped_CRC_10_11_12_R_W_13, + minute, second, frame, lba, area, + corruptedPause ? Localization.Subchannel_PrettifyQ_corrupted_pause : + pause ? Localization.Subchannel_PrettifyQ_pause : + Localization.Subchannel_PrettifyQ_not_pause, controlInfo, copy, adr, + skipTracks, + subBuf[10], subBuf[11], + crcOk ? Localization.Subchannel_PrettifyQ_OK : Localization.Subchannel_PrettifyQ_BAD, + rwEmpty + ? Localization.Subchannel_PrettifyQ_empty + : Localization.Subchannel_PrettifyQ_not_empty); + } + + area = subBuf[1] == 0xAA + ? Localization.Subchannel_PrettifyQ_Lead_out + : Localization.Subchannel_PrettifyQ_Program; + + return adr switch + { + 1 => + string.Format( + Localization. + Subchannel_PrettifyQ_0_D2_1_2_LBA_3_4_area_5_6_7_Q_mode_8_position_track_9_index_10_relative_position_11_12_13_LBA_14_absolute_position_15_16_17_LBA_18_Q_CRC_19_20_21_R_W_22, + minute, second, frame, lba, area, + corruptedPause ? Localization.Subchannel_PrettifyQ_corrupted_pause : + pause ? Localization.Subchannel_PrettifyQ_pause : + Localization.Subchannel_PrettifyQ_not_pause, controlInfo, copy, + adr, + subBuf[1], subBuf[2], subBuf[3], subBuf[4], subBuf[5], qPos + 150, subBuf[7], + subBuf[8], subBuf[9], qStart, subBuf[10], subBuf[11], + crcOk + ? Localization.Subchannel_PrettifyQ_OK + : Localization.Subchannel_PrettifyQ_BAD, + rwEmpty + ? Localization.Subchannel_PrettifyQ_empty + : Localization.Subchannel_PrettifyQ_not_empty), + 2 => + string.Format(Localization.Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_MCN_9_frame_10_CRC_11_12_13_R_W_14, + minute, second, frame, lba, area, + corruptedPause ? Localization.Subchannel_PrettifyQ_corrupted_pause : + pause ? Localization.Subchannel_PrettifyQ_pause : + Localization.Subchannel_PrettifyQ_not_pause, controlInfo, copy, + adr, + DecodeMcn(subBuf), subBuf[9], subBuf[10], subBuf[11], + crcOk + ? Localization.Subchannel_PrettifyQ_OK + : Localization.Subchannel_PrettifyQ_BAD, + rwEmpty + ? Localization.Subchannel_PrettifyQ_empty + : Localization.Subchannel_PrettifyQ_not_empty), + 3 => + string.Format(Localization.Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_ISRC_9_frame_10_CRC_11_12_13_R_W_14, + minute, second, frame, lba, area, + corruptedPause ? Localization.Subchannel_PrettifyQ_corrupted_pause : + pause ? Localization.Subchannel_PrettifyQ_pause : + Localization.Subchannel_PrettifyQ_not_pause, controlInfo, copy, + adr, + DecodeIsrc(subBuf), subBuf[9], subBuf[10], subBuf[11], + crcOk + ? Localization.Subchannel_PrettifyQ_OK + : Localization.Subchannel_PrettifyQ_BAD, + rwEmpty + ? Localization.Subchannel_PrettifyQ_empty + : Localization.Subchannel_PrettifyQ_not_empty), + _ => + string.Format( + Localization. + Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_8_9_10_11_12_13_14_15_16_17_CRC_18_19_20_R_W_21, + minute, second, frame, lba, area, + corruptedPause ? Localization.Subchannel_PrettifyQ_corrupted_pause : + pause ? Localization.Subchannel_PrettifyQ_pause : + Localization.Subchannel_PrettifyQ_not_pause, controlInfo, copy, + subBuf[0], + subBuf[1], subBuf[2], subBuf[3], subBuf[4], subBuf[5], subBuf[6], subBuf[7], + subBuf[8], subBuf[9], subBuf[10], subBuf[11], + crcOk + ? Localization.Subchannel_PrettifyQ_OK + : Localization.Subchannel_PrettifyQ_BAD, + rwEmpty + ? Localization.Subchannel_PrettifyQ_empty + : Localization.Subchannel_PrettifyQ_not_empty) + }; + } + + public static string DecodeIsrc(byte[] q) => + $"{_isrcTable[q[1] / 4]}{_isrcTable[(q[1] & 3) * 16 + q[2] / 16]}{_isrcTable[(q[2] & 0xF) * 4 + q[3] / 64]}{_isrcTable[q[3] & 0x3F]}{_isrcTable[q[4] / 4]}{q[5]:X2}{q[6]:X2}{q[7]:X2}{q[8] / 16:X1}"; + + public static string DecodeMcn(byte[] q) => $"{q[1]:X2}{q[2]:X2}{q[3]:X2}{q[4]:X2}{q[5]:X2}{q[6]:X2}{q[7] >> 4:X}"; + + public static byte GetIsrcCode(char c) => c switch + { + '0' => 0x00, + '1' => 0x01, + '2' => 0x02, + '3' => 0x03, + '4' => 0x04, + '5' => 0x05, + '6' => 0x06, + '7' => 0x07, + '8' => 0x08, + '9' => 0x09, + 'A' => 0x11, + 'B' => 0x12, + 'C' => 0x13, + 'D' => 0x14, + 'E' => 0x15, + 'F' => 0x16, + 'G' => 0x17, + 'H' => 0x18, + 'I' => 0x19, + 'J' => 0x1A, + 'K' => 0x1B, + 'L' => 0x1C, + 'M' => 0x1D, + 'N' => 0x1E, + 'O' => 0x1F, + 'P' => 0x20, + 'Q' => 0x21, + 'R' => 0x22, + 'S' => 0x23, + 'T' => 0x24, + 'U' => 0x25, + 'V' => 0x26, + 'W' => 0x27, + 'X' => 0x28, + 'Y' => 0x29, + 'Z' => 0x2A, + _ => 0x00 + }; + + public static byte[] Generate(int sector, uint trackSequence, int pregap, int trackStart, byte flags, byte index) + { + bool isPregap = sector < 0 || sector <= trackStart + pregap; + + if(index == 0) + index = (byte)(isPregap ? 0 : 1); + + var sub = new byte[96]; + + // P + if(isPregap) + { + sub[0] = 0xFF; + sub[1] = 0xFF; + sub[2] = 0xFF; + sub[3] = 0xFF; + sub[4] = 0xFF; + sub[5] = 0xFF; + sub[6] = 0xFF; + sub[7] = 0xFF; + sub[8] = 0xFF; + sub[9] = 0xFF; + sub[10] = 0xFF; + sub[11] = 0xFF; + } + + // Q + var q = new byte[12]; + + q[0] = (byte)((flags << 4) + 1); + q[1] = (byte)trackSequence; + q[2] = index; + + int relative; + + if(isPregap) + relative = pregap + trackStart - sector; + else + relative = sector - trackStart; + + sector += 150; + + int min = relative / 60 / 75; + int sec = relative / 75 - min * 60; + int frame = relative - min * 60 * 75 - sec * 75; + + int amin = sector / 60 / 75; + int asec = sector / 75 - amin * 60; + int aframe = sector - amin * 60 * 75 - asec * 75; + + q[3] = (byte)min; + q[4] = (byte)sec; + q[5] = (byte)frame; + + q[7] = (byte)amin; + q[8] = (byte)asec; + q[9] = (byte)aframe; + + q[1] = (byte)((q[1] / 10 << 4) + q[1] % 10); + q[2] = (byte)((q[2] / 10 << 4) + q[2] % 10); + q[3] = (byte)((q[3] / 10 << 4) + q[3] % 10); + q[4] = (byte)((q[4] / 10 << 4) + q[4] % 10); + q[5] = (byte)((q[5] / 10 << 4) + q[5] % 10); + q[6] = (byte)((q[6] / 10 << 4) + q[6] % 10); + q[7] = (byte)((q[7] / 10 << 4) + q[7] % 10); + q[8] = (byte)((q[8] / 10 << 4) + q[8] % 10); + + q[9] = (byte)((q[9] / 10 << 4) + q[9] % 10); + + CRC16CcittContext.Data(q, 10, out byte[] qCrc); + q[10] = qCrc[0]; + q[11] = qCrc[1]; + + Array.Copy(q, 0, sub, 12, 12); + + return Interleave(sub); + } +} \ No newline at end of file diff --git a/Aaru.Decoders/CD/TOC.cs b/Aaru.Decoders/CD/TOC.cs new file mode 100644 index 000000000..3fc61060a --- /dev/null +++ b/Aaru.Decoders/CD/TOC.cs @@ -0,0 +1,248 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : TOC.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes CD Table of Contents. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; +using Aaru.Console; +using Aaru.Helpers; + +namespace Aaru.Decoders.CD; + +// Information from the following standards: +// ANSI X3.304-1997 +// T10/1048-D revision 9.0 +// T10/1048-D revision 10a +// T10/1228-D revision 7.0c +// T10/1228-D revision 11a +// T10/1363-D revision 10g +// T10/1545-D revision 1d +// T10/1545-D revision 5 +// T10/1545-D revision 5a +// T10/1675-D revision 2c +// T10/1675-D revision 4 +// T10/1836-D revision 2g +// ISO/IEC 61104: Compact disc video system - 12 cm CD-V +// ISO/IEC 60908: Audio recording - Compact disc digital audio system +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static class TOC +{ + const string MODULE_NAME = "CD TOC decoder"; + + public static CDTOC? Decode(byte[] CDTOCResponse) + { + if(CDTOCResponse is not { Length: > 4 }) + return null; + + var decoded = new CDTOC + { + DataLength = BigEndianBitConverter.ToUInt16(CDTOCResponse, 0), + FirstTrack = CDTOCResponse[2], + LastTrack = CDTOCResponse[3] + }; + + decoded.TrackDescriptors = new CDTOCTrackDataDescriptor[(decoded.DataLength - 2) / 8]; + + if(decoded.DataLength + 2 != CDTOCResponse.Length) + { + AaruConsole.DebugWriteLine(MODULE_NAME, + Localization. + Expected_CD_TOC_size_0_bytes_is_not_received_size_1_bytes_not_decoding, + decoded.DataLength + 2, CDTOCResponse.Length); + + return null; + } + + for(var i = 0; i < (decoded.DataLength - 2) / 8; i++) + { + decoded.TrackDescriptors[i].Reserved1 = CDTOCResponse[0 + i * 8 + 4]; + decoded.TrackDescriptors[i].ADR = (byte)((CDTOCResponse[1 + i * 8 + 4] & 0xF0) >> 4); + decoded.TrackDescriptors[i].CONTROL = (byte)(CDTOCResponse[1 + i * 8 + 4] & 0x0F); + decoded.TrackDescriptors[i].TrackNumber = CDTOCResponse[2 + i * 8 + 4]; + decoded.TrackDescriptors[i].Reserved2 = CDTOCResponse[3 + i * 8 + 4]; + + decoded.TrackDescriptors[i].TrackStartAddress = + BigEndianBitConverter.ToUInt32(CDTOCResponse, 4 + i * 8 + 4); + } + + return decoded; + } + + public static string Prettify(CDTOC? CDTOCResponse) + { + if(CDTOCResponse == null) + return null; + + CDTOC response = CDTOCResponse.Value; + + var sb = new StringBuilder(); + + sb.AppendFormat(Localization.First_track_number_in_first_complete_session_0, response.FirstTrack).AppendLine(); + sb.AppendFormat(Localization.Last_track_number_in_last_complete_session_0, response.LastTrack).AppendLine(); + + foreach(CDTOCTrackDataDescriptor descriptor in response.TrackDescriptors) + { + if(descriptor.TrackNumber == 0xAA) + sb.AppendLine(Localization.Track_number_Lead_Out); + else + sb.AppendFormat(Localization.Track_number_0, descriptor.TrackNumber).AppendLine(); + + sb.AppendFormat(Localization.Track_starts_at_LBA_0_or_MSF_2_3, descriptor.TrackStartAddress, + (descriptor.TrackStartAddress & 0x0000FF00) >> 8, + (descriptor.TrackStartAddress & 0x00FF0000) >> 16, + (descriptor.TrackStartAddress & 0xFF000000) >> 24). + AppendLine(); + + switch((TocAdr)descriptor.ADR) + { + case TocAdr.NoInformation: + sb.AppendLine(Localization.Q_subchannel_mode_not_given); + + break; + case TocAdr.TrackPointer: + sb.AppendLine(Localization.Q_subchannel_stores_track_pointer); + + break; + case TocAdr.VideoTrackPointer: + sb.AppendLine(Localization.Q_subchannel_stores_video_track_pointer); + + break; + case TocAdr.ISRC: + sb.AppendLine(Localization.Q_subchannel_stores_ISRC); + + break; + case TocAdr.MediaCatalogNumber: + sb.AppendLine(Localization.Q_subchannel_stores_media_catalog_number); + + break; + default: + sb.AppendFormat(Localization.Q_subchannel_mode_0, descriptor.ADR).AppendLine(); + + break; + } + + if((descriptor.CONTROL & (byte)TocControl.ReservedMask) == (byte)TocControl.ReservedMask) + sb.AppendFormat(Localization.Reserved_flags_0_set, descriptor.CONTROL).AppendLine(); + else + { + switch((TocControl)(descriptor.CONTROL & 0x0D)) + { + case TocControl.TwoChanNoPreEmph: + sb.AppendLine(Localization.Stereo_audio_track_with_no_pre_emphasis); + + break; + case TocControl.TwoChanPreEmph: + sb.AppendLine(Localization.Stereo_audio_track_with_50_15_us_pre_emphasis); + + break; + case TocControl.FourChanNoPreEmph: + sb.AppendLine(Localization.Quadraphonic_audio_track_with_no_pre_emphasis); + + break; + case TocControl.FourChanPreEmph: + sb.AppendLine(Localization.Quadraphonic_audio_track_with_50_15_us_pre_emphasis); + + break; + case TocControl.DataTrack: + sb.AppendLine(Localization.Data_track_recorded_uninterrupted); + + break; + case TocControl.DataTrackIncremental: + sb.AppendLine(Localization.Data_track_recorded_incrementally); + + break; + } + + sb.AppendLine((descriptor.CONTROL & (byte)TocControl.CopyPermissionMask) == + (byte)TocControl.CopyPermissionMask + ? Localization.Digital_copy_of_track_is_permitted + : Localization.Digital_copy_of_track_is_prohibited); + + #if DEBUG + if(descriptor.Reserved1 != 0) + sb.AppendFormat(Localization.Reserved1_equals_0_X8, descriptor.Reserved1).AppendLine(); + + if(descriptor.Reserved2 != 0) + sb.AppendFormat(Localization.Reserved2_equals_0_X8, descriptor.Reserved2).AppendLine(); + #endif + + sb.AppendLine(); + } + } + + return sb.ToString(); + } + + public static string Prettify(byte[] CDTOCResponse) + { + CDTOC? decoded = Decode(CDTOCResponse); + + return Prettify(decoded); + } + +#region Nested type: CDTOC + + public struct CDTOC + { + /// Total size of returned TOC minus this field + public ushort DataLength; + /// First track number in hex + public byte FirstTrack; + /// Last track number in hex + public byte LastTrack; + /// Track descriptors + public CDTOCTrackDataDescriptor[] TrackDescriptors; + } + +#endregion + +#region Nested type: CDTOCTrackDataDescriptor + + public struct CDTOCTrackDataDescriptor + { + /// Byte 0 Reserved + public byte Reserved1; + /// Byte 1, bits 7 to 4 Type of information in Q subchannel of block where this TOC entry was found + public byte ADR; + /// Byte 1, bits 3 to 0 Track attributes + public byte CONTROL; + /// Byte 2 Track number + public byte TrackNumber; + /// Byte 3 Reserved + public byte Reserved2; + /// Bytes 4 to 7 The track start address in LBA or in MSF + public uint TrackStartAddress; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/DVD/AACS.cs b/Aaru.Decoders/DVD/AACS.cs new file mode 100644 index 000000000..1eb4f35bc --- /dev/null +++ b/Aaru.Decoders/DVD/AACS.cs @@ -0,0 +1,73 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : AACS.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes DVD AACS structures. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; + +namespace Aaru.Decoders.DVD; + +// Information from the following standards: +// ANSI X3.304-1997 +// T10/1048-D revision 9.0 +// T10/1048-D revision 10a +// T10/1228-D revision 7.0c +// T10/1228-D revision 11a +// T10/1363-D revision 10g +// T10/1545-D revision 1d +// T10/1545-D revision 5 +// T10/1545-D revision 5a +// T10/1675-D revision 2c +// T10/1675-D revision 4 +// T10/1836-D revision 2g +// ECMA 365 +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +[SuppressMessage("ReSharper", "UnusedType.Global")] +public static class AACS +{ +#region Nested type: HDLeadInCopyright + + public struct HDLeadInCopyright + { + /// Bytes 0 to 1 Data length + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Bytes 4 to 2052 HD DVD Lead-In Copyright Information + public byte[] CopyrightInformation; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/DVD/ADIP.cs b/Aaru.Decoders/DVD/ADIP.cs new file mode 100644 index 000000000..085dc84fe --- /dev/null +++ b/Aaru.Decoders/DVD/ADIP.cs @@ -0,0 +1,73 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : ADIP.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes DVD ADress-In-Pregroove. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; + +namespace Aaru.Decoders.DVD; + +// Information from the following standards: +// ANSI X3.304-1997 +// T10/1048-D revision 9.0 +// T10/1048-D revision 10a +// T10/1228-D revision 7.0c +// T10/1228-D revision 11a +// T10/1363-D revision 10g +// T10/1545-D revision 1d +// T10/1545-D revision 5 +// T10/1545-D revision 5a +// T10/1675-D revision 2c +// T10/1675-D revision 4 +// T10/1836-D revision 2g +// ECMA 365 +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +[SuppressMessage("ReSharper", "UnusedType.Global")] +public static class ADIP +{ +#region Nested type: ADIPInformation + + public struct ADIPInformation + { + /// Bytes 0 to 1 Data length + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Bytes 4 to 259 ADIP, defined in DVD standards + public byte[] ADIP; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/DVD/BCA.cs b/Aaru.Decoders/DVD/BCA.cs new file mode 100644 index 000000000..2fbf1c6a9 --- /dev/null +++ b/Aaru.Decoders/DVD/BCA.cs @@ -0,0 +1,73 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : BCA.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes DVD Burst Cutting Area. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; + +namespace Aaru.Decoders.DVD; + +// Information from the following standards: +// ANSI X3.304-1997 +// T10/1048-D revision 9.0 +// T10/1048-D revision 10a +// T10/1228-D revision 7.0c +// T10/1228-D revision 11a +// T10/1363-D revision 10g +// T10/1545-D revision 1d +// T10/1545-D revision 5 +// T10/1545-D revision 5a +// T10/1675-D revision 2c +// T10/1675-D revision 4 +// T10/1836-D revision 2g +// ECMA 365 +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +[SuppressMessage("ReSharper", "UnusedType.Global")] +public static class BCA +{ +#region Nested type: BurstCuttingArea + + public struct BurstCuttingArea + { + /// Bytes 0 to 1 Data length + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Bytes 4 to end Burst cutting area contents, 12 to 188 bytes + public byte[] BCA; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/DVD/CPRM.cs b/Aaru.Decoders/DVD/CPRM.cs new file mode 100644 index 000000000..b4f716f4b --- /dev/null +++ b/Aaru.Decoders/DVD/CPRM.cs @@ -0,0 +1,89 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : CPRM.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes DVD CPRM structures. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; + +namespace Aaru.Decoders.DVD; + +// Information from the following standards: +// ANSI X3.304-1997 +// T10/1048-D revision 9.0 +// T10/1048-D revision 10a +// T10/1228-D revision 7.0c +// T10/1228-D revision 11a +// T10/1363-D revision 10g +// T10/1545-D revision 1d +// T10/1545-D revision 5 +// T10/1545-D revision 5a +// T10/1675-D revision 2c +// T10/1675-D revision 4 +// T10/1836-D revision 2g +// ECMA 365 +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +[SuppressMessage("ReSharper", "UnusedType.Global")] +public static class CPRM +{ +#region Nested type: DiscMediaIdentifier + + public struct DiscMediaIdentifier + { + /// Bytes 0 to 1 Data length + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Bytes 4 to end Disc Media Identifier for CPRM + public byte[] MediaIdentifier; + } + +#endregion + +#region Nested type: DiscMediaKeyBlock + + public struct DiscMediaKeyBlock + { + /// Bytes 0 to 1 Data length + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Bytes 4 to end Disc Media Key Block for CPRM + public byte[] MediaKeyBlock; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/DVD/CSS&CPRM.cs b/Aaru.Decoders/DVD/CSS&CPRM.cs new file mode 100644 index 000000000..29d081304 --- /dev/null +++ b/Aaru.Decoders/DVD/CSS&CPRM.cs @@ -0,0 +1,399 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : CSS&CPRM.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes DVD CSS & CPRM structures. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// Copyright © 2020-2023 Rebecca Wallander +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.DVD; + +// Information from the following standards: +// ANSI X3.304-1997 +// T10/1048-D revision 9.0 +// T10/1048-D revision 10a +// T10/1228-D revision 7.0c +// T10/1228-D revision 11a +// T10/1363-D revision 10g +// T10/1545-D revision 1d +// T10/1545-D revision 5 +// T10/1545-D revision 5a +// T10/1675-D revision 2c +// T10/1675-D revision 4 +// T10/1836-D revision 2g +// ECMA 365 +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +[SuppressMessage("ReSharper", "UnusedType.Global")] +public static class CSS_CPRM +{ + public static LeadInCopyright? DecodeLeadInCopyright(byte[] response) + { + if(response?.Length != 8) + return null; + + return new LeadInCopyright + { + DataLength = (ushort)((response[0] << 8) + response[1]), + Reserved1 = response[2], + Reserved2 = response[3], + CopyrightType = (CopyrightType)response[4], + RegionInformation = response[5], + Reserved3 = response[6], + Reserved4 = response[7] + }; + } + + public static RegionalPlaybackControlState? DecodeRegionalPlaybackControlState(byte[] response) + { + if(response?.Length != 8) + return null; + + return new RegionalPlaybackControlState + { + DataLength = (ushort)((response[0] << 8) + response[1]), + Reserved1 = response[2], + Reserved2 = response[3], + TypeCode_VendorResetsAvailable_UserControlledChangesAvailable = response[4], + RegionMask = response[5], + RPCScheme = response[6], + Reserved3 = response[7] + }; + } + + public static string PrettifyRegionalPlaybackControlState(RegionalPlaybackControlState? rpc) + { + if(rpc == null) + return null; + + RegionalPlaybackControlState decoded = rpc.Value; + var sb = new StringBuilder(); + + var typeCode = (TypeCode)((decoded.TypeCode_VendorResetsAvailable_UserControlledChangesAvailable & 0xc0) >> 6); + + int vendorResets = (decoded.TypeCode_VendorResetsAvailable_UserControlledChangesAvailable & 0x38) >> 3; + + int userControlledChanges = decoded.TypeCode_VendorResetsAvailable_UserControlledChangesAvailable & 0x7; + + switch(typeCode) + { + case TypeCode.None: + sb.AppendLine(Localization.No_drive_region_setting); + + break; + case TypeCode.Set: + sb.AppendLine(Localization.Drive_region_is_set); + + break; + case TypeCode.LastChance: + sb.AppendLine(Localization.Drive_region_is_set_with_additional_restrictions_required_to_make_a_change); + + break; + case TypeCode.Perm: + sb.AppendLine(Localization. + Drive_region_has_been_set_permanently_but_may_be_reset_by_the_vendor_if_necessary); + + break; + } + + sb.AppendLine(string.Format(Localization.Drive_has_0_vendor_resets_available, vendorResets)); + sb.AppendLine(string.Format(Localization.Drive_has_0_user_controlled_changes_available, userControlledChanges)); + + switch(decoded.RegionMask) + { + case 0xFF: + sb.AppendLine(Localization.Drive_has_no_region_set); + + break; + case 0x00: + sb.AppendLine(Localization.Drive_is_region_free); + + break; + default: + { + sb.Append(Localization.Drive_has_the_following_regions_set); + + if((decoded.RegionMask & 0x01) != 0x01) + sb.Append(" 1"); + + if((decoded.RegionMask & 0x02) != 0x02) + sb.Append(" 2"); + + if((decoded.RegionMask & 0x04) != 0x04) + sb.Append(" 3"); + + if((decoded.RegionMask & 0x08) != 0x08) + sb.Append(" 4"); + + if((decoded.RegionMask & 0x10) != 0x10) + sb.Append(" 5"); + + if((decoded.RegionMask & 0x20) != 0x20) + sb.Append(" 6"); + + if((decoded.RegionMask & 0x40) != 0x40) + sb.Append(" 7"); + + if((decoded.RegionMask & 0x80) != 0x80) + sb.Append(" 8"); + + break; + } + } + + sb.AppendLine(""); + + switch(decoded.RPCScheme) + { + case 0x00: + sb.AppendLine(Localization.The_Logical_Unit_does_not_enforce_Region_Playback_Controls_RPC); + + break; + case 0x01: + sb.AppendLine(Localization. + The_Logical_Unit_shall_adhere_to_the_specification_and_all_requirements_of_the_CSS_license_agreement_concerning_RPC); + + break; + default: + sb.AppendLine(Localization.The_Logical_Unit_uses_an_unknown_region_enforcement_scheme); + + break; + } + + return sb.ToString(); + } + + public static string PrettifyRegionalPlaybackControlState(byte[] response) => + PrettifyRegionalPlaybackControlState(DecodeRegionalPlaybackControlState(response)); + + public static string PrettifyLeadInCopyright(LeadInCopyright? cmi) + { + if(cmi == null) + return null; + + LeadInCopyright decoded = cmi.Value; + var sb = new StringBuilder(); + + switch(decoded.CopyrightType) + { + case CopyrightType.NoProtection: + sb.AppendLine(Localization.Disc_has_no_encryption); + + break; + case CopyrightType.CSS: + sb.AppendLine(Localization.Disc_is_encrypted_using_CSS_or_CPPM); + + break; + case CopyrightType.CPRM: + sb.AppendLine(Localization.Disc_is_encrypted_using_CPRM); + + break; + case CopyrightType.AACS: + sb.AppendLine(Localization.Disc_is_encrypted_using_AACS); + + break; + default: + sb.AppendFormat(Localization.Disc_is_encrypted_using_unknown_algorithm_with_ID_0, + decoded.CopyrightType); + + break; + } + + if(decoded.CopyrightType == 0) + return sb.ToString(); + + switch(decoded.RegionInformation) + { + case 0xFF: + sb.AppendLine(Localization.Disc_cannot_be_played_in_any_region_at_all); + + break; + case 0x00: + sb.AppendLine(Localization.Disc_can_be_played_in_any_region); + + break; + default: + { + sb.Append(Localization.Disc_can_be_played_in_the_following_regions); + + if((decoded.RegionInformation & 0x01) != 0x01) + sb.Append(" 1"); + + if((decoded.RegionInformation & 0x02) != 0x02) + sb.Append(" 2"); + + if((decoded.RegionInformation & 0x04) != 0x04) + sb.Append(" 3"); + + if((decoded.RegionInformation & 0x08) != 0x08) + sb.Append(" 4"); + + if((decoded.RegionInformation & 0x10) != 0x10) + sb.Append(" 5"); + + if((decoded.RegionInformation & 0x20) != 0x20) + sb.Append(" 6"); + + if((decoded.RegionInformation & 0x40) != 0x40) + sb.Append(" 7"); + + if((decoded.RegionInformation & 0x80) != 0x80) + sb.Append(" 8"); + + break; + } + } + + return sb.ToString(); + } + + public static string PrettifyLeadInCopyright(byte[] response) => + PrettifyLeadInCopyright(DecodeLeadInCopyright(response)); + +#region Nested type: AuthenticationSuccessFlag + + public struct AuthenticationSuccessFlag + { + /// Bytes 0 to 1 Data length + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Byte 4 Reserved + public byte Reserved3; + /// Byte 5 Reserved + public byte Reserved4; + /// Byte 6 Reserved + public byte Reserved5; + /// Byte 7 Reserved and ASF + public byte ASF; + } + +#endregion + +#region Nested type: DiscKey + + public struct DiscKey + { + /// Bytes 0 to 1 Data length + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Bytes 4 to 2052 Disc key for CSS, Album Identifier for CPPM + public byte[] Key; + } + +#endregion + +#region Nested type: LeadInCopyright + + public struct LeadInCopyright + { + /// Bytes 0 to 1 Data length + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Byte 4 Copy protection system type + public CopyrightType CopyrightType; + /// Byte 5 Bitmask of regions where this disc is playable + public byte RegionInformation; + /// Byte 6 Reserved + public byte Reserved3; + /// Byte 7 Reserved + public byte Reserved4; + } + +#endregion + +#region Nested type: RegionalPlaybackControlState + + public struct RegionalPlaybackControlState + { + /// Bytes 0 to 1 Data length + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Byte 4 Type Code and # of Vendor Resets Available and # of User Controlled Changes Available + public byte TypeCode_VendorResetsAvailable_UserControlledChangesAvailable; + /// Byte 5 Region Mask + public byte RegionMask; + /// Byte 6 RPC Scheme + public byte RPCScheme; + /// Byte 7 Reserved + public byte Reserved3; + } + +#endregion + +#region Nested type: TitleKey + + public struct TitleKey + { + /// Bytes 0 to 1 Data length + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Byte 4 CPM + public byte CMI; + /// Bytes 5 to 10 Title key for CSS + public byte[] Key; + /// Byte 11 Reserved + public byte Reserved3; + /// Byte 12 Reserved + public byte Reserved4; + } + +#endregion + +#region Nested type: TypeCode + + enum TypeCode + { + None = 0, + Set = 1, + LastChance = 2, + Perm = 3 + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/DVD/Cartridge.cs b/Aaru.Decoders/DVD/Cartridge.cs new file mode 100644 index 000000000..4e66e4704 --- /dev/null +++ b/Aaru.Decoders/DVD/Cartridge.cs @@ -0,0 +1,182 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : Cartridge.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes DVD cartridge structures. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.DVD; + +// Information from the following standards: +// ANSI X3.304-1997 +// T10/1048-D revision 9.0 +// T10/1048-D revision 10a +// T10/1228-D revision 7.0c +// T10/1228-D revision 11a +// T10/1363-D revision 10g +// T10/1545-D revision 1d +// T10/1545-D revision 5 +// T10/1545-D revision 5a +// T10/1675-D revision 2c +// T10/1675-D revision 4 +// T10/1836-D revision 2g +// ECMA 365 +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +public static class Cartridge +{ + public static MediumStatus? Decode(byte[] response) + { + if(response?.Length != 8) + return null; + + return new MediumStatus + { + DataLength = (ushort)((response[0] << 8) + response[1]), + Reserved1 = response[2], + Reserved2 = response[3], + Cartridge = (response[4] & 0x80) == 0x80, + OUT = (response[4] & 0x40) == 0x40, + Reserved3 = (byte)((response[4] & 0x30) >> 4), + MSWI = (response[4] & 0x08) == 0x08, + CWP = (response[4] & 0x04) == 0x04, + PWP = (response[4] & 0x02) == 0x02, + Reserved4 = (response[4] & 0x01) == 0x01, + DiscType = response[5], + Reserved5 = response[6], + RAMSWI = response[7] + }; + } + + public static string Prettify(MediumStatus? status) + { + if(status == null) + return null; + + MediumStatus decoded = status.Value; + var sb = new StringBuilder(); + + if(decoded.PWP) + sb.AppendLine(Localization.Disc_surface_is_set_to_write_protected_status); + + if(decoded.Cartridge) + { + sb.AppendLine(Localization.Disc_comes_in_a_cartridge); + + if(decoded.OUT) + sb.AppendLine(Localization.Disc_has_been_extracted_from_the_cartridge); + + if(decoded.CWP) + sb.AppendLine(Localization.Cartridge_is_set_to_write_protected); + } + + switch(decoded.DiscType) + { + case 0: + sb.AppendLine(Localization.Disc_shall_not_be_written_without_a_cartridge); + + break; + case 0x10: + sb.AppendLine(Localization.Disc_may_be_written_without_a_cartridge); + + break; + default: + sb.AppendFormat(Localization.Unknown_disc_type_id_0, decoded.DiscType).AppendLine(); + + break; + } + + if(!decoded.MSWI) + return sb.ToString(); + + switch(decoded.RAMSWI) + { + case 0: + break; + case 1: + sb.AppendLine(Localization.Disc_is_write_inhibited_because_it_has_been_extracted_from_the_cartridge); + + break; + case 0xFF: + sb.AppendLine(Localization.Disc_is_write_inhibited_for_an_unspecified_reason); + + break; + default: + sb.AppendFormat(Localization.Disc_has_unknown_reason_0_for_write_inhibition, decoded.RAMSWI). + AppendLine(); + + break; + } + + return sb.ToString(); + } + + public static string Prettify(byte[] response) => Prettify(Decode(response)); + +#region Nested type: MediumStatus + + public struct MediumStatus + { + /// Bytes 0 to 1 Data length + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Byte 4, bit 7 Medium is in a cartridge + public bool Cartridge; + /// Byte 4, bit 6 Medium has been taken out/inserted in a cartridge + public bool OUT; + /// Byte 4, bits 5 to 4 Reserved + public byte Reserved3; + /// Byte 4, bit 3 Media is write protected by reason stablished in RAMSWI + public bool MSWI; + /// Byte 4, bit 2 Media is write protected by cartridge + public bool CWP; + /// Byte 4, bit 1 Media is persistently write protected + public bool PWP; + /// Byte 4, bit 0 Reserved + public bool Reserved4; + /// Byte 5 Writable status depending on cartridge + public byte DiscType; + /// Byte 6 Reserved + public byte Reserved5; + /// + /// Byte 7 Reason of specific write protection, only defined 0x01 as "bare disc wp", and 0xFF as unspecified. Rest + /// reserved. + /// + public byte RAMSWI; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/DVD/DDS.cs b/Aaru.Decoders/DVD/DDS.cs new file mode 100644 index 000000000..0936f09dd --- /dev/null +++ b/Aaru.Decoders/DVD/DDS.cs @@ -0,0 +1,266 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : DDS.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes DVD Disc Definition Structure. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.DVD; + +// Information from the following standards: +// ANSI X3.304-1997 +// T10/1048-D revision 9.0 +// T10/1048-D revision 10a +// T10/1228-D revision 7.0c +// T10/1228-D revision 11a +// T10/1363-D revision 10g +// T10/1545-D revision 1d +// T10/1545-D revision 5 +// T10/1545-D revision 5a +// T10/1675-D revision 2c +// T10/1675-D revision 4 +// T10/1836-D revision 2g +// ECMA 272: 120 mm DVD Rewritable Disk (DVD-RAM) +// ECMA 330: 120 mm (4,7 Gbytes per side) and 80 mm (1,46 Gbytes per side) DVD Rewritable Disk (DVD-RAM) +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +public static class DDS +{ + public static DiscDefinitionStructure? Decode(byte[] response) + { + if(response?.Length != 2052) + return null; + + var dds = new DiscDefinitionStructure + { + Identifier = (ushort)((response[4] << 8) + response[5]) + }; + + if(dds.Identifier != 0x0A0A) + return null; + + // Common to both DVD-RAM versions + dds.DataLength = (ushort)((response[0] << 8) + response[1]); + dds.Reserved1 = response[2]; + dds.Reserved2 = response[3]; + dds.Reserved3 = response[6]; + dds.InProcess |= (response[7] & 0x80) == 0x80; + dds.UserCertification |= (response[7] & 0x02) == 0x02; + dds.ManufacturerCertification |= (response[7] & 0x01) == 0x01; + + dds.UpdateCount = (uint)((response[8] << 24) + (response[9] << 16) + (response[10] << 8) + response[11]); + + dds.Groups = (ushort)((response[12] << 8) + response[13]); + + // ECMA-272 + if(dds.Groups == 24) + { + dds.PartialCertification |= (response[7] & 0x40) == 0x40; + dds.FormattingOnlyAGroup |= (response[7] & 0x20) == 0x20; + dds.Reserved4 = (byte)((response[7] & 0x1C) >> 2); + dds.Reserved = new byte[6]; + Array.Copy(response, 14, dds.Reserved, 0, 6); + dds.GroupCertificationFlags = new GroupCertificationFlag[24]; + + for(var i = 0; i < 24; i++) + { + dds.GroupCertificationFlags[i].InProcess |= (response[20 + i] & 0x80) == 0x80; + dds.GroupCertificationFlags[i].PartialCertification |= (response[20 + i] & 0x40) == 0x40; + dds.GroupCertificationFlags[i].Reserved1 = (byte)((response[20 + i] & 0x3C) >> 2); + dds.GroupCertificationFlags[i].UserCertification |= (response[20 + i] & 0x02) == 0x02; + dds.GroupCertificationFlags[i].Reserved2 |= (response[20 + i] & 0x01) == 0x01; + } + } + + // ECMA-330 + if(dds.Groups != 1) + return dds; + + { + dds.Reserved4 = (byte)((response[7] & 0x7C) >> 2); + dds.Reserved = new byte[68]; + Array.Copy(response, 16, dds.Reserved, 0, 68); + dds.Zones = (ushort)((response[14] << 8) + response[15]); + dds.SpareAreaFirstPSN = (uint)((response[85] << 16) + (response[86] << 8) + response[87]); + dds.SpareAreaLastPSN = (uint)((response[89] << 16) + (response[90] << 8) + response[91]); + dds.LSN0Location = (uint)((response[93] << 16) + (response[94] << 8) + response[95]); + dds.StartLSNForZone = new uint[dds.Zones]; + + for(var i = 0; i < dds.Zones; i++) + { + dds.StartLSNForZone[i] = (uint)((response[260 + i * 4 + 1] << 16) + + (response[260 + i * 4 + 2] << 8) + + response[260 + i * 4 + 3]); + } + } + + return dds; + } + + public static string Prettify(DiscDefinitionStructure? dds) + { + if(dds == null) + return null; + + DiscDefinitionStructure decoded = dds.Value; + var sb = new StringBuilder(); + + if(decoded.InProcess) + { + sb.AppendLine(Localization.Formatting_in_progress); + + if(decoded.Groups == 24) + { + if(decoded.PartialCertification) + sb.AppendLine(Localization.Formatting_is_only_using_partial_certification); + + if(decoded.FormattingOnlyAGroup) + sb.AppendLine(Localization.Only_a_group_is_being_formatted); + } + } + + if(decoded.UserCertification) + sb.AppendLine(Localization.Disc_has_been_certified_by_a_user); + + if(decoded.ManufacturerCertification) + sb.AppendLine(Localization.Disc_has_been_certified_by_a_manufacturer); + + sb.AppendFormat(Localization.DDS_has_been_updated_0_times, decoded.UpdateCount).AppendLine(); + + if(decoded.Groups == 24) + { + for(var i = 0; i < decoded.GroupCertificationFlags.Length; i++) + { + if(decoded.GroupCertificationFlags[i].InProcess) + { + sb.AppendFormat(Localization.Group_0_is_being_formatted, i).AppendLine(); + + if(decoded.GroupCertificationFlags[i].PartialCertification) + sb.AppendFormat(Localization.Group_0_is_being_certified_partially, i).AppendLine(); + } + + if(decoded.GroupCertificationFlags[i].UserCertification) + sb.AppendFormat(Localization.Group_0_has_been_certified_by_an_user, i).AppendLine(); + } + } + + if(decoded.Groups != 1) + return sb.ToString(); + + { + sb.AppendFormat(Localization.Disc_has_0_zones, decoded.Zones).AppendLine(); + + sb.AppendFormat(Localization.Primary_Spare_Area_stats_at_PSN_0_and_ends_at_PSN_1_inclusively, + decoded.SpareAreaFirstPSN, decoded.SpareAreaLastPSN). + AppendLine(); + + sb.AppendFormat(Localization.LSN_zero_is_at_PSN_0, decoded.LSN0Location).AppendLine(); + + for(var i = 0; i < decoded.StartLSNForZone.Length; i++) + sb.AppendFormat(Localization.Zone_0_starts_at_LSN_1, i, decoded.StartLSNForZone[i]).AppendLine(); + } + + return sb.ToString(); + } + + public static string Prettify(byte[] response) => Prettify(Decode(response)); + +#region Nested type: DiscDefinitionStructure + + public struct DiscDefinitionStructure + { + /// Bytes 0 to 1 Data length + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + + /// Bytes 4 to 5 DDS Identifier = 0x0A0A + public ushort Identifier; + /// Byte 6 Reserved + public byte Reserved3; + /// Byte 7, bit 7 If set, formatting is in process + public bool InProcess; + /// Byte 7, bit 6 If set, formatting is using partial certification Only in ECMA-272 + public bool PartialCertification; + /// Byte 7, bit 5 If set, only a group is being formatted Only in ECMA-272 + public bool FormattingOnlyAGroup; + /// Byte 7, bits 4 to 2 Reserved + public byte Reserved4; + /// Byte 7, bit 1 If set, disk has been certified by a user + public bool UserCertification; + /// Byte 7, bit 0 If set, disk has been certified by a manufacturer + public bool ManufacturerCertification; + /// Bytes 8 to 11 How many times the DDS has been updated + public uint UpdateCount; + /// Bytes 12 to 13 How many groups the disk has 24 for ECMA-272 1 for ECMA-330 + public ushort Groups; + /// Bytes 14 to 15 How many zones the disk has Only in ECMA-330 + public ushort Zones; + /// Bytes 14 to 19 in ECMA-272 Bytes 16 to 83 in ECMA-330 Reserved + public byte[] Reserved; + /// Bytes 20 to 43 Group certification flags + public GroupCertificationFlag[] GroupCertificationFlags; + + /// Bytes 85 to 87 Location of first sector in the Primary Spare Area + public uint SpareAreaFirstPSN; + /// Bytes 89 to 91 Location of first sector in the Primary Spare Area + public uint SpareAreaLastPSN; + /// Bytes 93 to 95 PSN for LSN 0 + public uint LSN0Location; + /// The starting LSN of each zone + public uint[] StartLSNForZone; + } + +#endregion + +#region Nested type: GroupCertificationFlag + + public struct GroupCertificationFlag + { + /// Bit 7 If set, formatting of this group is in process + public bool InProcess; + /// Bit 6 If set, formatting is using partial certification + public bool PartialCertification; + /// Bits 5 to 2 Reserved + public byte Reserved1; + /// Bit 1 If set, this group has been certified by user + public bool UserCertification; + /// Bit 0 Reserved + public bool Reserved2; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/DVD/DMI.cs b/Aaru.Decoders/DVD/DMI.cs new file mode 100644 index 000000000..8ed5dcfde --- /dev/null +++ b/Aaru.Decoders/DVD/DMI.cs @@ -0,0 +1,73 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : DMI.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes DVD Disc Manufacturer Information. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; + +namespace Aaru.Decoders.DVD; + +// Information from the following standards: +// ANSI X3.304-1997 +// T10/1048-D revision 9.0 +// T10/1048-D revision 10a +// T10/1228-D revision 7.0c +// T10/1228-D revision 11a +// T10/1363-D revision 10g +// T10/1545-D revision 1d +// T10/1545-D revision 5 +// T10/1545-D revision 5a +// T10/1675-D revision 2c +// T10/1675-D revision 4 +// T10/1836-D revision 2g +// ECMA 365 +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +[SuppressMessage("ReSharper", "UnusedType.Global")] +public static class DMI +{ +#region Nested type: DiscManufacturingInformation + + public struct DiscManufacturingInformation + { + /// Bytes 0 to 1 Data length + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Bytes 4 to 2052 Disc Manufacturing Information + public byte[] DMI; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/DVD/Enums.cs b/Aaru.Decoders/DVD/Enums.cs new file mode 100644 index 000000000..bc2f58dd8 --- /dev/null +++ b/Aaru.Decoders/DVD/Enums.cs @@ -0,0 +1,186 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : Enums.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Contains various DVD enumerations. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + + +// ReSharper disable UnusedMember.Global +// ReSharper disable InconsistentNaming +// ReSharper disable UnusedType.Global + +namespace Aaru.Decoders.DVD; + +#region Public enumerations + +public enum DiskCategory : byte +{ + /// DVD-ROM. Version 1 is ECMA-267 and ECMA-268. + DVDROM = 0, + /// DVD-RAM. Version 1 is ECMA-272. Version 6 is ECMA-330. + DVDRAM = 1, + /// DVD-R. Version 1 is ECMA-279. Version 5 is ECMA-359. Version 6 is ECMA-382. + DVDR = 2, + /// DVD-RW. Version 2 is ECMA-338. Version 3 is ECMA-384. + DVDRW = 3, + /// HD DVD-ROM + HDDVDROM = 4, + /// HD DVD-RAM + HDDVDRAM = 5, + /// HD DVD-R + HDDVDR = 6, + /// HD DVD-RW + HDDVDRW = 7, + /// UMD. Version 0 is ECMA-365. + UMD = 8, + /// DVD+RW. Version 1 is ECMA-274. Version 2 is ECMA-337. Version 3 is ECMA-371. + DVDPRW = 9, + /// DVD+R. Version 1 is ECMA-349. + DVDPR = 10, + /// DVD+RW DL. Version 1 is ECMA-374. + DVDPRWDL = 13, + /// DVD+R DL. Version 1 is ECMA-364. + DVDPRDL = 14, + /// According to standards this value is reserved. It's used by Nintendo GODs and WODs. + Nintendo = 15 +} + +public enum MaximumRateField : byte +{ + /// 2.52 Mbps + TwoMbps = 0x00, + /// 5.04 Mbps + FiveMbps = 0x01, + /// 10.08 Mbps + TenMbps = 0x02, + /// 20.16 Mbps + TwentyMbps = 0x03, + /// 30.24 Mbps + ThirtyMbps = 0x04, + Unspecified = 0x0F +} + +public enum LayerTypeFieldMask : byte +{ + Embossed = 0x01, + Recordable = 0x02, + Rewritable = 0x04, + Reserved = 0x08 +} + +public enum LinearDensityField : byte +{ + /// 0.267 μm/bit + TwoSix = 0x00, + /// 0.293 μm/bit + TwoNine = 0x01, + /// 0.409 to 0.435 μm/bit + FourZero = 0x02, + /// 0.280 to 0.291 μm/bit + TwoEight = 0x04, + /// 0.153 μm/bit + OneFive = 0x05, + /// 0.130 to 0.140 μm/bit + OneThree = 0x06, + /// 0.353 μm/bit + ThreeFive = 0x08 +} + +public enum TrackDensityField : byte +{ + /// 0.74 μm/track + Seven = 0x00, + /// 0.80 μm/track + Eight = 0x01, + /// 0.615 μm/track + Six = 0x02, + /// 0.40 μm/track + Four = 0x03, + /// 0.34 μm/track + Three = 0x04 +} + +public enum CopyrightType : byte +{ + /// There is no copy protection + NoProtection = 0x00, + /// Copy protection is CSS/CPPM + CSS = 0x01, + /// Copy protection is CPRM + CPRM = 0x02, + /// Copy protection is AACS + AACS = 0x10 +} + +public enum WPDiscTypes : byte +{ + /// Should not write without a cartridge + DoNotWrite = 0x00, + /// Can write without a cartridge + CanWrite = 0x01, + Reserved1 = 0x02, + Reserved2 = 0x03 +} + +public enum DVDSize +{ + /// 120 mm + OneTwenty = 0, + /// 80 mm + Eighty = 1 +} + +public enum DVDRAMDiscType +{ + /// Shall not be recorded without a case + Cased = 0, + /// May be recorded without a case or within one + Uncased = 1 +} + +public enum DVDLayerStructure +{ + Unspecified = 0, + InvertedStack = 1, + TwoP = 2, + Reserved = 3 +} + +public enum DVDRecordingSpeed +{ + None = 0, + Two = 0, + Four = 0x10, + Six = 0x20, + Eight = 0x30, + Ten = 0x40, + Twelve = 0x50 +} + +#endregion \ No newline at end of file diff --git a/Aaru.Decoders/DVD/Layers.cs b/Aaru.Decoders/DVD/Layers.cs new file mode 100644 index 000000000..459eb1d57 --- /dev/null +++ b/Aaru.Decoders/DVD/Layers.cs @@ -0,0 +1,157 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : Layers.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Records DVD layers structures. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; + +namespace Aaru.Decoders.DVD; + +// Information from the following standards: +// ANSI X3.304-1997 +// T10/1048-D revision 9.0 +// T10/1048-D revision 10a +// T10/1228-D revision 7.0c +// T10/1228-D revision 11a +// T10/1363-D revision 10g +// T10/1545-D revision 1d +// T10/1545-D revision 5 +// T10/1545-D revision 5a +// T10/1675-D revision 2c +// T10/1675-D revision 4 +// T10/1836-D revision 2g +// ECMA 365 +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "UnusedType.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +public static class Layers +{ +#region Nested type: JumpIntervalSize + + public struct JumpIntervalSize + { + /// Bytes 0 to 1 Data length = 10 + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Byte 4 Reserved + public byte Reserved3; + /// Byte 5 Reserved + public byte Reserved4; + /// Byte 6 Reserved + public byte Reserved5; + /// Byte 7 Reserved + public byte Reserved6; + /// Byte 8 to 11 Jump Interval size for the Regular Interval Layer Jump + public uint Size; + } + +#endregion + +#region Nested type: LayerCapacity + + public struct LayerCapacity + { + /// Bytes 0 to 1 Data length + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Byte 4, bit 7 If set, L0 capacity is immutable + public bool InitStatus; + /// Byte 4, bits 6 to 0 Reserved + public byte Reserved3; + /// Byte 5 Reserved + public byte Reserved4; + /// Byte 6 Reserved + public byte Reserved5; + /// Byte 7 Reserved + public byte Reserved6; + /// Byte 8 to 11 L0 Data Area Capacity + public uint Capacity; + } + +#endregion + +#region Nested type: ManualLayerJumpAddress + + public struct ManualLayerJumpAddress + { + /// Bytes 0 to 1 Data length = 10 + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Byte 4 Reserved + public byte Reserved3; + /// Byte 5 Reserved + public byte Reserved4; + /// Byte 6 Reserved + public byte Reserved5; + /// Byte 7 Reserved + public byte Reserved6; + /// Byte 8 to 11 LBA for the manual layer jump + public uint LBA; + } + +#endregion + +#region Nested type: MiddleZoneStartAddress + + public struct MiddleZoneStartAddress + { + /// Bytes 0 to 1 Data length = 10 + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Byte 4, bit 7 If set, L0 shifter middle area is immutable + public bool InitStatus; + /// Byte 4, bits 6 to 0 Reserved + public byte Reserved3; + /// Byte 5 Reserved + public byte Reserved4; + /// Byte 6 Reserved + public byte Reserved5; + /// Byte 7 Reserved + public byte Reserved6; + /// Byte 8 to 11 Start LBA of Shifted Middle Area on L0 + public uint ShiftedMiddleAreaStartAddress; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/DVD/PFI.cs b/Aaru.Decoders/DVD/PFI.cs new file mode 100644 index 000000000..a43220d7c --- /dev/null +++ b/Aaru.Decoders/DVD/PFI.cs @@ -0,0 +1,1621 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : PFI.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Records DVD Physical Format Information. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Text; +using Aaru.CommonTypes; +using Aaru.Helpers; + +namespace Aaru.Decoders.DVD; + +// Information from the following standards: +// ANSI X3.304-1997 +// T10/1048-D revision 9.0 +// T10/1048-D revision 10a +// T10/1228-D revision 7.0c +// T10/1228-D revision 11a +// T10/1363-D revision 10g +// T10/1545-D revision 1d +// T10/1545-D revision 5 +// T10/1545-D revision 5a +// T10/1675-D revision 2c +// T10/1675-D revision 4 +// T10/1836-D revision 2g +// ECMA 267: 120 mm DVD - Read-Only Disk +// ECMA 268: 80 mm DVD - Read-Only Disk +// ECMA 272: 120 mm DVD Rewritable Disk (DVD-RAM) +// ECMA 274: Data Interchange on 120 mm Optical Disk using +RW Format - Capacity: 3,0 Gbytes and 6,0 Gbytes +// ECMA 279: 80 mm (1,23 Gbytes per side) and 120 mm (3,95 Gbytes per side) DVD-Recordable Disk (DVD-R) +// ECMA 330: 120 mm (4,7 Gbytes per side) and 80 mm (1,46 Gbytes per side) DVD Rewritable Disk (DVD-RAM) +// ECMA 337: Data Interchange on 120 mm and 80 mm Optical Disk using +RW Format - Capacity: 4,7 and 1,46 Gbytes per Side +// ECMA 338: 80 mm (1,46 Gbytes per side) and 120 mm (4,70 Gbytes per side) DVD Re-recordable Disk (DVD-RW) +// ECMA 349: Data Interchange on 120 mm and 80 mm Optical Disk using +R Format - Capacity: 4,7 and 1,46 Gbytes per Side +// ECMA 359: 80 mm (1,46 Gbytes per side) and 120 mm (4,70 Gbytes per side) DVD Recordable Disk (DVD-R) +// ECMA 364: Data Interchange on 120 mm and 80 mm Optical Disk using +R DL Format - Capacity 8,55 and 2,66 Gbytes per Side +// ECMA 365: Data Interchange on 60 mm Read-Only ODC - Capacity: 1,8 Gbytes (UMD™) +// ECMA 371: Data Interchange on 120 mm and 80 mm Optical Disk using +RW HS Format - Capacity 4,7 and 1,46 Gbytes per side +// ECMA 374: Data Interchange on 120 mm and 80 mm Optical Disk using +RW DL Format - Capacity 8,55 and 2,66 Gbytes per side +// ECMA 382: 120 mm (8,54 Gbytes per side) and 80 mm (2,66 Gbytes per side) DVD Recordable Disk for Dual Layer (DVD-R for DL) +// ECMA 384: 120 mm (8,54 Gbytes per side) and 80 mm (2,66 Gbytes per side) DVD Re-recordable Disk for Dual Layer (DVD-RW for DL) +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +public static class PFI +{ + public static PhysicalFormatInformation? Decode(byte[] response, MediaType mediaType) + { + if(response == null) + return null; + + if(response.Length == 2048) + { + var tmp2 = new byte[2052]; + Array.Copy(response, 0, tmp2, 4, 2048); + response = tmp2; + } + + if(response.Length < 2052) + return null; + + var pfi = new PhysicalFormatInformation(); + byte[] tmp; + + pfi.DataLength = (ushort)((response[0] << 8) + response[1]); + pfi.Reserved1 = response[2]; + pfi.Reserved2 = response[3]; + + // Common + pfi.DiskCategory = (DiskCategory)((response[4] & 0xF0) >> 4); + pfi.PartVersion = (byte)(response[4] & 0x0F); + pfi.DiscSize = (DVDSize)((response[5] & 0xF0) >> 4); + pfi.MaximumRate = (MaximumRateField)(response[5] & 0x0F); + pfi.Reserved3 |= (response[6] & 0x80) == 0x80; + pfi.Layers = (byte)((response[6] & 0x60) >> 5); + pfi.TrackPath |= (response[6] & 0x08) == 0x08; + pfi.LayerType = (LayerTypeFieldMask)(response[6] & 0x07); + pfi.LinearDensity = (LinearDensityField)((response[7] & 0xF0) >> 4); + pfi.TrackDensity = (TrackDensityField)(response[7] & 0x0F); + + pfi.DataAreaStartPSN = (uint)((response[8] << 24) + (response[9] << 16) + (response[10] << 8) + response[11]); + + pfi.DataAreaEndPSN = (uint)((response[12] << 24) + (response[13] << 16) + (response[14] << 8) + response[15]); + + pfi.Layer0EndPSN = (uint)((response[16] << 24) + (response[17] << 16) + (response[18] << 8) + response[19]); + + pfi.BCA |= (response[20] & 0x80) == 0x80; + + pfi.RecordedBookType = pfi.DiskCategory; + + if(mediaType != MediaType.DVDROM) + { + switch(mediaType) + { + case MediaType.DVDPR: + pfi.DiskCategory = DiskCategory.DVDPR; + + break; + case MediaType.DVDPRDL: + pfi.DiskCategory = DiskCategory.DVDPRDL; + + break; + case MediaType.DVDPRW: + pfi.DiskCategory = DiskCategory.DVDPRW; + + break; + case MediaType.DVDPRWDL: + pfi.DiskCategory = DiskCategory.DVDPRWDL; + + break; + case MediaType.DVDRDL: + pfi.DiskCategory = DiskCategory.DVDR; + + if(pfi.PartVersion < 6) + pfi.PartVersion = 6; + + break; + case MediaType.DVDR: + pfi.DiskCategory = DiskCategory.DVDR; + + if(pfi.PartVersion > 5) + pfi.PartVersion = 5; + + break; + case MediaType.DVDRAM: + pfi.DiskCategory = DiskCategory.DVDRAM; + + break; + case MediaType.DVDRWDL: + pfi.DiskCategory = DiskCategory.DVDRW; + + if(pfi.PartVersion < 15) + pfi.PartVersion = 15; + + break; + case MediaType.DVDRW: + pfi.DiskCategory = DiskCategory.DVDRW; + + if(pfi.PartVersion > 14) + pfi.PartVersion = 14; + + break; + + case MediaType.HDDVDR: + pfi.DiskCategory = DiskCategory.HDDVDR; + + break; + case MediaType.HDDVDRAM: + pfi.DiskCategory = DiskCategory.HDDVDRAM; + + break; + case MediaType.HDDVDROM: + pfi.DiskCategory = DiskCategory.HDDVDROM; + + break; + case MediaType.HDDVDRW: + pfi.DiskCategory = DiskCategory.HDDVDRW; + + break; + case MediaType.GOD: + pfi.DiscSize = DVDSize.Eighty; + pfi.DiskCategory = DiskCategory.Nintendo; + + break; + case MediaType.WOD: + pfi.DiscSize = DVDSize.OneTwenty; + pfi.DiskCategory = DiskCategory.Nintendo; + + break; + case MediaType.UMD: + pfi.DiskCategory = DiskCategory.UMD; + + break; + } + } + + switch(pfi.DiskCategory) + { + // UMD + case DiskCategory.UMD: + pfi.MediaAttribute = (ushort)((response[21] << 8) + response[22]); + + break; + + // DVD-RAM + case DiskCategory.DVDRAM: + pfi.DiscType = (DVDRAMDiscType)response[36]; + + switch(pfi.PartVersion) + { + case 1: + pfi.Velocity = response[52]; + pfi.ReadPower = response[53]; + pfi.PeakPower = response[54]; + pfi.BiasPower = response[55]; + pfi.FirstPulseStart = response[56]; + pfi.FirstPulseEnd = response[57]; + pfi.MultiPulseDuration = response[58]; + pfi.LastPulseStart = response[59]; + pfi.LastPulseEnd = response[60]; + pfi.BiasPowerDuration = response[61]; + pfi.PeakPowerGroove = response[62]; + pfi.BiasPowerGroove = response[63]; + pfi.FirstPulseStartGroove = response[64]; + pfi.FirstPulseEndGroove = response[65]; + pfi.MultiplePulseDurationGroove = response[66]; + pfi.LastPulseStartGroove = response[67]; + pfi.LastPulseEndGroove = response[68]; + pfi.BiasPowerDurationGroove = response[69]; + + break; + case >= 6: + pfi.Velocity = response[504]; + pfi.ReadPower = response[505]; + pfi.AdaptativeWritePulseControlFlag |= (response[506] & 0x80) == 0x80; + pfi.PeakPower = response[507]; + pfi.BiasPower1 = response[508]; + pfi.BiasPower2 = response[509]; + pfi.BiasPower3 = response[510]; + pfi.PeakPowerGroove = response[511]; + pfi.BiasPower1Groove = response[512]; + pfi.BiasPower2Groove = response[513]; + pfi.BiasPower3Groove = response[514]; + pfi.FirstPulseEnd = response[515]; + pfi.FirstPulseDuration = response[516]; + pfi.MultiPulseDuration = response[518]; + pfi.LastPulseStart = response[519]; + pfi.BiasPower2Duration = response[520]; + pfi.FirstPulseStart3TSpace3T = response[521]; + pfi.FirstPulseStart4TSpace3T = response[522]; + pfi.FirstPulseStart5TSpace3T = response[523]; + pfi.FirstPulseStartSpace3T = response[524]; + pfi.FirstPulseStart3TSpace4T = response[525]; + pfi.FirstPulseStart4TSpace4T = response[526]; + pfi.FirstPulseStart5TSpace4T = response[527]; + pfi.FirstPulseStartSpace4T = response[528]; + pfi.FirstPulseStart3TSpace5T = response[529]; + pfi.FirstPulseStart4TSpace5T = response[530]; + pfi.FirstPulseStart5TSpace5T = response[531]; + pfi.FirstPulseStartSpace5T = response[532]; + pfi.FirstPulseStart3TSpace = response[533]; + pfi.FirstPulseStart4TSpace = response[534]; + pfi.FirstPulseStart5TSpace = response[535]; + pfi.FirstPulseStartSpace = response[536]; + pfi.FirstPulse3TStartTSpace3T = response[537]; + pfi.FirstPulse4TStartTSpace3T = response[538]; + pfi.FirstPulse5TStartTSpace3T = response[539]; + pfi.FirstPulseStartTSpace3T = response[540]; + pfi.FirstPulse3TStartTSpace4T = response[541]; + pfi.FirstPulse4TStartTSpace4T = response[542]; + pfi.FirstPulse5TStartTSpace4T = response[543]; + pfi.FirstPulseStartTSpace4T = response[544]; + pfi.FirstPulse3TStartTSpace5T = response[545]; + pfi.FirstPulse4TStartTSpace5T = response[546]; + pfi.FirstPulse5TStartTSpace5T = response[547]; + pfi.FirstPulseStartTSpace5T = response[548]; + pfi.FirstPulse3TStartTSpace = response[549]; + pfi.FirstPulse4TStartTSpace = response[550]; + pfi.FirstPulse5TStartTSpace = response[551]; + pfi.FirstPulseStartTSpace = response[552]; + tmp = new byte[48]; + Array.Copy(response, 553, tmp, 0, 48); + pfi.DiskManufacturer = StringHandlers.SpacePaddedToString(tmp); + tmp = new byte[16]; + Array.Copy(response, 601, tmp, 0, 16); + pfi.DiskManufacturerSupplementary = StringHandlers.SpacePaddedToString(tmp); + pfi.WritePowerControlParams = new byte[2]; + pfi.WritePowerControlParams[0] = response[617]; + pfi.WritePowerControlParams[1] = response[618]; + pfi.PowerRatioLandThreshold = response[619]; + pfi.TargetAsymmetry = response[620]; + pfi.TemporaryPeakPower = response[621]; + pfi.TemporaryBiasPower1 = response[622]; + pfi.TemporaryBiasPower2 = response[623]; + pfi.TemporaryBiasPower3 = response[624]; + pfi.PowerRatioGrooveThreshold = response[625]; + pfi.PowerRatioLandThreshold6T = response[626]; + pfi.PowerRatioGrooveThreshold6T = response[627]; + + break; + } + + break; + + // DVD-R and DVD-RW + case DiskCategory.DVDR when pfi.PartVersion < 6: + case DiskCategory.DVDRW when pfi.PartVersion < 15: + pfi.CurrentBorderOutSector = + (uint)((response[36] << 24) + (response[37] << 16) + (response[38] << 8) + response[39]); + + pfi.NextBorderInSector = + (uint)((response[40] << 24) + (response[41] << 16) + (response[42] << 8) + response[43]); + + break; + + // DVD+RW + case DiskCategory.DVDPRW: + pfi.RecordingVelocity = response[36]; + pfi.ReadPowerMaxVelocity = response[37]; + pfi.PIndMaxVelocity = response[38]; + pfi.PMaxVelocity = response[39]; + pfi.E1MaxVelocity = response[40]; + pfi.E2MaxVelocity = response[41]; + pfi.YTargetMaxVelocity = response[42]; + pfi.ReadPowerRefVelocity = response[43]; + pfi.PIndRefVelocity = response[44]; + pfi.PRefVelocity = response[45]; + pfi.E1RefVelocity = response[46]; + pfi.E2RefVelocity = response[47]; + pfi.YTargetRefVelocity = response[48]; + pfi.ReadPowerMinVelocity = response[49]; + pfi.PIndMinVelocity = response[50]; + pfi.PMinVelocity = response[51]; + pfi.E1MinVelocity = response[52]; + pfi.E2MinVelocity = response[53]; + pfi.YTargetMinVelocity = response[54]; + + break; + } + + // DVD+R, DVD+RW, DVD+R DL and DVD+RW DL + if(pfi.DiskCategory is DiskCategory.DVDPR or DiskCategory.DVDPRW or DiskCategory.DVDPRDL + or DiskCategory.DVDPRWDL) + { + pfi.VCPS |= (response[20] & 0x40) == 0x40; + pfi.ApplicationCode = response[21]; + pfi.ExtendedInformation = response[22]; + tmp = new byte[8]; + Array.Copy(response, 23, tmp, 0, 8); + pfi.DiskManufacturerID = StringHandlers.CToString(tmp); + tmp = new byte[3]; + Array.Copy(response, 31, tmp, 0, 3); + pfi.MediaTypeID = StringHandlers.CToString(tmp); + + pfi.ProductRevision = pfi.DiskCategory == DiskCategory.DVDPRDL ? (byte)(response[34] & 0x3F) : response[34]; + + pfi.PFIUsedInADIP = response[35]; + } + + switch(pfi.DiskCategory) + { + // DVD+RW + case DiskCategory.DVDPRW when pfi.PartVersion == 2: + pfi.TopFirstPulseDuration = response[55]; + pfi.MultiPulseDuration = response[56]; + pfi.FirstPulseLeadTime = response[57]; + pfi.EraseLeadTimeRefVelocity = response[58]; + pfi.EraseLeadTimeUppVelocity = response[59]; + + break; + + // DVD+R and DVD+R DL + case DiskCategory.DVDPR: + case DiskCategory.DVDPRDL: + pfi.PrimaryVelocity = response[36]; + pfi.UpperVelocity = response[37]; + pfi.Wavelength = response[38]; + pfi.NormalizedPowerDependency = response[39]; + pfi.MaximumPowerAtPrimaryVelocity = response[40]; + pfi.PindAtPrimaryVelocity = response[41]; + pfi.BtargetAtPrimaryVelocity = response[42]; + pfi.MaximumPowerAtUpperVelocity = response[43]; + pfi.PindAtUpperVelocity = response[44]; + pfi.BtargetAtUpperVelocity = response[45]; + pfi.FirstPulseDuration4TPrimaryVelocity = response[46]; + pfi.FirstPulseDuration3TPrimaryVelocity = response[47]; + pfi.MultiPulseDurationPrimaryVelocity = response[48]; + pfi.LastPulseDurationPrimaryVelocity = response[49]; + pfi.FirstPulseLeadTime4TPrimaryVelocity = response[50]; + pfi.FirstPulseLeadTime3TPrimaryVelocity = response[51]; + pfi.FirstPulseLeadingEdgePrimaryVelocity = response[52]; + pfi.FirstPulseDuration4TUpperVelocity = response[53]; + pfi.FirstPulseDuration3TUpperVelocity = response[54]; + pfi.MultiPulseDurationUpperVelocity = response[55]; + pfi.LastPulseDurationUpperVelocity = response[56]; + pfi.FirstPulseLeadTime4TUpperVelocity = response[57]; + pfi.FirstPulseLeadTime3TUpperVelocity = response[58]; + pfi.FirstPulseLeadingEdgeUpperVelocity = response[59]; + + break; + } + + switch(pfi.DiskCategory) + { + // DVD+R DL + case DiskCategory.DVDPRDL: + pfi.LayerStructure = (DVDLayerStructure)((response[34] & 0xC0) >> 6); + + break; + + // DVD+RW DL + case DiskCategory.DVDPRWDL: + pfi.BasicPrimaryVelocity = response[36]; + pfi.MaxReadPowerPrimaryVelocity = response[37]; + pfi.PindPrimaryVelocity = response[38]; + pfi.PPrimaryVelocity = response[39]; + pfi.E1PrimaryVelocity = response[40]; + pfi.E2PrimaryVelocity = response[41]; + pfi.YtargetPrimaryVelocity = response[42]; + pfi.BOptimumPrimaryVelocity = response[43]; + pfi.TFirstPulseDuration = response[46]; + pfi.TMultiPulseDuration = response[47]; + pfi.FirstPulseLeadTimeAnyRun = response[48]; + pfi.FirstPulseLeadTimeRun3T = response[49]; + pfi.LastPulseLeadTimeAnyRun = response[50]; + pfi.LastPulseLeadTime3T = response[51]; + pfi.LastPulseLeadTime4T = response[52]; + pfi.ErasePulseLeadTimeAny = response[53]; + pfi.ErasePulseLeadTime3T = response[54]; + pfi.ErasePulseLeadTime4T = response[55]; + + break; + + // DVD-R DL and DVD-RW DL + case DiskCategory.DVDR when pfi.PartVersion >= 6: + case DiskCategory.DVDRW when pfi.PartVersion >= 15: + pfi.MaxRecordingSpeed = (DVDRecordingSpeed)response[21]; + pfi.MinRecordingSpeed = (DVDRecordingSpeed)response[22]; + pfi.RecordingSpeed1 = (DVDRecordingSpeed)response[23]; + pfi.RecordingSpeed2 = (DVDRecordingSpeed)response[24]; + pfi.RecordingSpeed3 = (DVDRecordingSpeed)response[25]; + pfi.RecordingSpeed4 = (DVDRecordingSpeed)response[26]; + pfi.RecordingSpeed5 = (DVDRecordingSpeed)response[27]; + pfi.RecordingSpeed6 = (DVDRecordingSpeed)response[28]; + pfi.RecordingSpeed7 = (DVDRecordingSpeed)response[29]; + pfi.Class = response[30]; + pfi.ExtendedVersion = response[31]; + + pfi.CurrentBorderOutSector = + (uint)((response[36] << 24) + (response[37] << 16) + (response[38] << 8) + response[39]); + + pfi.NextBorderInSector = + (uint)((response[40] << 24) + (response[41] << 16) + (response[42] << 8) + response[43]); + + pfi.PreRecordedControlDataInv |= (response[44] & 0x01) == 0x01; + pfi.PreRecordedLeadIn |= (response[44] & 0x02) == 0x02; + pfi.PreRecordedLeadOut |= (response[44] & 0x08) == 0x08; + pfi.ARCharLayer1 = (byte)(response[45] & 0x0F); + pfi.TrackPolarityLayer1 = (byte)((response[45] & 0xF0) >> 4); + + break; + } + + return pfi; + } + + public static string Prettify(PhysicalFormatInformation? pfi) + { + if(pfi == null) + return null; + + PhysicalFormatInformation decoded = pfi.Value; + var sb = new StringBuilder(); + + string sizeString = decoded.DiscSize switch + { + DVDSize.Eighty => Localization._80mm, + DVDSize.OneTwenty => Localization._120mm, + _ => string.Format(Localization.unknown_size_identifier_0, decoded.DiscSize) + }; + + switch(decoded.DiskCategory) + { + case DiskCategory.DVDROM: + sb.AppendFormat(Localization.Disc_is_a_0_1_version_2, sizeString, "DVD-ROM", decoded.PartVersion). + AppendLine(); + + switch(decoded.DiscSize) + { + case DVDSize.OneTwenty when decoded.PartVersion == 1: + sb.AppendLine(Localization.Disc_claims_conformation_to_ECMA_267); + + break; + case DVDSize.Eighty when decoded.PartVersion == 1: + sb.AppendLine(Localization.Disc_claims_conformation_to_ECMA_268); + + break; + } + + break; + case DiskCategory.DVDRAM: + sb.AppendFormat(Localization.Disc_is_a_0_1_version_2, sizeString, "DVD-RAM", decoded.PartVersion). + AppendLine(); + + switch(decoded.PartVersion) + { + case 1: + sb.AppendLine(Localization.Disc_claims_conformation_to_ECMA_272); + + break; + case 6: + sb.AppendLine(Localization.Disc_claims_conformation_to_ECMA_330); + + break; + } + + break; + case DiskCategory.DVDR: + if(decoded.PartVersion >= 6) + { + sb.AppendFormat(Localization.Disc_is_a_0_1_version_2, sizeString, "DVD-R DL", decoded.PartVersion). + AppendLine(); + } + else + { + sb.AppendFormat(Localization.Disc_is_a_0_1_version_2, sizeString, "DVD-R", decoded.PartVersion). + AppendLine(); + } + + switch(decoded.PartVersion) + { + case 1: + sb.AppendLine(Localization.Disc_claims_conformation_to_ECMA_279); + + break; + case 5: + sb.AppendLine(Localization.Disc_claims_conformation_to_ECMA_359); + + break; + case 6: + sb.AppendLine(Localization.Disc_claims_conformation_to_ECMA_382); + + break; + } + + break; + case DiskCategory.DVDRW: + if(decoded.PartVersion >= 15) + { + sb.AppendFormat(Localization.Disc_is_a_0_1_version_2, sizeString, "DVD-RW DL", decoded.PartVersion). + AppendLine(); + } + else + { + sb.AppendFormat(Localization.Disc_is_a_0_1_version_2, sizeString, "DVD-RW", decoded.PartVersion). + AppendLine(); + } + + switch(decoded.PartVersion) + { + case 2: + sb.AppendLine(Localization.Disc_claims_conformation_to_ECMA_338); + + break; + case 3: + sb.AppendLine(Localization.Disc_claims_conformation_to_ECMA_384); + + break; + } + + break; + case DiskCategory.UMD: + if(decoded.DiscSize == DVDSize.OneTwenty) + { + sb.AppendFormat(Localization.Disc_is_a_0_1_version_2, Localization._60mm, "UMD", + decoded.PartVersion). + AppendLine(); + } + else + { + sb.AppendFormat(Localization.Disc_is_a_0_1_version_2, Localization.invalid_size, "UMD", + decoded.PartVersion). + AppendLine(); + } + + switch(decoded.PartVersion) + { + case 0: + sb.AppendLine(Localization.Disc_claims_conformation_to_ECMA_365); + + break; + } + + break; + case DiskCategory.DVDPRW: + sb.AppendFormat(Localization.Disc_is_a_0_1_version_2, sizeString, "DVD+RW", decoded.PartVersion). + AppendLine(); + + switch(decoded.PartVersion) + { + case 1: + sb.AppendLine(Localization.Disc_claims_conformation_to_ECMA_274); + + break; + case 2: + sb.AppendLine(Localization.Disc_claims_conformation_to_ECMA_337); + + break; + case 3: + sb.AppendLine(Localization.Disc_claims_conformation_to_ECMA_371); + + break; + } + + break; + case DiskCategory.DVDPR: + sb.AppendFormat(Localization.Disc_is_a_0_1_version_2, sizeString, "DVD+R", decoded.PartVersion). + AppendLine(); + + switch(decoded.PartVersion) + { + case 1: + sb.AppendLine(Localization.Disc_claims_conformation_to_ECMA_349); + + break; + } + + break; + case DiskCategory.DVDPRWDL: + sb.AppendFormat(Localization.Disc_is_a_0_1_version_2, sizeString, "DVD+RW DL", decoded.PartVersion). + AppendLine(); + + switch(decoded.PartVersion) + { + case 1: + sb.AppendLine(Localization.Disc_claims_conformation_to_ECMA_374); + + break; + } + + break; + case DiskCategory.DVDPRDL: + sb.AppendFormat(Localization.Disc_is_a_0_1_version_2, sizeString, "DVD+R DL", decoded.PartVersion). + AppendLine(); + + switch(decoded.PartVersion) + { + case 1: + sb.AppendLine(Localization.Disc_claims_conformation_to_ECMA_364); + + break; + } + + break; + case DiskCategory.Nintendo: + if(decoded.PartVersion == 15) + { + if(decoded.DiscSize == DVDSize.Eighty) + sb.AppendLine(Localization.Disc_is_a_Nintendo_Gamecube_Optical_Disc_GOD); + else if(decoded.DiscSize == DVDSize.OneTwenty) + sb.AppendLine(Localization.Disc_is_a_Nintendo_Wii_Optical_Disc_WOD); + else + goto default; + } + else + goto default; + + break; + case DiskCategory.HDDVDROM: + sb.AppendFormat(Localization.Disc_is_a_0_1_version_2, sizeString, "HD DVD-ROM", decoded.PartVersion). + AppendLine(); + + break; + case DiskCategory.HDDVDRAM: + sb.AppendFormat(Localization.Disc_is_a_0_1_version_2, sizeString, "HD DVD-RAM", decoded.PartVersion). + AppendLine(); + + break; + case DiskCategory.HDDVDR: + sb.AppendFormat(Localization.Disc_is_a_0_1_version_2, sizeString, "HD DVD-R", decoded.PartVersion). + AppendLine(); + + break; + case DiskCategory.HDDVDRW: + sb.AppendFormat(Localization.Disc_is_a_0_1_version_2, sizeString, "HD DVD-RW", decoded.PartVersion). + AppendLine(); + + break; + default: + sb.AppendFormat(Localization.Disc_is_a_0_1_version_2, sizeString, Localization.unknown_disc_type, + decoded.PartVersion). + AppendLine(); + + break; + } + + if(decoded.RecordedBookType != decoded.DiskCategory) + { + switch(decoded.RecordedBookType) + { + case DiskCategory.DVDROM: + sb.AppendFormat(Localization.Disc_book_type_is_0, "DVD-ROM").AppendLine(); + + break; + case DiskCategory.DVDRAM: + sb.AppendFormat(Localization.Disc_book_type_is_0, "DVD-RAM").AppendLine(); + + break; + case DiskCategory.DVDR: + if(decoded.PartVersion >= 6) + sb.AppendFormat(Localization.Disc_book_type_is_0, "DVD-R DL").AppendLine(); + else + sb.AppendFormat(Localization.Disc_book_type_is_0, "DVD-R").AppendLine(); + + break; + case DiskCategory.DVDRW: + if(decoded.PartVersion >= 15) + sb.AppendFormat(Localization.Disc_book_type_is_0, "DVD-RW DL").AppendLine(); + else + sb.AppendFormat(Localization.Disc_book_type_is_0, "DVD-RW").AppendLine(); + + break; + case DiskCategory.UMD: + sb.AppendFormat(Localization.Disc_book_type_is_0, "UMD").AppendLine(); + + break; + case DiskCategory.DVDPRW: + sb.AppendFormat(Localization.Disc_book_type_is_0, "DVD+RW").AppendLine(); + + break; + case DiskCategory.DVDPR: + sb.AppendFormat(Localization.Disc_book_type_is_0, "DVD+R").AppendLine(); + + break; + case DiskCategory.DVDPRWDL: + sb.AppendFormat(Localization.Disc_book_type_is_0, "DVD+RW DL").AppendLine(); + + break; + case DiskCategory.DVDPRDL: + sb.AppendFormat(Localization.Disc_book_type_is_0, "DVD+R DL").AppendLine(); + + break; + case DiskCategory.HDDVDROM: + sb.AppendFormat(Localization.Disc_book_type_is_0, "HD DVD-ROM").AppendLine(); + + break; + case DiskCategory.HDDVDRAM: + sb.AppendFormat(Localization.Disc_book_type_is_0, "HD DVD-RAM").AppendLine(); + + break; + case DiskCategory.HDDVDR: + sb.AppendFormat(Localization.Disc_book_type_is_0, "HD DVD-R").AppendLine(); + + break; + case DiskCategory.HDDVDRW: + sb.AppendFormat(Localization.Disc_book_type_is_0, "HD DVD-RW").AppendLine(); + + break; + default: + sb.AppendFormat(Localization.Disc_book_type_is_0, Localization.unit_unknown).AppendLine(); + + break; + } + } + + switch(decoded.MaximumRate) + { + case MaximumRateField.TwoMbps: + sb.AppendLine(Localization.Disc_maximum_transfer_rate_is_2_52_Mbit_sec); + + break; + case MaximumRateField.FiveMbps: + sb.AppendLine(Localization.Disc_maximum_transfer_rate_is_5_04_Mbit_sec); + + break; + case MaximumRateField.TenMbps: + sb.AppendLine(Localization.Disc_maximum_transfer_rate_is_10_08_Mbit_sec); + + break; + case MaximumRateField.TwentyMbps: + sb.AppendLine(Localization.Disc_maximum_transfer_rate_is_20_16_Mbit_sec); + + break; + case MaximumRateField.ThirtyMbps: + sb.AppendLine(Localization.Disc_maximum_transfer_rate_is_30_24_Mbit_sec); + + break; + case MaximumRateField.Unspecified: + sb.AppendLine(Localization.Disc_maximum_transfer_rate_is_unspecified); + + break; + default: + sb.AppendFormat(Localization.Disc_maximum_transfer_rate_is_specified_by_unknown_key_0, + decoded.MaximumRate). + AppendLine(); + + break; + } + + sb.AppendFormat(Localization.Disc_has_0_layers, decoded.Layers + 1).AppendLine(); + + switch(decoded.TrackPath) + { + case true when decoded.Layers == 1: + sb.AppendLine(Localization.Layers_are_in_parallel_track_path); + + break; + case false when decoded.Layers == 1: + sb.AppendLine(Localization.Layers_are_in_opposite_track_path); + + break; + } + + switch(decoded.LinearDensity) + { + case LinearDensityField.TwoSix: + sb.AppendLine(Localization.Pitch_size_is_0_267_μm_bit); + + break; + case LinearDensityField.TwoNine: + sb.AppendLine(Localization.Pitch_size_is_0_147_μm_bit); + + break; + case LinearDensityField.FourZero: + sb.AppendLine(Localization.Pitch_size_is_between_0_409_μm_bit_and_0_435_μm_bit); + + break; + case LinearDensityField.TwoEight: + sb.AppendLine(Localization.Pitch_size_is_between_0_140_μm_bit_and_0_148_μm_bit); + + break; + case LinearDensityField.OneFive: + sb.AppendLine(Localization.Pitch_size_is_0_153_μm_bit); + + break; + case LinearDensityField.OneThree: + sb.AppendLine(Localization.Pitch_size_is_between_0_130_μm_bit_and_0_140_μm_bit); + + break; + case LinearDensityField.ThreeFive: + sb.AppendLine(Localization.Pitch_size_is_0_353_μm_bit); + + break; + default: + sb.AppendFormat(Localization.Unknown_pitch_size_key_0, decoded.LinearDensity).AppendLine(); + + break; + } + + switch(decoded.TrackDensity) + { + case TrackDensityField.Seven: + sb.AppendLine(Localization.Track_size_is_0_74_μm); + + break; + case TrackDensityField.Eight: + sb.AppendLine(Localization.Track_size_is_0_80_μm); + + break; + case TrackDensityField.Six: + sb.AppendLine(Localization.Track_size_is_0_615_μm); + + break; + case TrackDensityField.Four: + sb.AppendLine(Localization.Track_size_is_0_40_μm); + + break; + case TrackDensityField.Three: + sb.AppendLine(Localization.Track_size_is_0_34_μm); + + break; + default: + sb.AppendFormat(Localization.Unknown_track_size_key__0_, decoded.LinearDensity).AppendLine(); + + break; + } + + if(decoded.DataAreaStartPSN > 0) + { + if(decoded.DataAreaEndPSN > 0) + { + sb.AppendFormat(Localization.Data_area_starts_at_PSN_0, decoded.DataAreaStartPSN).AppendLine(); + sb.AppendFormat(Localization.Data_area_ends_at_PSN_0, decoded.DataAreaEndPSN).AppendLine(); + + if(decoded is { Layers: 1, TrackPath: false }) + sb.AppendFormat(Localization.Layer_zero_ends_at_PSN_0, decoded.Layer0EndPSN).AppendLine(); + } + else + sb.AppendLine(Localization.Disc_is_empty); + } + else + sb.AppendLine(Localization.Disc_is_empty); + + if(decoded.BCA) + sb.AppendLine(Localization.Disc_has_a_BCA); + + switch(decoded.DiskCategory) + { + case DiskCategory.UMD: + sb.AppendFormat(Localization.Media_attribute_is_0, decoded.MediaAttribute).AppendLine(); + + break; + case DiskCategory.DVDRAM: + switch(decoded.DiscType) + { + case DVDRAMDiscType.Cased: + sb.AppendLine(Localization.Disc_shall_be_recorded_with_a_case); + + break; + case DVDRAMDiscType.Uncased: + sb.AppendLine(Localization.Disc_can_be_recorded_with_or_without_a_case); + + break; + default: + sb.AppendFormat(Localization.Unknown_DVD_RAM_case_type_key_0, decoded.DiscType).AppendLine(); + + break; + } + + if(decoded.PartVersion == 6) + { + sb.AppendFormat(Localization.Disc_manufacturer_is_0, + ManufacturerFromDVDRAM(decoded.DiskManufacturer)). + AppendLine(); + + sb.AppendFormat(Localization.Disc_manufacturer_supplementary_information_is_0, + decoded.DiskManufacturerSupplementary). + AppendLine(); + } + + break; + case DiskCategory.DVDR when decoded.PartVersion < 6: + case DiskCategory.DVDRW when decoded.PartVersion < 15: + sb.AppendFormat(Localization.Current_Border_Out_first_sector_is_PSN_0, decoded.CurrentBorderOutSector). + AppendLine(); + + sb.AppendFormat(Localization.Next_Border_In_first_sector_is_PSN_0, decoded.NextBorderInSector). + AppendLine(); + + break; + case DiskCategory.DVDPR: + case DiskCategory.DVDPRW: + case DiskCategory.DVDPRDL: + case DiskCategory.DVDPRWDL: + if(decoded.VCPS) + sb.AppendLine(Localization.Disc_contains_extended_information_for_VCPS); + + sb.AppendFormat(Localization.Disc_application_code_0, decoded.ApplicationCode).AppendLine(); + + sb.AppendFormat(Localization.Disc_manufacturer_is_0, + ManufacturerFromDVDPlusID(decoded.DiskManufacturerID)). + AppendLine(); + + sb.AppendFormat(Localization.Disc_media_type_is_0, decoded.MediaTypeID).AppendLine(); + sb.AppendFormat(Localization.Disc_product_revision_is_0, decoded.ProductRevision).AppendLine(); + + break; + } + + if((decoded.DiskCategory != DiskCategory.DVDR || decoded.PartVersion < 6) && + (decoded.DiskCategory != DiskCategory.DVDRW || decoded.PartVersion < 15)) + return sb.ToString(); + + sb.AppendFormat(Localization.Current_RMD_in_extra_Border_zone_starts_at_PSN_0, + decoded.CurrentRMDExtraBorderPSN). + AppendLine(); + + sb.AppendFormat(Localization.PFI_in_extra_Border_zone_starts_at_PSN_0, decoded.PFIExtraBorderPSN).AppendLine(); + + if(!decoded.PreRecordedControlDataInv) + sb.AppendLine(Localization.Control_Data_Zone_is_pre_recorded); + + if(decoded.PreRecordedLeadIn) + sb.AppendLine(Localization.Lead_In_is_pre_recorded); + + if(decoded.PreRecordedLeadOut) + sb.AppendLine(Localization.Lead_Out_is_pre_recorded); + + return sb.ToString(); + } + + public static string Prettify(byte[] response, MediaType mediaType) => Prettify(Decode(response, mediaType)); + + public static string ManufacturerFromDVDRAM(string manufacturerId) => manufacturerId switch + { + _ => + ManufacturerFromDVDPlusID(manufacturerId) + }; + + [SuppressMessage("ReSharper", "StringLiteralTypo")] + public static string ManufacturerFromDVDPlusID(string manufacturerId) + { + var manufacturer = ""; + + switch(manufacturerId) + { + case "CMC MAG": + manufacturer = "CMC Magnetics Corporation"; + + break; + case "INFOME": + manufacturer = "InfoMedia Inc."; + + break; + case "RITEK": + manufacturer = "Ritek Co."; + + break; + case "RICOHJPN": + manufacturer = "Ricoh Company, Ltd."; + + break; + case "ISSM": + manufacturer = "Info Source Digital Media (Zhongshan) Co., Ltd."; + + break; + case "LD": + manufacturer = "Lead Data Inc."; + + break; + case "MAXELL": + manufacturer = "Hitachi Maxell, Ltd."; + + break; + case "MCC": + manufacturer = "Mitsubishi Kagaku Media Co., LTD."; + + break; + case "PRODISC": + manufacturer = "Prodisc Technology Inc."; + + break; + case "Philips": + case "PHILIPS": + + manufacturer = "Philips Components"; + + break; + case "YUDEN000": + manufacturer = "Taiyo Yuden Company Ltd."; + + break; + case "AML": + manufacturer = "Avic Umedisc HK Ltd."; + + break; + case "DAXON": + manufacturer = "Daxon Technology Inc."; + + break; + case "FTI": + manufacturer = "Falcon Technologies International L.L.C."; + + break; + case "GSC503": + manufacturer = "Gigastore Corporation"; + + break; + case "MBIPG101": + manufacturer = "Moser Baer India Ltd."; + + break; + case "OPTODISC": + manufacturer = "OptoDisc Ltd."; + + break; + case "SONY": + manufacturer = "Sony Corporation"; + + break; + case "TDK": + manufacturer = "TDK Corporation"; + + break; + case "SENTINEL": + manufacturer = "Sentinel B.V."; + + break; + case "BeAll000": + manufacturer = "BeALL Developers, Inc."; + + break; + case "MPOMEDIA": + manufacturer = "MPO Disque Compact"; + + break; + case "IMC JPN": + manufacturer = "Intermedia Co., Ltd."; + + break; + case "INFODISC": + manufacturer = "InfoDisc Technology Co., Ltd."; + + break; + case "WFKA11": + manufacturer = "Wealth Fair Investment Inc."; + + break; + case "MAM": + manufacturer = "Manufacturing Advanced Media Europe"; + + break; + case "VDSPMSAB": + manufacturer = "Interaxia Digital Storage Materials AG"; + + break; + case "KIC00000": + manufacturer = "Advanced Media Corporation"; + + break; + case "MJC": + manufacturer = "Megan Media Holdings Berhad"; + + break; + case "MUST": + manufacturer = "Must Technology Co., Ltd."; + + break; + case "IS02": + manufacturer = "Infosmart Technology Ltd."; + + break; + case "DDDessau": + manufacturer = "Digital Disc Dessau GmbH"; + + break; + case "SKYMEDIA": + manufacturer = "Sky Media Manufacturing S.A."; + + break; + case "MICRON": + manufacturer = "Eastgate Technology Ltd."; + + break; + case "VIVA": + manufacturer = "Viva Optical Disc Manufacturing Ltd."; + + break; + case "EMDPZ3": + manufacturer = "E-TOP Mediatek Inc."; + + break; + case "LGEP16": + manufacturer = "LG Electronics Inc."; + + break; + case "POS": + manufacturer = "POSTECH Corporation"; + + break; + case "Dvsn+160": + manufacturer = "Digital Storage Technology Co., Ltd."; + + break; + case "ODMS": + manufacturer = "VDL Optical Disc Manufacturing Systems"; + + break; + } + + return manufacturer != "" ? $"{manufacturer} (\"{manufacturerId}\")" : $"\"{manufacturerId}\""; + } + +#region Nested type: PhysicalFormatInformation + + public struct PhysicalFormatInformation + { + /// Bytes 0 to 1 Data length + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + + #region PFI common to all + + /// Byte 4, bits 7 to 4 Disk category field + public DiskCategory DiskCategory; + /// Byte 4, bits 3 to 0 Media version + public byte PartVersion; + /// Byte 5, bits 7 to 4 120mm if 0, 80mm if 1. If UMD (60mm) 0 also. Reserved rest of values + public DVDSize DiscSize; + /// Byte 5, bits 3 to 0 Maximum data rate + public MaximumRateField MaximumRate; + /// Byte 6, bit 7 Reserved + public bool Reserved3; + /// Byte 6, bits 6 to 5 Number of layers + public byte Layers; + /// Byte 6, bit 4 Track path + public bool TrackPath; + /// Byte 6, bits 3 to 0 Layer type + public LayerTypeFieldMask LayerType; + /// Byte 7, bits 7 to 4 Linear density field + public LinearDensityField LinearDensity; + /// Byte 7, bits 3 to 0 Track density field + public TrackDensityField TrackDensity; + /// Bytes 8 to 11 PSN where Data Area starts + public uint DataAreaStartPSN; + /// Bytes 12 to 15 PSN where Data Area ends + public uint DataAreaEndPSN; + /// Bytes 16 to 19 PSN where Data Area ends in Layer 0 + public uint Layer0EndPSN; + /// + /// Byte 20, bit 7 True if BCA exists. GC/Wii discs do not have this bit set, but there is a BCA, making it + /// unreadable in normal DVD drives + /// + public bool BCA; + /// Byte 20, bits 6 to 0 Reserved + public byte Reserved4; + + #endregion PFI common to all + + #region UMD PFI + + /// Bytes 21 to 22 UMD only, media attribute, application-defined, part of media specific in rest of discs + public ushort MediaAttribute; + + #endregion UMD PFI + + #region DVD-RAM PFI + + /// Byte 36 Disc type, respecting case recordability + public DVDRAMDiscType DiscType; + + #endregion DVD-RAM PFI + + #region DVD-RAM PFI, Version 0001b + + /// Byte 52 Byte 504 in Version 0110b Linear velocity, in tenths of m/s + public byte Velocity; + /// Byte 53 Byte 505 in Version 0110b Read power on disk surface, tenths of mW + public byte ReadPower; + /// Byte 54 Byte 507 in Version 0110b Peak power on disk surface for recording land tracks + public byte PeakPower; + /// Byte 55 Bias power on disk surface for recording land tracks + public byte BiasPower; + /// Byte 56 First pulse starting time for recording on land tracks, ns + public byte FirstPulseStart; + /// Byte 57 Byte 515 in Version 0110b First pulse ending time for recording on land tracks + public byte FirstPulseEnd; + /// Byte 58 Byte 518 in Version 0110b Multiple-pulse duration time for recording on land tracks + public byte MultiplePulseDuration; + /// Byte 59 Byte 519 in Version 0110b Last pulse starting time for recording on land tracks + public byte LastPulseStart; + /// Byte 60 Las pulse ending time for recording on land tracks + public byte LastPulseEnd; + /// Byte 61 Bias power duration for recording on land tracks + public byte BiasPowerDuration; + /// Byte 62 Byte 511 on Version 0110b Peak power for recording on groove tracks + public byte PeakPowerGroove; + /// Byte 63 Bias power for recording on groove tracks + public byte BiasPowerGroove; + /// Byte 64 First pulse starting time on groove tracks + public byte FirstPulseStartGroove; + /// Byte 65 First pulse ending time on groove tracks + public byte FirstPulseEndGroove; + /// Byte 66 Multiple-pulse duration time on groove tracks + public byte MultiplePulseDurationGroove; + /// Byte 67 Last pulse starting time on groove tracks + public byte LastPulseStartGroove; + /// Byte 68 Last pulse ending time on groove tracks + public byte LastPulseEndGroove; + /// Byte 69 Bias power duration for recording on groove tracks + public byte BiasPowerDurationGroove; + + #endregion DVD-RAM PFI, Version 0001b + + #region DVD-R PFI, DVD-RW PFI + + /// Bytes 36 to 39 Sector number of the first sector of the current Border Out + public uint CurrentBorderOutSector; + /// Bytes 40 to 43 Sector number of the first sector of the next Border In + public uint NextBorderInSector; + + #endregion DVD-R PFI, DVD-RW PFI + + #region DVD+RW PFI + + /// Byte 36 Linear velocities 0 = CLV from 4,90 m/s to 6,25 m/s 1 = CAV from 3,02 m/s to 7,35 m/s + public byte RecordingVelocity; + /// Byte 37 Maximum read power in milliwatts at maximum velocity mW = 20 * (value - 1) + public byte ReadPowerMaxVelocity; + /// Byte 38 Indicative value of Ptarget in mW at maximum velocity + public byte PIndMaxVelocity; + /// Byte 39 Peak power multiplication factor at maximum velocity + public byte PMaxVelocity; + /// Byte 40 Bias1/write power ration at maximum velocity + public byte E1MaxVelocity; + /// Byte 41 Bias2/write power ration at maximum velocity + public byte E2MaxVelocity; + /// Byte 42 Target value for γ, γtarget at the maximum velocity + public byte YTargetMaxVelocity; + /// Byte 43 Maximum read power in milliwatts at reference velocity (4,90 m/s) mW = 20 * (value - 1) + public byte ReadPowerRefVelocity; + /// Byte 44 Indicative value of Ptarget in mW at reference velocity (4,90 m/s) + public byte PIndRefVelocity; + /// Byte 45 Peak power multiplication factor at reference velocity (4,90 m/s) + public byte PRefVelocity; + /// Byte 46 Bias1/write power ration at reference velocity (4,90 m/s) + public byte E1RefVelocity; + /// Byte 47 Bias2/write power ration at reference velocity (4,90 m/s) + public byte E2RefVelocity; + /// Byte 48 Target value for γ, γtarget at the reference velocity (4,90 m/s) + public byte YTargetRefVelocity; + /// Byte 49 Maximum read power in milliwatts at minimum velocity mW = 20 * (value - 1) + public byte ReadPowerMinVelocity; + /// Byte 50 Indicative value of Ptarget in mW at minimum velocity + public byte PIndMinVelocity; + /// Byte 51 Peak power multiplication factor at minimum velocity + public byte PMinVelocity; + /// Byte 52 Bias1/write power ration at minimum velocity + public byte E1MinVelocity; + /// Byte 53 Bias2/write power ration at minimum velocity + public byte E2MinVelocity; + /// Byte 54 Target value for γ, γtarget at the minimum velocity + public byte YTargetMinVelocity; + + #endregion DVD+RW PFI + + #region DVD-RAM PFI, version 0110b + + /// Byte 506, bit 7 Mode of adaptative write pulse control + public bool AdaptativeWritePulseControlFlag; + /// Byte 508 Bias power 1 on disk surface for recording land tracks + public byte BiasPower1; + /// Byte 509 Bias power 2 on disk surface for recording land tracks + public byte BiasPower2; + /// Byte 510 Bias power 3 on disk surface for recording land tracks + public byte BiasPower3; + /// Byte 512 Bias power 1 on disk surface for recording groove tracks + public byte BiasPower1Groove; + /// Byte 513 Bias power 2 on disk surface for recording groove tracks + public byte BiasPower2Groove; + /// Byte 514 Bias power 3 on disk surface for recording groove tracks + public byte BiasPower3Groove; + /// Byte 516 First pulse duration + public byte FirstPulseDuration; + /// Byte 520 Bias power 2 duration on land tracks at Velocity 1 + public byte BiasPower2Duration; + /// Byte 521 First pulse start time, at Mark 3T and Leading Space 3T + public byte FirstPulseStart3TSpace3T; + /// Byte 522 First pulse start time, at Mark 4T and Leading Space 3T + public byte FirstPulseStart4TSpace3T; + /// Byte 523 First pulse start time, at Mark 5T and Leading Space 3T + public byte FirstPulseStart5TSpace3T; + /// Byte 524 First pulse start time, at Mark >5T and Leading Space 3T + public byte FirstPulseStartSpace3T; + /// Byte 525 First pulse start time, at Mark 3T and Leading Space 4T + public byte FirstPulseStart3TSpace4T; + /// Byte 526 First pulse start time, at Mark 4T and Leading Space 4T + public byte FirstPulseStart4TSpace4T; + /// Byte 527 First pulse start time, at Mark 5T and Leading Space 4T + public byte FirstPulseStart5TSpace4T; + /// Byte 528 First pulse start time, at Mark >5T and Leading Space 4T + public byte FirstPulseStartSpace4T; + /// Byte 529 First pulse start time, at Mark 3T and Leading Space 5T + public byte FirstPulseStart3TSpace5T; + /// Byte 530 First pulse start time, at Mark 4T and Leading Space 5T + public byte FirstPulseStart4TSpace5T; + /// Byte 531 First pulse start time, at Mark 5T and Leading Space 5T + public byte FirstPulseStart5TSpace5T; + /// Byte 532 First pulse start time, at Mark >5T and Leading Space 5T + public byte FirstPulseStartSpace5T; + /// Byte 533 First pulse start time, at Mark 3T and Leading Space >5T + public byte FirstPulseStart3TSpace; + /// Byte 534 First pulse start time, at Mark 4T and Leading Space >5T + public byte FirstPulseStart4TSpace; + /// Byte 535 First pulse start time, at Mark 5T and Leading Space >5T + public byte FirstPulseStart5TSpace; + /// Byte 536 First pulse start time, at Mark >5T and Leading Space >5T + public byte FirstPulseStartSpace; + /// Byte 537 First pulse start time, at Mark 3T and Trailing Space 3T + public byte FirstPulse3TStartTSpace3T; + /// Byte 538 First pulse start time, at Mark 4T and Trailing Space 3T + public byte FirstPulse4TStartTSpace3T; + /// Byte 539 First pulse start time, at Mark 5T and Trailing Space 3T + public byte FirstPulse5TStartTSpace3T; + /// Byte 540 First pulse start time, at Mark >5T and Trailing Space 3T + public byte FirstPulseStartTSpace3T; + /// Byte 541 First pulse start time, at Mark 3T and Trailing Space 4T + public byte FirstPulse3TStartTSpace4T; + /// Byte 542 First pulse start time, at Mark 4T and Trailing Space 4T + public byte FirstPulse4TStartTSpace4T; + /// Byte 543 First pulse start time, at Mark 5T and Trailing Space 4T + public byte FirstPulse5TStartTSpace4T; + /// Byte 544 First pulse start time, at Mark >5T and Trailing Space 4T + public byte FirstPulseStartTSpace4T; + /// Byte 545 First pulse start time, at Mark 3T and Trailing Space 5T + public byte FirstPulse3TStartTSpace5T; + /// Byte 546 First pulse start time, at Mark 4T and Trailing Space 5T + public byte FirstPulse4TStartTSpace5T; + /// Byte 547 First pulse start time, at Mark 5T and Trailing Space 5T + public byte FirstPulse5TStartTSpace5T; + /// Byte 548 First pulse start time, at Mark >5T and Trailing Space 5T + public byte FirstPulseStartTSpace5T; + /// Byte 549 First pulse start time, at Mark 3T and Trailing Space >5T + public byte FirstPulse3TStartTSpace; + /// Byte 550 First pulse start time, at Mark 4T and Trailing Space >5T + public byte FirstPulse4TStartTSpace; + /// Byte 551 First pulse start time, at Mark 5T and Trailing Space >5T + public byte FirstPulse5TStartTSpace; + /// Byte 552 First pulse start time, at Mark >5T and Trailing Space >5T + public byte FirstPulseStartTSpace; + /// Bytes 553 to 600 Disk manufacturer's name, space-padded + public string DiskManufacturer; + /// Bytes 601 to 616 Disk manufacturer's supplementary information + public string DiskManufacturerSupplementary; + /// Bytes 617 to 627 Write power control parameters + public byte[] WritePowerControlParams; + /// Byte 619 Ratio of peak power for land tracks to threshold peak power for land tracks + public byte PowerRatioLandThreshold; + /// Byte 620 Target asymmetry + public byte TargetAsymmetry; + /// Byte 621 Temporary peak power + public byte TemporaryPeakPower; + /// Byte 622 Temporary bias power 1 + public byte TemporaryBiasPower1; + /// Byte 623 Temporary bias power 2 + public byte TemporaryBiasPower2; + /// Byte 624 Temporary bias power 3 + public byte TemporaryBiasPower3; + /// Byte 625 Ratio of peak power for groove tracks to threshold peak power for groove tracks + public byte PowerRatioGrooveThreshold; + /// Byte 626 Ratio of peak power for land tracks to threshold 6T peak power for land tracks + public byte PowerRatioLandThreshold6T; + /// Byte 627 Ratio of peak power for groove tracks to threshold 6T peak power for groove tracks + public byte PowerRatioGrooveThreshold6T; + + #endregion DVD-RAM PFI, version 0110b + + #region DVD+RW PFI, DVD+R PFI, DVD+R DL PFI and DVD+RW DL PFI + + /// Byte 20, bit 6 If set indicates data zone contains extended information for VCPS + public bool VCPS; + /// Byte 21 Indicates restricted usage disk + public byte ApplicationCode; + /// Byte 22 Bitmap of extended information block presence + public byte ExtendedInformation; + /// Bytes 23 to 30 Disk manufacturer ID, null-padded + public string DiskManufacturerID; + /// Bytes 31 to 33 Media type ID, null-padded + public string MediaTypeID; + /// Byte 34 Product revision number + public byte ProductRevision; + /// Byte 35 Indicates how many bytes, up to 63, are used in ADIP's PFI + public byte PFIUsedInADIP; + + #endregion DVD+RW PFI, DVD+R PFI, DVD+R DL PFI and DVD+RW DL PFI + + #region DVD+RW PFI, version 0010b + + /// Byte 55 Ttop first pulse duration + public byte TopFirstPulseDuration; + /// Byte 56 Tmp multi pulse duration + public byte MultiPulseDuration; + /// Byte 57 dTtop first pulse lead time + public byte FirstPulseLeadTime; + /// Byte 58 dTera erase lead time at reference velocity + public byte EraseLeadTimeRefVelocity; + /// Byte 59 dTera erase lead time at upper velocity + public byte EraseLeadTimeUppVelocity; + + #endregion DVD+RW PFI, version 0010b + + #region DVD+R PFI version 0001b and DVD+R DL PFI version 0001b + + /// Byte 36 Primary recording velocity for the basic write strategy + public byte PrimaryVelocity; + /// Byte 37 Upper recording velocity for the basic write strategy + public byte UpperVelocity; + /// Byte 38 Wavelength λIND + public byte Wavelength; + /// Byte 39 Normalized write power dependency on wavelength (dP/dλ)/(PIND/λIND) + public byte NormalizedPowerDependency; + /// Byte 40 Maximum read power at primary velocity + public byte MaximumPowerAtPrimaryVelocity; + /// Byte 41 Pind at primary velocity + public byte PindAtPrimaryVelocity; + /// Byte 42 βtarget at primary velocity + public byte BtargetAtPrimaryVelocity; + /// Byte 43 Maximum read power at upper velocity + public byte MaximumPowerAtUpperVelocity; + /// Byte 44 Pind at primary velocity + public byte PindAtUpperVelocity; + /// Byte 45 βtarget at upper velocity + public byte BtargetAtUpperVelocity; + /// Byte 46 Ttop (≥4T) first pulse duration for cm∗ ≥4T at Primary velocity + public byte FirstPulseDuration4TPrimaryVelocity; + /// Byte 47 Ttop (=3T) first pulse duration for cm∗ =3T at Primary velocity + public byte FirstPulseDuration3TPrimaryVelocity; + /// Byte 48 Tmp multi pulse duration at Primary velocity + public byte MultiPulseDurationPrimaryVelocity; + /// Byte 49 Tlp last pulse duration at Primary velocity + public byte LastPulseDurationPrimaryVelocity; + /// Byte 50 dTtop (≥4T) first pulse lead time for cm∗ ≥4T at Primary velocity + public byte FirstPulseLeadTime4TPrimaryVelocity; + /// Byte 51 dTtop (=3T) first pulse lead time for cm∗ =3T at Primary velocity + public byte FirstPulseLeadTime3TPrimaryVelocity; + /// Byte 52 dTle first pulse leading edge shift for ps∗ =3T at Primary velocity + public byte FirstPulseLeadingEdgePrimaryVelocity; + /// Byte 53 Ttop (≥4T) first pulse duration for cm∗ ≥4T at Upper velocity + public byte FirstPulseDuration4TUpperVelocity; + /// Byte 54 Ttop (=3T) first pulse duration for cm∗ =3T at Upper velocity + public byte FirstPulseDuration3TUpperVelocity; + /// Byte 55 Tmp multi pulse duration at Upper velocity + public byte MultiPulseDurationUpperVelocity; + /// Byte 56 Tlp last pulse duration at Upper velocity + public byte LastPulseDurationUpperVelocity; + /// Byte 57 dTtop (≥4T) first pulse lead time for cm∗ ≥4T at Upper velocity + public byte FirstPulseLeadTime4TUpperVelocity; + /// Byte 58 dTtop (=3T) first pulse lead time for cm∗ =3T at Upper velocity + public byte FirstPulseLeadTime3TUpperVelocity; + /// Byte 59 dTle first pulse leading edge shift for ps∗ =3T at Upper velocity + public byte FirstPulseLeadingEdgeUpperVelocity; + + #endregion DVD+R PFI version 0001b and DVD+R DL PFI version 0001b + + #region DVD+R DL PFI version 0001b + + /// Byte 34, bits 7 to 6 + public DVDLayerStructure LayerStructure; + + #endregion DVD+R DL PFI version 0001b + + #region DVD+RW DL PFI + + /// Byte 36 Primary recording velocity for the basic write strategy + public byte BasicPrimaryVelocity; + /// Byte 37 Maximum read power at Primary velocity + public byte MaxReadPowerPrimaryVelocity; + /// Byte 38 PIND at Primary velocity + public byte PindPrimaryVelocity; + /// Byte 39 ρ at Primary velocity + public byte PPrimaryVelocity; + /// Byte 40 ε1 at Primary velocity + public byte E1PrimaryVelocity; + /// Byte 41 ε2 at Primary velocity + public byte E2PrimaryVelocity; + /// Byte 42 γtarget at Primary velocity + public byte YtargetPrimaryVelocity; + /// Byte 43 β optimum at Primary velocity + public byte BOptimumPrimaryVelocity; + /// Byte 46 Ttop first pulse duration + public byte TFirstPulseDuration; + /// Byte 47 Tmp multi pulse duration + public byte TMultiPulseDuration; + /// Byte 48 dTtop first pulse lead/lag time for any runlength ≥ 4T + public byte FirstPulseLeadTimeAnyRun; + /// Byte 49 dTtop,3 first pulse lead/lag time for runlengths = 3T + public byte FirstPulseLeadTimeRun3T; + /// Byte 50 dTlp last pulse lead/lag time for any runlength ≥ 5T + public byte LastPulseLeadTimeAnyRun; + /// Byte 51 dTlp,3 last pulse lead/lag time for runlengths = 3T + public byte LastPulseLeadTime3T; + /// Byte 52 dTlp,4 last pulse lead/lag time for runlengths = 4T + public byte LastPulseLeadTime4T; + /// Byte 53 dTera erase lead/lag time when preceding mark length ≥ 5T + public byte ErasePulseLeadTimeAny; + /// Byte 54 dTera,3 erase lead/lag time when preceding mark length = 3T + public byte ErasePulseLeadTime3T; + /// Byte 55 dTera,4 erase lead/lag time when preceding mark length = 4T + public byte ErasePulseLeadTime4T; + + #endregion DVD+RW DL PFI + + #region DVD-R DL PFI and DVD-RW DL PFI + + /// Byte 21 Maximum recording speed + public DVDRecordingSpeed MaxRecordingSpeed; + /// Byte 22 Minimum recording speed + public DVDRecordingSpeed MinRecordingSpeed; + /// Byte 23 Another recording speed + public DVDRecordingSpeed RecordingSpeed1; + /// Byte 24 Another recording speed + public DVDRecordingSpeed RecordingSpeed2; + /// Byte 25 Another recording speed + public DVDRecordingSpeed RecordingSpeed3; + /// Byte 26 Another recording speed + public DVDRecordingSpeed RecordingSpeed4; + /// Byte 27 Another recording speed + public DVDRecordingSpeed RecordingSpeed5; + /// Byte 28 Another recording speed + public DVDRecordingSpeed RecordingSpeed6; + /// Byte 29 Another recording speed + public DVDRecordingSpeed RecordingSpeed7; + /// Byte 30 Class + public byte Class; + /// Byte 31 Extended version. 0x30 = ECMA-382, 0x20 = ECMA-384 + public byte ExtendedVersion; + /// Byte 36 Start sector number of current RMD in Extra Border Zone + public uint CurrentRMDExtraBorderPSN; + /// Byte 40 Start sector number of Physical Format Information blocks in Extra Border Zone + public uint PFIExtraBorderPSN; + /// Byte 44, bit 0 If NOT set, Control Data Zone is pre-recorded + public bool PreRecordedControlDataInv; + /// Byte 44 bit 1 Lead-in Zone is pre-recorded + public bool PreRecordedLeadIn; + /// Byte 44 bit 3 Lead-out Zone is pre-recorded + public bool PreRecordedLeadOut; + /// Byte 45 bits 0 to 3 AR characteristic of LPP on Layer 1 + public byte ARCharLayer1; + /// Byte 45 bits 4 to 7 Tracking polarity on Layer 1 + public byte TrackPolarityLayer1; + + #endregion DVD-R DL PFI and DVD-RW DL PFI + + public DiskCategory RecordedBookType; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/DVD/PRI.cs b/Aaru.Decoders/DVD/PRI.cs new file mode 100644 index 000000000..8285d1caa --- /dev/null +++ b/Aaru.Decoders/DVD/PRI.cs @@ -0,0 +1,457 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : PRI.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes DVD pre-recorded information. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Text; +using Aaru.Helpers; + +namespace Aaru.Decoders.DVD; + +// Information from the following standards: +// ANSI X3.304-1997 +// T10/1048-D revision 9.0 +// T10/1048-D revision 10a +// T10/1228-D revision 7.0c +// T10/1228-D revision 11a +// T10/1363-D revision 10g +// T10/1545-D revision 1d +// T10/1545-D revision 5 +// T10/1545-D revision 5a +// T10/1675-D revision 2c +// T10/1675-D revision 4 +// T10/1836-D revision 2g +// ECMA 365 +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static class PRI +{ + public static PreRecordedInformation? Decode(byte[] response) + { + if(response == null) + return null; + + if(response.Length < 67) + return null; + + var pri = new PreRecordedInformation + { + DataLength = (ushort)((response[0] << 8) + response[1]), + Reserved1 = response[2], + Reserved2 = response[3], + FieldId1 = response[4], + FieldId2 = response[12], + FieldId3 = response[20], + FieldId4 = response[28], + FieldId5 = response[36] + }; + + if(pri.FieldId1 != 1 || pri.FieldId2 != 2 || pri.FieldId3 != 3 || pri.FieldId4 != 4 || pri.FieldId5 != 5) + return null; + + pri.DiscApplicationCode = response[5]; + pri.DiscPhysicalCode = response[6]; + pri.LastAddressOfDataRecordableArea = (uint)((response[7] << 16) + (response[8] << 8) + response[9]); + pri.PartVersion = (byte)(response[10] >> 4); + pri.ExtensionCode = (byte)(response[10] & 0xF); + pri.Reserved3 = response[11]; + pri.OPCSuggestedCode = response[13]; + pri.WaveLengthCode = response[14]; + + pri.WriteStrategyCode = + (uint)((response[15] << 24) + (response[16] << 16) + (response[17] << 8) + response[18]); + + pri.Reserved4 = response[19]; + pri.ManufacturerId1 = new byte[6]; + pri.Reserved5 = response[27]; + pri.ManufacturerId2 = new byte[6]; + pri.Reserved6 = response[35]; + pri.ManufacturerId3 = new byte[6]; + pri.Reserved7 = response[43]; + pri.Reserved8 = new byte[response.Length - 44]; + + Array.Copy(response, 21, pri.ManufacturerId1, 0, 6); + Array.Copy(response, 29, pri.ManufacturerId2, 0, 6); + Array.Copy(response, 37, pri.ManufacturerId3, 0, 6); + Array.Copy(response, 44, pri.Reserved8, 0, pri.Reserved8.Length); + + var tmp = new byte[18]; + + Array.Copy(response, 21, tmp, 0, 6); + Array.Copy(response, 29, tmp, 6, 6); + + // If RW or has part version or has extension code, 3rd manufacturer ID is a write strategy code + if((pri.DiscPhysicalCode & 0x2) > 0 || pri.PartVersion > 0 || pri.ExtensionCode > 0) + { + pri.WriteStrategyCode2 = + (uint)((response[37] << 24) + (response[38] << 16) + (response[39] << 8) + response[40]); + } + else + Array.Copy(response, 37, tmp, 12, 6); + + pri.ManufacturerId = StringHandlers.CToString(tmp, Encoding.ASCII).Trim(); + + return pri; + } + + public static string Prettify(PreRecordedInformation? pri) + { + if(pri == null) + return null; + + PreRecordedInformation decoded = pri.Value; + var sb = new StringBuilder(); + + if((decoded.DiscApplicationCode & 0x40) > 0) + { + sb.AppendLine(Localization.Disc_for_unrestricted_use); + + if((decoded.DiscApplicationCode & 0x3F) > 0) + { + sb.AppendFormat(Localization.Invalid_purpose_field_with_value_0, decoded.DiscApplicationCode & 0x3F). + AppendLine(); + } + else + sb.AppendLine(Localization.Consumer_purpose_disc_for_use_in_consumer_purpose_drives); + } + else + { + sb.AppendLine(Localization.Disc_for_restricted_use); + + if((decoded.DiscApplicationCode & 0x3F) > 0) + { + sb.AppendFormat(Localization.Disc_for_use_in_special_drives_according_with_purpose_value_0, + decoded.DiscApplicationCode & 0x3F). + AppendLine(); + } + else + sb.AppendLine(Localization.General_purpose_disc_for_use_in_general_purpose_drives); + } + + sb.AppendLine((decoded.DiscPhysicalCode & 0x80) > 0 + ? Localization.Disc_track_pitch_is_0_74_μm + : Localization.Unknown_track_pitch); + + sb.AppendLine((decoded.DiscPhysicalCode & 0x40) > 0 + ? Localization.Reference_velocity_is_3_49_m_s + : Localization.Unknown_reference_velocity); + + sb.AppendLine((decoded.DiscPhysicalCode & 0x20) > 0 + ? Localization.Disc_has_80mm_diameter + : Localization.Disc_has_120mm_diameter); + + sb.AppendLine((decoded.DiscPhysicalCode & 0x10) > 0 + ? Localization.Disc_reflectivity_is_between_18_and_30 + : Localization.Disc_reflectivity_is_between_45_and_85); + + sb.AppendLine((decoded.DiscPhysicalCode & 0x04) > 0 + ? Localization.Dye_is_organic + : Localization.Dye_is_phase_change); + + sb.AppendLine((decoded.DiscPhysicalCode & 0x02) > 0 + ? Localization.Disc_is_RW_rewritable + : Localization.Disc_is_R_recordable); + + sb.AppendLine((decoded.DiscPhysicalCode & 0x01) > 0 + ? Localization.Wavelength_is_650nm + : Localization.Unknown_wavelength); + + sb.AppendFormat(Localization.Last_writable_ECC_block_address_0_X6_, decoded.LastAddressOfDataRecordableArea). + AppendLine(); + + if(decoded.PartVersion > 0) + sb.AppendFormat(Localization.Part_version_0, decoded.PartVersion).AppendLine(); + + bool rw = (decoded.DiscPhysicalCode & 0x02) > 0; + + if(rw) + { + if((decoded.OPCSuggestedCode & 0xF) > 0) + { + double recordingPower = (decoded.OPCSuggestedCode & 0xF) switch + { + 1 => 7.0, + 2 => 7.5, + 3 => 8.0, + 4 => 8.5, + 5 => 9.0, + 6 => 9.5, + 7 => 10.0, + 8 => 10.5, + 9 => 11.0, + 10 => 11.5, + 11 => 12.0, + 12 => 12.5, + 13 => 13.0, + 14 => 13.5, + 15 => 14.0, + _ => 0 + }; + + sb.AppendFormat(Localization.Recommended_recording_power_is_0_mW, recordingPower).AppendLine(); + } + else + sb.AppendLine(Localization.Recording_power_is_not_specified); + + if((decoded.WaveLengthCode & 0xF) > 0) + { + double erasingPower = (decoded.WaveLengthCode & 0xF) switch + { + 1 => 0.38, + 2 => 0.40, + 3 => 0.42, + 4 => 0.44, + 5 => 0.46, + 6 => 0.48, + 7 => 0.50, + 8 => 0.52, + 9 => 0.54, + 10 => 0.56, + 11 => 0.58, + 12 => 0.60, + 13 => 0.62, + 14 => 0.64, + 15 => 0.66, + _ => 0 + }; + + sb.AppendFormat(Localization.Recommended_erasing_power_ratio_is_0, erasingPower).AppendLine(); + } + else + sb.AppendLine(Localization.Erasing_power_ratio_is_not_specified); + } + else + { + if((decoded.OPCSuggestedCode & 0xF) > 0) + { + double recordingPower = (decoded.OPCSuggestedCode & 0xF) switch + { + 1 => 6.0, + 2 => 6.5, + 3 => 7.0, + 4 => 7.5, + 5 => 8.0, + 6 => 8.5, + 7 => 9.0, + 8 => 9.5, + 9 => 10.0, + 10 => 10.5, + 11 => 11.0, + 12 => 11.5, + 13 => 12.0, + _ => 0 + }; + + sb.AppendFormat(Localization.Recommended_recording_power_is_0_mW, recordingPower).AppendLine(); + } + + if(decoded.WaveLengthCode > 0) + { + int wavelength = decoded.WaveLengthCode switch + { + 1 => 645, + 2 => 646, + 3 => 647, + 4 => 648, + 5 => 649, + 6 => 650, + 7 => 651, + 8 => 652, + 9 => 653, + 10 => 654, + 11 => 655, + 12 => 656, + 13 => 657, + 14 => 658, + 15 => 659, + 16 => 660, + _ => 0 + }; + + sb.AppendFormat(Localization.Recommended_recording_power_is_0_mW, wavelength).AppendLine(); + } + } + + sb.AppendFormat(Localization.Disc_manufacturer_is_0, ManufacturerFromPrePit(decoded.ManufacturerId)). + AppendLine(); + + return sb.ToString(); + } + + public static string Prettify(byte[] response) => Prettify(Decode(response)); + + [SuppressMessage("ReSharper", "StringLiteralTypo")] + public static string ManufacturerFromPrePit(string manufacturerId) + { + var manufacturer = ""; + + // Bad thing is that it also includes a media code... + if(manufacturerId.StartsWith("RITEK", StringComparison.Ordinal)) + manufacturer = "Ritek Co."; + else if(manufacturerId.StartsWith("CMC", StringComparison.Ordinal)) + manufacturer = "CMC Magnetics Corporation"; + else if(manufacturerId.StartsWith("Dvsn-", StringComparison.Ordinal)) + manufacturer = "Digital Storage Technology Co., Ltd."; + else if(manufacturerId.StartsWith("GSC", StringComparison.Ordinal)) + manufacturer = "Gigastore Corporation"; + else if(manufacturerId.StartsWith("INFOMEDIA", StringComparison.Ordinal)) + manufacturer = "InfoMedia Inc."; + else if(manufacturerId.StartsWith("ISSM", StringComparison.Ordinal)) + manufacturer = "Info Source Digital Media (Zhongshan) Co., Ltd."; + else if(manufacturerId.StartsWith("LEADDATA", StringComparison.Ordinal)) + manufacturer = "Lead Data Inc."; + else if(manufacturerId.StartsWith("MCC", StringComparison.Ordinal) || + manufacturerId.StartsWith("MKM", StringComparison.Ordinal)) + manufacturer = "Mitsubishi Kagaku Media Co., LTD."; + else if(manufacturerId.StartsWith("MUST", StringComparison.Ordinal)) + manufacturer = "Must Technology Co., Ltd."; + else if(manufacturerId.StartsWith("MXL", StringComparison.Ordinal)) + manufacturer = "Hitachi Maxell, Ltd."; + else if(manufacturerId.StartsWith("PRINCO", StringComparison.Ordinal)) + manufacturer = "Princo Corporation"; + else if(manufacturerId.StartsWith("Prodisc", StringComparison.Ordinal)) + manufacturer = "Prodisc Technology Inc."; + else if(manufacturerId.StartsWith("SONY", StringComparison.Ordinal) || + manufacturerId.StartsWith("80SONY", StringComparison.Ordinal)) + manufacturer = "Sony Corporation"; + else if(manufacturerId.StartsWith("TCLDS", StringComparison.Ordinal)) + manufacturer = "TCL Technology"; + else if(manufacturerId.StartsWith("TMI", StringComparison.Ordinal)) + manufacturer = "ThaiMedia Co., Ltd. "; + else if(manufacturerId.StartsWith("TY", StringComparison.Ordinal)) + manufacturer = "Taiyo Yuden Company Ltd."; + else if(manufacturerId.StartsWith("UME", StringComparison.Ordinal)) + manufacturer = "Avic Umedisc HK Ltd."; + else if(manufacturerId.StartsWith("DAXON", StringComparison.Ordinal)) + manufacturer = "Daxon Technology Inc."; + else if(manufacturerId.StartsWith("FTI", StringComparison.Ordinal)) + manufacturer = "Falcon Technologies International L.L.C."; + else if(manufacturerId.StartsWith("FUJIFILM", StringComparison.Ordinal)) + manufacturer = "Fuji Photo Film, Co., Ltd."; + else if(manufacturerId.StartsWith("MBI", StringComparison.Ordinal)) + manufacturer = "Moser Baer India Ltd."; + else if(manufacturerId.StartsWith("TT", StringComparison.Ordinal) || + manufacturerId.StartsWith("TDK", StringComparison.Ordinal)) + manufacturer = "TDK Corporation"; + else if(manufacturerId.StartsWith("JVC", StringComparison.Ordinal)) + manufacturer = "Victor Advanced media Co., Ltd."; + else if(manufacturerId.StartsWith("MEI", StringComparison.Ordinal)) + manufacturer = "Matsushita Electric Industrial Co., Ltd."; + else if(manufacturerId.StartsWith("OPTODISC", StringComparison.Ordinal)) + manufacturer = "OptoDisc Ltd."; + else if(manufacturerId.StartsWith("KIC", StringComparison.Ordinal)) + manufacturer = "Advance Media Corporation"; + else if(manufacturerId.StartsWith("IMC", StringComparison.Ordinal)) + manufacturer = "Intermedia Co., Ltd."; + else if(manufacturerId.StartsWith("LGE", StringComparison.Ordinal)) + manufacturer = "LG Electronics Inc."; + else if(manufacturerId.StartsWith("KDT", StringComparison.Ordinal)) + manufacturer = "King Disc Technology Corporation"; + else if(manufacturerId.StartsWith("POS", StringComparison.Ordinal)) + manufacturer = "POSTECH Corporation"; + else if(manufacturerId.StartsWith("VDSPMSAB", StringComparison.Ordinal)) + manufacturer = "Interaxia Digital Storage Materials AG"; + else if(manufacturerId.StartsWith("VANGUARD", StringComparison.Ordinal)) + manufacturer = "Vanguard Disc Inc."; + else if(manufacturerId.StartsWith("MJC", StringComparison.Ordinal)) + manufacturer = "Megan Media Holdings Berhad"; + else if(manufacturerId.StartsWith("DKM", StringComparison.Ordinal) || + manufacturerId.StartsWith("EDMA", StringComparison.Ordinal)) + manufacturer = "E-TOP Mediatek Inc."; + else if(manufacturerId.StartsWith("BeAll", StringComparison.Ordinal)) + manufacturer = "BeALL Developers, Inc."; + + return manufacturer != "" ? $"{manufacturer} (\"{manufacturerId}\")" : $"\"{manufacturerId}\""; + } + +#region Nested type: PreRecordedInformation + + public struct PreRecordedInformation + { + /// Bytes 0 to 1 Data length + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Byte 4 == 1 + public byte FieldId1; + /// Byte 5 disc application code + public byte DiscApplicationCode; + /// Byte 6 disc physical code + public byte DiscPhysicalCode; + /// Bytes 7 to 9 last address of data recordable area + public uint LastAddressOfDataRecordableArea; + /// Byte 10, bits 7 to 4 part version + public byte PartVersion; + /// Byte 10, bits 3 to 0 extension code + public byte ExtensionCode; + /// Byte 11 reserved + public byte Reserved3; + /// Byte 12 == 2 + public byte FieldId2; + /// Byte 13 OPC suggested code + public byte OPCSuggestedCode; + /// Byte 14 wavelength code or second part of OPC suggested code + public byte WaveLengthCode; + /// Bytes 15 to 18 write strategy code + public uint WriteStrategyCode; + /// Byte 19 reserved + public byte Reserved4; + /// Byte 20 == 3 + public byte FieldId3; + /// Bytes 21 to 26 first part of manufacturer ID + public byte[] ManufacturerId1; + /// Byte 27 + public byte Reserved5; + /// Byte 28 == 4 + public byte FieldId4; + /// Bytes 29 to 34 second part of manufacturer ID + public byte[] ManufacturerId2; + /// Byte 35 reserved + public byte Reserved6; + /// Byte 36 == 5 + public byte FieldId5; + /// Bytes 37 to 42, third part of manufacturer code or write strategy code for RW and R later versions + public byte[] ManufacturerId3; + /// Byte 43 reserved + public byte Reserved7; + /// Bytes 44 to 68 reserved + public byte[] Reserved8; + + public string ManufacturerId; + public uint WriteStrategyCode2; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/DVD/RMD.cs b/Aaru.Decoders/DVD/RMD.cs new file mode 100644 index 000000000..4dd4082b3 --- /dev/null +++ b/Aaru.Decoders/DVD/RMD.cs @@ -0,0 +1,95 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : RMD.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes DVD RMD. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; + +namespace Aaru.Decoders.DVD; + +// Information from the following standards: +// ANSI X3.304-1997 +// T10/1048-D revision 9.0 +// T10/1048-D revision 10a +// T10/1228-D revision 7.0c +// T10/1228-D revision 11a +// T10/1363-D revision 10g +// T10/1545-D revision 1d +// T10/1545-D revision 5 +// T10/1545-D revision 5a +// T10/1675-D revision 2c +// T10/1675-D revision 4 +// T10/1836-D revision 2g +// ECMA 365 +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +[SuppressMessage("ReSharper", "UnusedType.Global")] +public static class RMD +{ +#region Nested type: HDMediumStatus + + public struct HDMediumStatus + { + /// Bytes 0 to 1 Data length + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Byte 4, bits 7 to 1 Reserved + public byte Reserved3; + /// Byte 4, bit 0 Test Zone has been extended + public bool ExtendedTestZone; + /// Byte 5 Number of remaining RMDs in RDZ + public byte RemainingRMDs; + /// Bytes 6 to 7 Number of remaining RMDs in current RMZ + public ushort CurrentRemainingRMDs; + } + +#endregion + +#region Nested type: LastBorderOutRMD + + public struct LastBorderOutRMD + { + /// Bytes 0 to 1 Data length + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Bytes 4 to end RMD in last recorded Border-out + public byte[] RMD; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/DVD/Sector.cs b/Aaru.Decoders/DVD/Sector.cs new file mode 100644 index 000000000..a7b4c749b --- /dev/null +++ b/Aaru.Decoders/DVD/Sector.cs @@ -0,0 +1,254 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : Sector.cs +// Author(s) : Rebecca Wallander +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes and descrambles DVD sectors. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Rebecca Wallander +// ****************************************************************************/ + +#nullable enable +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using Aaru.CommonTypes.Enums; +using Aaru.Helpers; + +namespace Aaru.Decoders.DVD; + +[SuppressMessage("ReSharper", "UnusedMember.Global")] +public sealed class Sector +{ + static readonly ushort[] _ecma267InitialValues = + { + 0x0001, 0x5500, 0x0002, 0x2A00, 0x0004, 0x5400, 0x0008, 0x2800, 0x0010, 0x5000, 0x0020, 0x2001, 0x0040, 0x4002, + 0x0080, 0x0005 + }; + + static readonly uint[] _edcTable = + { + 0x00000000, 0x80000011, 0x80000033, 0x00000022, 0x80000077, 0x00000066, 0x00000044, 0x80000055, 0x800000FF, + 0x000000EE, 0x000000CC, 0x800000DD, 0x00000088, 0x80000099, 0x800000BB, 0x000000AA, 0x800001EF, 0x000001FE, + 0x000001DC, 0x800001CD, 0x00000198, 0x80000189, 0x800001AB, 0x000001BA, 0x00000110, 0x80000101, 0x80000123, + 0x00000132, 0x80000167, 0x00000176, 0x00000154, 0x80000145, 0x800003CF, 0x000003DE, 0x000003FC, 0x800003ED, + 0x000003B8, 0x800003A9, 0x8000038B, 0x0000039A, 0x00000330, 0x80000321, 0x80000303, 0x00000312, 0x80000347, + 0x00000356, 0x00000374, 0x80000365, 0x00000220, 0x80000231, 0x80000213, 0x00000202, 0x80000257, 0x00000246, + 0x00000264, 0x80000275, 0x800002DF, 0x000002CE, 0x000002EC, 0x800002FD, 0x000002A8, 0x800002B9, 0x8000029B, + 0x0000028A, 0x8000078F, 0x0000079E, 0x000007BC, 0x800007AD, 0x000007F8, 0x800007E9, 0x800007CB, 0x000007DA, + 0x00000770, 0x80000761, 0x80000743, 0x00000752, 0x80000707, 0x00000716, 0x00000734, 0x80000725, 0x00000660, + 0x80000671, 0x80000653, 0x00000642, 0x80000617, 0x00000606, 0x00000624, 0x80000635, 0x8000069F, 0x0000068E, + 0x000006AC, 0x800006BD, 0x000006E8, 0x800006F9, 0x800006DB, 0x000006CA, 0x00000440, 0x80000451, 0x80000473, + 0x00000462, 0x80000437, 0x00000426, 0x00000404, 0x80000415, 0x800004BF, 0x000004AE, 0x0000048C, 0x8000049D, + 0x000004C8, 0x800004D9, 0x800004FB, 0x000004EA, 0x800005AF, 0x000005BE, 0x0000059C, 0x8000058D, 0x000005D8, + 0x800005C9, 0x800005EB, 0x000005FA, 0x00000550, 0x80000541, 0x80000563, 0x00000572, 0x80000527, 0x00000536, + 0x00000514, 0x80000505, 0x80000F0F, 0x00000F1E, 0x00000F3C, 0x80000F2D, 0x00000F78, 0x80000F69, 0x80000F4B, + 0x00000F5A, 0x00000FF0, 0x80000FE1, 0x80000FC3, 0x00000FD2, 0x80000F87, 0x00000F96, 0x00000FB4, 0x80000FA5, + 0x00000EE0, 0x80000EF1, 0x80000ED3, 0x00000EC2, 0x80000E97, 0x00000E86, 0x00000EA4, 0x80000EB5, 0x80000E1F, + 0x00000E0E, 0x00000E2C, 0x80000E3D, 0x00000E68, 0x80000E79, 0x80000E5B, 0x00000E4A, 0x00000CC0, 0x80000CD1, + 0x80000CF3, 0x00000CE2, 0x80000CB7, 0x00000CA6, 0x00000C84, 0x80000C95, 0x80000C3F, 0x00000C2E, 0x00000C0C, + 0x80000C1D, 0x00000C48, 0x80000C59, 0x80000C7B, 0x00000C6A, 0x80000D2F, 0x00000D3E, 0x00000D1C, 0x80000D0D, + 0x00000D58, 0x80000D49, 0x80000D6B, 0x00000D7A, 0x00000DD0, 0x80000DC1, 0x80000DE3, 0x00000DF2, 0x80000DA7, + 0x00000DB6, 0x00000D94, 0x80000D85, 0x00000880, 0x80000891, 0x800008B3, 0x000008A2, 0x800008F7, 0x000008E6, + 0x000008C4, 0x800008D5, 0x8000087F, 0x0000086E, 0x0000084C, 0x8000085D, 0x00000808, 0x80000819, 0x8000083B, + 0x0000082A, 0x8000096F, 0x0000097E, 0x0000095C, 0x8000094D, 0x00000918, 0x80000909, 0x8000092B, 0x0000093A, + 0x00000990, 0x80000981, 0x800009A3, 0x000009B2, 0x800009E7, 0x000009F6, 0x000009D4, 0x800009C5, 0x80000B4F, + 0x00000B5E, 0x00000B7C, 0x80000B6D, 0x00000B38, 0x80000B29, 0x80000B0B, 0x00000B1A, 0x00000BB0, 0x80000BA1, + 0x80000B83, 0x00000B92, 0x80000BC7, 0x00000BD6, 0x00000BF4, 0x80000BE5, 0x00000AA0, 0x80000AB1, 0x80000A93, + 0x00000A82, 0x80000AD7, 0x00000AC6, 0x00000AE4, 0x80000AF5, 0x80000A5F, 0x00000A4E, 0x00000A6C, 0x80000A7D, + 0x00000A28, 0x80000A39, 0x80000A1B, 0x00000A0A + }; + + readonly Dictionary _seeds = new(); + + ushort _lastSeed; + + ushort _lfsr; + + void LfsrInit(ushort seed) => _lfsr = seed; + + int LfsrTick() + { + int ret = _lfsr >> 14; + + int n = ret ^ _lfsr >> 10 & 1; + _lfsr = (ushort)((_lfsr << 1 | n) & 0x7FFF); + + return ret; + } + + byte LfsrByte() + { + byte ret = 0; + + for(var i = 0; i < 8; i++) + ret = (byte)(ret << 1 | LfsrTick()); + + return ret; + } + + /// + /// Store seed and its cipher in cache + /// + /// The seed to store + /// The cipher for the seed + byte[] AddSeed(ushort seed) + { + int i; + var cypher = new byte[2048]; + + LfsrInit(seed); + + for(i = 0; i < 2048; i++) + cypher[i] = LfsrByte(); + + _seeds.Add(seed, cypher); + + return cypher; + } + + static uint ComputeEdc(uint edc, IReadOnlyList src, int size) + { + var pos = 0; + + for(; size > 0; size--) + edc = _edcTable[(edc >> 24 ^ src[pos++]) & 0xFF] ^ edc << 8; + + return edc; + } + + /// + /// Tests if a seed unscrambles a sector correctly + /// + /// Buffer of the scrambled sector + /// Seed to test + /// True if seed is correct, False if not + bool TestSeed(in byte[] sector, ushort seed) + { + var tmp = new byte[sector.Length]; + Array.Copy(sector, 0, tmp, 0, sector.Length); + + LfsrInit(seed); + + for(var i = 12; i < 2060; i++) + tmp[i] ^= LfsrByte(); + + return ComputeEdc(0, tmp, 2060) == BigEndianBitConverter.ToUInt32(sector, 2060); + } + + /// + /// Find the seed used for scrambling a sector + /// + /// Buffer of the scrambled sector. + /// The scramble cipher + byte[]? GetSeed(byte[] sector) + { + // Try the last used key + if(TestSeed(sector, _lastSeed)) + return _seeds[_lastSeed]; + + // Try the cached keys + foreach(ushort seedsKey in _seeds.Keys.Where(seedsKey => TestSeed(sector, seedsKey))) + { + _lastSeed = seedsKey; + + return _seeds[seedsKey]; + } + + // Try the ECMA-267 keys since they are often used + foreach(ushort iv in _ecma267InitialValues.Where(iv => TestSeed(sector, iv))) + { + _lastSeed = iv; + + return AddSeed(iv); + } + + // Brute force all other keys + for(ushort i = 0; i < 0x7FFF; i++) + { + if(!TestSeed(sector, i)) + continue; + + _lastSeed = i; + + return AddSeed(i); + } + + return null; + } + + /// + /// Unscramble a sector with a cipher + /// + /// Buffer of the scrambled sector + /// Buffer of the scrambling cipher + /// Buffer of unscrambled sector data + /// The Error. + static ErrorNumber UnscrambleSector(byte[] sector, IReadOnlyList cipher, out byte[] scrambled) + { + scrambled = new byte[sector.Length]; + Array.Copy(sector, 0, scrambled, 0, sector.Length); + + for(var i = 0; i < 2048; i++) + scrambled[i + 12] = (byte)(sector[i + 12] ^ cipher[i]); + + return ComputeEdc(0, scrambled, 2060) != BigEndianBitConverter.ToUInt32(sector, 2060) + ? ErrorNumber.NotVerifiable + : ErrorNumber.NoError; + } + + public ErrorNumber Scramble(byte[] sector, out byte[] scrambled) + { + scrambled = new byte[sector.Length]; + + if(sector is not { Length: 2064 }) + return ErrorNumber.NotSupported; + + byte[]? cipher = GetSeed(sector); + + return cipher == null ? ErrorNumber.UnrecognizedFormat : UnscrambleSector(sector, cipher, out scrambled); + } + + public ErrorNumber Scramble(byte[] sector, uint transferLength, out byte[] scrambled) + { + scrambled = new byte[sector.Length]; + + if(sector.Length % 2064 != 0 || sector.Length / 2064 != transferLength) + return ErrorNumber.NotSupported; + + for(uint i = 0; i < transferLength; i++) + { + ErrorNumber error = Scramble(sector.Skip((int)(i * 2064)).Take(2064).ToArray(), out byte[]? currentSector); + + if(error != ErrorNumber.NoError) + return error; + + Array.Copy(currentSector, 0, scrambled, i * 2064, 2064); + } + + return ErrorNumber.NoError; + } +} \ No newline at end of file diff --git a/Aaru.Decoders/DVD/Spare.cs b/Aaru.Decoders/DVD/Spare.cs new file mode 100644 index 000000000..74e64cb05 --- /dev/null +++ b/Aaru.Decoders/DVD/Spare.cs @@ -0,0 +1,115 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : Spare.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes DVD spare area information. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.DVD; + +// Information from the following standards: +// ANSI X3.304-1997 +// T10/1048-D revision 9.0 +// T10/1048-D revision 10a +// T10/1228-D revision 7.0c +// T10/1228-D revision 11a +// T10/1363-D revision 10g +// T10/1545-D revision 1d +// T10/1545-D revision 5 +// T10/1545-D revision 5a +// T10/1675-D revision 2c +// T10/1675-D revision 4 +// T10/1836-D revision 2g +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +public static class Spare +{ + public static SpareAreaInformation? Decode(byte[] response) + { + if(response?.Length != 16) + return null; + + return new SpareAreaInformation + { + DataLength = (ushort)((response[0] << 8) + response[1]), + Reserved1 = response[2], + Reserved2 = response[3], + UnusedPrimaryBlocks = (uint)((response[4] << 24) + (response[5] << 16) + (response[6] << 8) + response[7]), + UnusedSupplementaryBlocks = + (uint)((response[8] << 24) + (response[9] << 16) + (response[10] << 8) + response[11]), + AllocatedSupplementaryBlocks = + (uint)((response[12] << 24) + (response[13] << 16) + (response[14] << 8) + response[15]) + }; + } + + public static string Prettify(SpareAreaInformation? sai) + { + if(sai == null) + return null; + + SpareAreaInformation decoded = sai.Value; + var sb = new StringBuilder(); + + sb.AppendFormat(Localization._0_unused_primary_spare_blocks, decoded.UnusedPrimaryBlocks).AppendLine(); + + sb.AppendFormat(Localization._0_unused_supplementary_spare_blocks, decoded.UnusedSupplementaryBlocks). + AppendLine(); + + sb.AppendFormat(Localization._0_allocated_supplementary_spare_blocks, decoded.AllocatedSupplementaryBlocks). + AppendLine(); + + return sb.ToString(); + } + + public static string Prettify(byte[] response) => Prettify(Decode(response)); + +#region Nested type: SpareAreaInformation + + public struct SpareAreaInformation + { + /// Bytes 0 to 1 Data length + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Bytes 4 to 7 Data length + public uint UnusedPrimaryBlocks; + /// Bytes 8 to 11 Data length + public uint UnusedSupplementaryBlocks; + /// Bytes 12 to 15 Data length + public uint AllocatedSupplementaryBlocks; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/DVD/UDI.cs b/Aaru.Decoders/DVD/UDI.cs new file mode 100644 index 000000000..c3d2ff48d --- /dev/null +++ b/Aaru.Decoders/DVD/UDI.cs @@ -0,0 +1,89 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : UDI.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes DVD unique disc identifier. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; + +namespace Aaru.Decoders.DVD; + +// Information from the following standards: +// ANSI X3.304-1997 +// T10/1048-D revision 9.0 +// T10/1048-D revision 10a +// T10/1228-D revision 7.0c +// T10/1228-D revision 11a +// T10/1363-D revision 10g +// T10/1545-D revision 1d +// T10/1545-D revision 5 +// T10/1545-D revision 5a +// T10/1675-D revision 2c +// T10/1675-D revision 4 +// T10/1836-D revision 2g +// ECMA 365 +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +[SuppressMessage("ReSharper", "UnusedType.Global")] +public static class UDI +{ +#region Nested type: UniqueDiscIdentifier + + public struct UniqueDiscIdentifier + { + /// Bytes 0 to 1 Data length + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Byte 4 Reserved + public byte Reserved3; + /// Byte 5 Reserved + public byte Reserved4; + /// Bytes 6 to 7 Random number + public ushort RandomNumber; + /// Byte 8 to 11 Year + public uint Year; + /// Byte 12 to 13 Month + public ushort Month; + /// Byte 14 to 15 Day + public ushort Day; + /// Byte 16 to 17 Hour + public ushort Hour; + /// Byte 18 to 19 Minute + public ushort Minute; + /// Byte 20 to 21 Second + public ushort Second; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/Floppy/Amiga.cs b/Aaru.Decoders/Floppy/Amiga.cs new file mode 100644 index 000000000..5a59a07a0 --- /dev/null +++ b/Aaru.Decoders/Floppy/Amiga.cs @@ -0,0 +1,76 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : Amiga.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes Commodore Amiga floppy structures. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Runtime.InteropServices; + +namespace Aaru.Decoders.Floppy; + +/// Methods and structures for Commodore Amiga decoding +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +[SuppressMessage("ReSharper", "UnusedType.Global")] +public static class Amiga +{ +#region Nested type: Sector + + public struct Sector + { + /// Set to 0x00 + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] + public byte[] zero; + /// Set to 0xA1 + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] + public byte[] sync; + /// Set to 0xFF + public byte amiga; + /// Track number + public byte track; + /// Sector number + public byte sector; + /// Remaining sectors til end of writing + public byte remaining; + /// OS dependent tag + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] label; + /// Checksum from to + public uint headerChecksum; + /// Checksum from + public uint dataChecksum; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)] + public byte[] data; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/Floppy/Apple2.cs b/Aaru.Decoders/Floppy/Apple2.cs new file mode 100644 index 000000000..d81a6435d --- /dev/null +++ b/Aaru.Decoders/Floppy/Apple2.cs @@ -0,0 +1,685 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : Apple2.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes Apple ][ floppy structures. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using Aaru.Console; +using Aaru.Localization; + +namespace Aaru.Decoders.Floppy; + +/// Methods and structures for Apple ][ floppy decoding +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +[SuppressMessage("ReSharper", "ClassCanBeSealed.Global")] +public static class Apple2 +{ + const string MODULE_NAME = "Apple ][ GCR Decoder"; + static readonly byte[] ReadTable5and3 = + { + // 00h + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + + // 10h + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + + // 20h + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + + // 30h + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + + // 40h + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + + // 50h + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + + // 60h + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + + // 70h + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + + // 80h + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + + // 90h + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + + // A0h + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x01, 0x02, 0x03, + + // B0h + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0x05, 0x06, 0xFF, 0xFF, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0x0B, + + // C0h + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + + // D0h + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0x10, 0x11, 0x12, + + // E0h + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x13, 0x14, 0xFF, 0x15, 0x16, 0x17, + + // F0h + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x18, 0x19, 0x1A, 0xFF, 0xFF, 0x1B, 0x1C, 0xFF, 0x1D, 0x1E, 0x1F + }; + + static readonly byte[] ReadTable6and2 = + { + // 00h + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + + // 10h + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + + // 20h + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + + // 30h + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + + // 40h + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + + // 50h + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + + // 60h + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + + // 70h + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + + // 80h + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + + // 90h + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0xFF, 0xFF, 0x02, 0x03, 0xFF, 0x04, 0x05, 0x06, + + // A0h + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, + + // B0h + 0xFF, 0xFF, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0xFF, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, + + // C0h + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1B, 0xFF, 0x1C, 0x1D, 0x1E, + + // D0h + 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0x20, 0x21, 0xFF, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, + + // E0h + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x29, 0x2A, 0x2B, 0xFF, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, + + // F0h + 0xFF, 0xFF, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0xFF, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F + }; + + /// Decodes the 5and3 encoded data + /// 5and3 encoded data. + public static byte[] Decode5and3(byte[] data) + { + if(data is not { Length: 410 }) + return null; + + var buffer = new byte[data.Length]; + byte carry = 0; + + for(var i = 0; i < data.Length; i++) + { + carry ^= ReadTable5and3[data[i]]; + buffer[i] = carry; + } + + var output = new byte[256]; + + for(var i = 0; i < 51; i++) + { + byte b1 = buffer[51 * 3 - i]; + byte b2 = buffer[51 * 2 - i]; + byte b3 = buffer[51 - i]; + var b4 = (byte)(((b1 & 2) << 1 | b2 & 2 | (b3 & 2) >> 1) & 0xFF); + var b5 = (byte)(((b1 & 1) << 2 | (b2 & 1) << 1 | b3 & 1) & 0xFF); + output[250 - 5 * i] = (byte)((buffer[i + 51 * 3 + 1] << 3 | b1 >> 2 & 0x7) & 0xFF); + output[251 - 5 * i] = (byte)((buffer[i + 51 * 4 + 1] << 3 | b2 >> 2 & 0x7) & 0xFF); + output[252 - 5 * i] = (byte)((buffer[i + 51 * 5 + 1] << 3 | b3 >> 2 & 0x7) & 0xFF); + output[253 - 5 * i] = (byte)((buffer[i + 51 * 6 + 1] << 3 | b4) & 0xFF); + output[254 - 5 * i] = (byte)((buffer[i + 51 * 7 + 1] << 3 | b5) & 0xFF); + } + + output[255] = (byte)((buffer[409] << 3 | buffer[0] & 0x7) & 0xFF); + + return output; + } + + /// Decodes the 6and2 encoded data + /// 6and2 encoded data. + public static byte[] Decode6and2(byte[] data) + { + if(data is not { Length: 342 }) + return null; + + var buffer = new byte[data.Length]; + byte carry = 0; + + for(var i = 0; i < data.Length; i++) + { + carry ^= ReadTable6and2[data[i]]; + buffer[i] = carry; + } + + var output = new byte[256]; + + for(uint i = 0; i < 256; i++) + { + output[i] = (byte)(buffer[86 + i] << 2 & 0xFF); + + switch(i) + { + case < 86: + output[i] |= (byte)((buffer[i] & 1) << 1 & 0xFF); + output[i] |= (byte)((buffer[i] & 2) >> 1 & 0xFF); + + break; + case < 86 * 2: + output[i] |= (byte)((buffer[i - 86] & 4) >> 1 & 0xFF); + output[i] |= (byte)((buffer[i - 86] & 8) >> 3 & 0xFF); + + break; + default: + output[i] |= (byte)((buffer[i - 86 * 2] & 0x10) >> 3 & 0xFF); + output[i] |= (byte)((buffer[i - 86 * 2] & 0x20) >> 5 & 0xFF); + + break; + } + } + + return output; + } + + public static byte[] DecodeSector(RawSector sector) + { + if(sector.addressField.prologue[0] != 0xD5 || sector.addressField.prologue[1] != 0xAA) + return null; + + // Pre DOS 3.3 + if(sector.addressField.prologue[2] == 0xB5) + return Decode5and3(sector.dataField.data); + + // DOS 3.3 + return sector.addressField.prologue[2] == 0x96 ? Decode6and2(sector.dataField.data) : null; + + // Unknown + + // Not Apple ][ GCR? + } + + public static RawSector MarshalSector(byte[] data, int offset = 0) => MarshalSector(data, out _, offset); + + public static RawSector MarshalSector(byte[] data, out int endOffset, int offset = 0) + { + endOffset = offset; + + // Not an Apple ][ GCR sector + if(data == null || data.Length < 363) + return null; + + int position = offset; + + try + { + while(position < data.Length) + { + // Prologue found + if(data[position] == 0xD5 && data[position + 1] == 0xAA) + { + AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Prologue_found_at_0, position); + + // Epilogue not in correct position + if(data[position + 11] != 0xDE || data[position + 12] != 0xAA) + return null; + + var sector = new RawSector + { + addressField = new RawAddressField + { + prologue = new[] + { + data[position], data[position + 1], data[position + 2] + }, + volume = new[] + { + data[position + 3], data[position + 4] + }, + track = new[] + { + data[position + 5], data[position + 6] + }, + sector = new[] + { + data[position + 7], data[position + 8] + }, + checksum = new[] + { + data[position + 9], data[position + 10] + }, + epilogue = new[] + { + data[position + 11], data[position + 12], data[position + 13] + } + } + }; + + AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Volume_0, + ((sector.addressField.volume[0] & 0x55) << 1 | + sector.addressField.volume[1] & 0x55) & + 0xFF); + + AaruConsole.DebugWriteLine(MODULE_NAME, Core.Track_0, + ((sector.addressField.track[0] & 0x55) << 1 | + sector.addressField.track[1] & 0x55) & + 0xFF); + + AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Sector_0, + ((sector.addressField.sector[0] & 0x55) << 1 | + sector.addressField.sector[1] & 0x55) & + 0xFF); + + AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Checksum_0, + ((sector.addressField.checksum[0] & 0x55) << 1 | + sector.addressField.checksum[1] & 0x55) & + 0xFF); + + AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Epilogue_0_1_2, + sector.addressField.epilogue[0], sector.addressField.epilogue[1], + sector.addressField.epilogue[2]); + + position += 14; + var syncCount = 0; + var onSync = false; + var gaps = new MemoryStream(); + + while(data[position] == 0xFF) + { + gaps.WriteByte(data[position]); + syncCount++; + onSync = syncCount >= 5; + position++; + } + + // Lost sync + if(!onSync) + return null; + + // Prologue not found + if(data[position] != 0xD5 || data[position + 1] != 0xAA) + return null; + + sector.innerGap = gaps.ToArray(); + sector.dataField = new RawDataField(); + + AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Inner_gap_has_0_bytes, sector.innerGap.Length); + + AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Prologue_found_at_0, position); + sector.dataField.prologue = new byte[3]; + sector.dataField.prologue[0] = data[position]; + sector.dataField.prologue[1] = data[position + 1]; + sector.dataField.prologue[2] = data[position + 2]; + position += 3; + + gaps = new MemoryStream(); + + // Read data until epilogue is found + while(data[position + 1] != 0xDE || data[position + 2] != 0xAA) + { + gaps.WriteByte(data[position]); + position++; + + // No space left for epilogue + if(position + 4 > data.Length) + return null; + } + + sector.dataField.data = gaps.ToArray(); + + AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Data_has_0_bytes, + sector.dataField.data.Length); + + sector.dataField.checksum = data[position]; + sector.dataField.epilogue = new byte[3]; + sector.dataField.epilogue[0] = data[position + 1]; + sector.dataField.epilogue[1] = data[position + 2]; + sector.dataField.epilogue[2] = data[position + 3]; + + position += 4; + gaps = new MemoryStream(); + + // Read gap, if any + while(position < data.Length && data[position] == 0xFF) + { + gaps.WriteByte(data[position]); + position++; + } + + // Reduces last sector gap so doesn't eat next tracks's gap + if(gaps.Length > 5) + { + gaps.SetLength(gaps.Length / 2); + position -= (int)gaps.Length; + } + + sector.gap = gaps.ToArray(); + + // Return current position to be able to read separate sectors + endOffset = position; + + AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Got_0_bytes_of_gap, sector.gap.Length); + + AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Finished_sector_at_0, position); + + return sector; + } + + if(data[position] == 0xFF) + position++; + + // Found data that is not sync or a prologue + else + return null; + } + } + catch(IndexOutOfRangeException) + { + return null; + } + + return null; + } + + public static byte[] MarshalAddressField(RawAddressField addressField) + { + if(addressField == null) + return null; + + var raw = new MemoryStream(); + raw.Write(addressField.prologue, 0, addressField.prologue.Length); + raw.Write(addressField.volume, 0, addressField.volume.Length); + raw.Write(addressField.track, 0, addressField.track.Length); + raw.Write(addressField.sector, 0, addressField.sector.Length); + raw.Write(addressField.checksum, 0, addressField.checksum.Length); + raw.Write(addressField.epilogue, 0, addressField.epilogue.Length); + + return raw.ToArray(); + } + + public static byte[] MarshalSector(RawSector sector) + { + if(sector == null) + return null; + + var raw = new MemoryStream(); + raw.Write(sector.addressField.prologue, 0, sector.addressField.prologue.Length); + raw.Write(sector.addressField.volume, 0, sector.addressField.volume.Length); + raw.Write(sector.addressField.track, 0, sector.addressField.track.Length); + raw.Write(sector.addressField.sector, 0, sector.addressField.sector.Length); + raw.Write(sector.addressField.checksum, 0, sector.addressField.checksum.Length); + raw.Write(sector.addressField.epilogue, 0, sector.addressField.epilogue.Length); + raw.Write(sector.innerGap, 0, sector.innerGap.Length); + raw.Write(sector.dataField.prologue, 0, sector.dataField.prologue.Length); + raw.Write(sector.dataField.data, 0, sector.dataField.data.Length); + raw.WriteByte(sector.dataField.checksum); + raw.Write(sector.dataField.epilogue, 0, sector.dataField.epilogue.Length); + raw.Write(sector.gap, 0, sector.gap.Length); + + return raw.ToArray(); + } + + public static RawTrack MarshalTrack(byte[] data, int offset = 0) => MarshalTrack(data, out _, offset); + + public static RawTrack MarshalTrack(byte[] data, out int endOffset, int offset = 0) + { + int position = offset; + var firstSector = true; + var onSync = false; + var gaps = new MemoryStream(); + var count = 0; + List sectors = new(); + var trackNumber = new byte[2]; + endOffset = offset; + + while(position < data.Length && data[position] == 0xFF) + { + gaps.WriteByte(data[position]); + count++; + position++; + onSync = count >= 5; + } + + if(position >= data.Length) + return null; + + if(!onSync) + return null; + + while(position < data.Length) + { + int oldPosition = position; + RawSector sector = MarshalSector(data, out position, position); + + if(sector == null) + break; + + if(firstSector) + { + trackNumber[0] = sector.addressField.track[0]; + trackNumber[1] = sector.addressField.track[1]; + firstSector = false; + } + + if(sector.addressField.track[0] != trackNumber[0] || sector.addressField.track[1] != trackNumber[1]) + { + position = oldPosition; + + break; + } + + AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Adding_sector_0_of_track_1, + ((sector.addressField.sector[0] & 0x55) << 1 | + sector.addressField.sector[1] & 0x55) & + 0xFF, + ((sector.addressField.track[0] & 0x55) << 1 | + sector.addressField.track[1] & 0x55) & + 0xFF); + + sectors.Add(sector); + } + + if(sectors.Count == 0) + return null; + + var track = new RawTrack + { + gap = gaps.ToArray(), + sectors = sectors.ToArray() + }; + + endOffset = position; + + return track; + } + + public static byte[] MarshalTrack(RawTrack track) + { + if(track == null) + return null; + + var raw = new MemoryStream(); + raw.Write(track.gap, 0, track.gap.Length); + + foreach(byte[] rawSector in track.sectors.Select(MarshalSector)) + raw.Write(rawSector, 0, rawSector.Length); + + return raw.ToArray(); + } + + public static List MarshalDisk(byte[] data, int offset = 0) => MarshalDisk(data, out _, offset); + + [SuppressMessage("ReSharper", "OutParameterValueIsAlwaysDiscarded.Global")] + public static List MarshalDisk(byte[] data, out int endOffset, int offset = 0) + { + endOffset = offset; + List tracks = new(); + int position = offset; + + RawTrack track = MarshalTrack(data, out position, position); + + while(track != null) + { + tracks.Add(track); + track = MarshalTrack(data, out position, position); + } + + if(tracks.Count == 0) + return null; + + endOffset = position; + + return tracks; + } + + public static byte[] MarshalDisk(List disk) => MarshalDisk(disk.ToArray()); + + public static byte[] MarshalDisk(RawTrack[] disk) + { + if(disk == null) + return null; + + var raw = new MemoryStream(); + + foreach(byte[] rawTrack in disk.Select(MarshalTrack)) + raw.Write(rawTrack, 0, rawTrack.Length); + + return raw.ToArray(); + } + + public static bool IsApple2GCR(byte[] data) + { + RawSector sector = MarshalSector(data, out int position); + + return sector != null && position != 0; + } + +#region Nested type: RawAddressField + + /// GCR-encoded Apple ][ GCR floppy sector address field + public class RawAddressField + { + /// + /// decodedChecksum = decodedVolume ^ decodedTrack ^ decodedSector checksum[0] = (decodedChecksum >> 1) | 0xAA + /// checksum[1] = decodedChecksum | 0xAA + /// + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] + public byte[] checksum; + /// Always 0xDE, 0xAA, 0xEB + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] epilogue; + /// Always 0xD5, 0xAA, 0x96 + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] prologue; + /// Sector number encoded as: sector[0] = (decodedSector >> 1) | 0xAA sector[1] = decodedSector | 0xAA + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] + public byte[] sector; + /// Track number encoded as: track[0] = (decodedTrack >> 1) | 0xAA track[1] = decodedTrack | 0xAA + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] + public byte[] track; + /// Volume number encoded as: volume[0] = (decodedVolume >> 1) | 0xAA volume[1] = decodedVolume | 0xAA + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] + public byte[] volume; + } + +#endregion + +#region Nested type: RawDataField + + /// GCR-encoded Apple ][ GCR floppy sector data field + public class RawDataField + { + public byte checksum; + /// Encoded data bytes. 410 bytes for 5to3 (aka DOS 3.2) format 342 bytes for 6to2 (aka DOS 3.3) format + public byte[] data; + /// Always 0xDE, 0xAA, 0xEB + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] epilogue; + /// Always 0xD5, 0xAA, 0xAD + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] prologue; + } + +#endregion + +#region Nested type: RawSector + + /// GCR-encoded Apple ][ GCR floppy sector + public class RawSector + { + /// Address field + public RawAddressField addressField; + /// Data field + public RawDataField dataField; + /// Track preamble, set to self-sync 0xFF, between 14 and 24 bytes + public byte[] gap; + /// Track preamble, set to self-sync 0xFF, between 5 and 10 bytes + public byte[] innerGap; + } + +#endregion + +#region Nested type: RawTrack + + /// GCR-encoded Apple ][ GCR floppy track + public class RawTrack + { + /// Track preamble, set to self-sync 0xFF, between 40 and 95 bytes + public byte[] gap; + public RawSector[] sectors; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/Floppy/AppleSony.cs b/Aaru.Decoders/Floppy/AppleSony.cs new file mode 100644 index 000000000..9fd83edf0 --- /dev/null +++ b/Aaru.Decoders/Floppy/AppleSony.cs @@ -0,0 +1,523 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : AppleSony.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes Apple/Sony floppy structures. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; + +namespace Aaru.Decoders.Floppy; + +// Information from: +// Inside Macintosh, Volume II, ISBN 0-201-17732-3 + +/// Methods and structures for Apple Sony GCR floppy decoding +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +[SuppressMessage("ReSharper", "UnusedType.Global")] +[SuppressMessage("ReSharper", "OutParameterValueIsAlwaysDiscarded.Global")] +public static class AppleSony +{ + public static byte[] DecodeSector(RawSector sector) + { + if(sector.addressField.prologue[0] != 0xD5 || + sector.addressField.prologue[1] != 0xAA || + sector.addressField.prologue[2] != 0x96) + return null; + + var bf1 = new byte[175]; + var bf2 = new byte[175]; + var bf3 = new byte[175]; + byte[] nib_data = sector.dataField.data; + var ms = new MemoryStream(); + + var j = 0; + byte w3 = 0; + + for(var i = 0; i <= 174; i++) + { + byte w4 = nib_data[j++]; + byte w1 = nib_data[j++]; + byte w2 = nib_data[j++]; + + if(i != 174) + w3 = nib_data[j++]; + + bf1[i] = (byte)((w1 & 0x3F | w4 << 2 & 0xC0) & 0x0F); + bf2[i] = (byte)((w2 & 0x3F | w4 << 4 & 0xC0) & 0x0F); + bf3[i] = (byte)((w3 & 0x3F | w4 << 6 & 0xC0) & 0x0F); + } + + j = 0; + uint ck1 = 0; + uint ck2 = 0; + uint ck3 = 0; + + while(true) + { + ck1 = (ck1 & 0xFF) << 1; + + if((ck1 & 0x0100) > 0) + ck1++; + + var carry = (byte)((bf1[j] ^ ck1) & 0xFF); + ck3 += carry; + + if((ck1 & 0x0100) > 0) + { + ck3++; + ck1 &= 0xFF; + } + + ms.WriteByte(carry); + + carry = (byte)((bf2[j] ^ ck3) & 0xFF); + ck2 += carry; + + if(ck3 > 0xFF) + { + ck2++; + ck3 &= 0xFF; + } + + ms.WriteByte(carry); + + if(ms.Length == 524) + break; + + carry = (byte)((bf3[j] ^ ck2) & 0xFF); + ck1 += carry; + + if(ck2 > 0xFF) + { + ck1++; + ck2 &= 0xFF; + } + + ms.WriteByte(carry); + j++; + } + + return ms.ToArray(); + + // Not Apple Sony GCR? + } + + public static RawSector MarshalSector(byte[] data, int offset = 0) => MarshalSector(data, out _, offset); + + public static RawSector MarshalSector(byte[] data, out int endOffset, int offset = 0) + { + endOffset = offset; + + // Not an Apple ][ GCR sector + if(data == null || data.Length < 363) + return null; + + int position = offset; + + try + { + while(position < data.Length) + { + // Prologue found + if(data[position] == 0xD5 && data[position + 1] == 0xAA && data[position + 2] == 0x96) + { + // Epilogue not in correct position + if(data[position + 8] != 0xDE || data[position + 9] != 0xAA) + return null; + + var sector = new RawSector + { + addressField = new RawAddressField + { + prologue = new[] + { + data[position], data[position + 1], data[position + 2] + }, + track = data[position + 3], + sector = data[position + 4], + side = data[position + 5], + format = (AppleEncodedFormat)data[position + 6], + checksum = data[position + 7], + epilogue = new[] + { + data[position + 8], data[position + 9] + } + } + }; + + position += 10; + var syncCount = 0; + var onSync = false; + var gaps = new MemoryStream(); + + while(data[position] == 0xFF) + { + gaps.WriteByte(data[position]); + syncCount++; + onSync = syncCount >= 5; + position++; + } + + // Lost sync + if(!onSync) + return null; + + // Prologue not found + if(data[position] != 0xDE || data[position + 1] != 0xAA || data[position + 2] != 0xAD) + return null; + + sector.innerGap = gaps.ToArray(); + + sector.dataField = new RawDataField + { + prologue = new[] + { + data[position], data[position + 1], data[position + 2] + }, + spare = data[position + 3] + }; + + position += 4; + + gaps = new MemoryStream(); + + // Read data until epilogue is found + while(data[position + 4] != 0xD5 || data[position + 5] != 0xAA) + { + gaps.WriteByte(data[position]); + position++; + + // No space left for epilogue + if(position + 7 > data.Length) + return null; + } + + sector.dataField.data = gaps.ToArray(); + sector.dataField.checksum = new byte[4]; + sector.dataField.checksum[0] = data[position]; + sector.dataField.checksum[1] = data[position + 2]; + sector.dataField.checksum[2] = data[position + 3]; + sector.dataField.checksum[3] = data[position + 4]; + sector.dataField.epilogue = new byte[2]; + sector.dataField.epilogue[0] = data[position + 5]; + sector.dataField.epilogue[1] = data[position + 6]; + + position += 7; + gaps = new MemoryStream(); + + // Read gap, if any + while(position < data.Length && data[position] == 0xFF) + { + gaps.WriteByte(data[position]); + position++; + } + + // Reduces last sector gap so doesn't eat next tracks's gap + if(gaps.Length > 5) + { + gaps.SetLength(gaps.Length / 2); + position -= (int)gaps.Length; + } + + sector.gap = gaps.ToArray(); + + // Return current position to be able to read separate sectors + endOffset = position; + + return sector; + } + + if(data[position] == 0xFF) + position++; + + // Found data that is not sync or a prologue + else + return null; + } + } + catch(IndexOutOfRangeException) + { + return null; + } + + return null; + } + + public static byte[] MarshalAddressField(RawAddressField addressField) + { + if(addressField == null) + return null; + + var raw = new MemoryStream(); + raw.Write(addressField.prologue, 0, addressField.prologue.Length); + raw.WriteByte(addressField.track); + raw.WriteByte(addressField.sector); + raw.WriteByte(addressField.side); + raw.WriteByte((byte)addressField.format); + raw.WriteByte(addressField.checksum); + + return raw.ToArray(); + } + + public static byte[] MarshalSector(RawSector sector) + { + if(sector == null) + return null; + + var raw = new MemoryStream(); + raw.Write(sector.addressField.prologue, 0, sector.addressField.prologue.Length); + raw.WriteByte(sector.addressField.track); + raw.WriteByte(sector.addressField.sector); + raw.WriteByte(sector.addressField.side); + raw.WriteByte((byte)sector.addressField.format); + raw.WriteByte(sector.addressField.checksum); + raw.Write(sector.innerGap, 0, sector.innerGap.Length); + raw.Write(sector.dataField.prologue, 0, sector.dataField.prologue.Length); + raw.WriteByte(sector.dataField.spare); + raw.Write(sector.dataField.data, 0, sector.dataField.data.Length); + raw.Write(sector.dataField.checksum, 0, sector.dataField.checksum.Length); + raw.Write(sector.dataField.epilogue, 0, sector.dataField.epilogue.Length); + raw.Write(sector.gap, 0, sector.gap.Length); + + return raw.ToArray(); + } + + public static RawTrack MarshalTrack(byte[] data, int offset = 0) => MarshalTrack(data, out _, offset); + + public static RawTrack MarshalTrack(byte[] data, out int endOffset, int offset = 0) + { + int position = offset; + var firstSector = true; + var onSync = false; + var gaps = new MemoryStream(); + var count = 0; + List sectors = new(); + byte trackNumber = 0; + byte sideNumber = 0; + endOffset = offset; + + while(position < data.Length && data[position] == 0xFF) + { + gaps.WriteByte(data[position]); + count++; + position++; + onSync = count >= 5; + } + + if(position >= data.Length) + return null; + + if(!onSync) + return null; + + while(position < data.Length) + { + int oldPosition = position; + RawSector sector = MarshalSector(data, out position, position); + + if(sector == null) + break; + + if(firstSector) + { + trackNumber = sector.addressField.track; + sideNumber = sector.addressField.side; + firstSector = false; + } + + if(sector.addressField.track != trackNumber || sector.addressField.side != sideNumber) + { + position = oldPosition; + + break; + } + + sectors.Add(sector); + } + + if(sectors.Count == 0) + return null; + + var track = new RawTrack + { + gap = gaps.ToArray(), + sectors = sectors.ToArray() + }; + + endOffset = position; + + return track; + } + + public static byte[] MarshalTrack(RawTrack track) + { + if(track == null) + return null; + + var raw = new MemoryStream(); + raw.Write(track.gap, 0, track.gap.Length); + + foreach(byte[] rawSector in track.sectors.Select(MarshalSector)) + raw.Write(rawSector, 0, rawSector.Length); + + return raw.ToArray(); + } + + public static List MarshalDisk(byte[] data, int offset = 0) => MarshalDisk(data, out _, offset); + + public static List MarshalDisk(byte[] data, out int endOffset, int offset = 0) + { + endOffset = offset; + List tracks = new(); + int position = offset; + + RawTrack track = MarshalTrack(data, out position, position); + + while(track != null) + { + tracks.Add(track); + track = MarshalTrack(data, out position, position); + } + + if(tracks.Count == 0) + return null; + + endOffset = position; + + return tracks; + } + + public static byte[] MarshalDisk(List disk) => MarshalDisk(disk.ToArray()); + + public static byte[] MarshalDisk(RawTrack[] disk) + { + if(disk == null) + return null; + + var raw = new MemoryStream(); + + foreach(byte[] rawTrack in disk.Select(MarshalTrack)) + raw.Write(rawTrack, 0, rawTrack.Length); + + return raw.ToArray(); + } + + public static bool IsAppleSonyGCR(byte[] data) + { + RawSector sector = MarshalSector(data, out int position); + + return sector != null && position != 0; + } + +#region Nested type: RawAddressField + + /// GCR-encoded Apple Sony GCR floppy sector address field + public sealed class RawAddressField + { + /// Checksum + public byte checksum; + /// Always 0xDE, 0xAA + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] + public byte[] epilogue; + /// Disk format + public AppleEncodedFormat format; + /// Always 0xD5, 0xAA, 0x96 + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] prologue; + /// Encoded sector number + public byte sector; + /// Encoded side number + public byte side; + /// Encoded (decodedTrack & 0x3F) + public byte track; + } + +#endregion + +#region Nested type: RawDataField + + /// GCR-encoded Apple ][ GCR floppy sector data field + public sealed class RawDataField + { + /// Checksum + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] + public byte[] checksum; + /// Encoded data bytes. + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 698)] + public byte[] data; + /// Always 0xDE, 0xAA + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] + public byte[] epilogue; + /// Always 0xD5, 0xAA, 0xAD + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] prologue; + /// Spare, usually + public byte spare; + } + +#endregion + +#region Nested type: RawSector + + /// GCR-encoded Apple Sony GCR floppy sector + public sealed class RawSector + { + /// Address field + public RawAddressField addressField; + /// Data field + public RawDataField dataField; + /// Track preamble, set to self-sync 0xFF, unknown size + public byte[] gap; + /// Track preamble, set to self-sync 0xFF, 6 bytes + public byte[] innerGap; + } + +#endregion + +#region Nested type: RawTrack + + /// GCR-encoded Apple Sony GCR floppy track + public sealed class RawTrack + { + /// Track preamble, set to self-sync 0xFF, 36 bytes + public byte[] gap; + public RawSector[] sectors; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/Floppy/Commodore.cs b/Aaru.Decoders/Floppy/Commodore.cs new file mode 100644 index 000000000..e8cbb8f42 --- /dev/null +++ b/Aaru.Decoders/Floppy/Commodore.cs @@ -0,0 +1,84 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : Commodore.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes Commodore (pre-Amiga) floppy structures. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Runtime.InteropServices; + +namespace Aaru.Decoders.Floppy; + +/// Methods and structures for Commodore GCR floppy decoding +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +[SuppressMessage("ReSharper", "UnusedType.Global")] +public static class Commodore +{ +#region Nested type: SectorData + + /// Decoded Commodore GCR sector data + public struct SectorData + { + /// Always 0x07 + public byte id; + /// User data + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] + public byte data; + /// XOR of + public byte checksum; + /// Filled with 0x0F + public ushort fill; + } + +#endregion + +#region Nested type: SectorHeader + + /// Decoded Commodore GCR sector header + public struct SectorHeader + { + /// Always 0x08 + public byte id; + /// XOR of following fields + public byte checksum; + /// Sector number + public byte sector; + /// Track number + public byte track; + /// Format ID, unknown meaning + public ushort format; + /// Filled with 0x0F + public ushort fill; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/Floppy/Enums.cs b/Aaru.Decoders/Floppy/Enums.cs new file mode 100644 index 000000000..a93ff4e42 --- /dev/null +++ b/Aaru.Decoders/Floppy/Enums.cs @@ -0,0 +1,81 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : Enums.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Contains various floppy enumerations. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; + +namespace Aaru.Decoders.Floppy; + +/// In-sector code for sector size +[SuppressMessage("ReSharper", "InconsistentNaming")] +public enum IBMSectorSizeCode : byte +{ + /// 128 bytes/sector + EighthKilo = 0, + /// 256 bytes/sector + QuarterKilo = 1, + /// 512 bytes/sector + HalfKilo = 2, + /// 1024 bytes/sector + Kilo = 3, + /// 2048 bytes/sector + TwiceKilo = 4, + /// 4096 bytes/sector + FriceKilo = 5, + /// 8192 bytes/sector + TwiceFriceKilo = 6, + /// 16384 bytes/sector + FricelyFriceKilo = 7 +} + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +public enum IBMIdType : byte +{ + IndexMark = 0xFC, + AddressMark = 0xFE, + DataMark = 0xFB, + DeletedDataMark = 0xF8 +} + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +public enum AppleEncodedFormat : byte +{ + /// Disk is an Apple II 3.5" disk + AppleII = 0x96, + /// Disk is an Apple Lisa 3.5" disk + Lisa = 0x97, + /// Disk is an Apple Macintosh single-sided 3.5" disk + MacSingleSide = 0x9A, + /// Disk is an Apple Macintosh double-sided 3.5" disk + MacDoubleSide = 0xD9 +} \ No newline at end of file diff --git a/Aaru.Decoders/Floppy/ISO.cs b/Aaru.Decoders/Floppy/ISO.cs new file mode 100644 index 000000000..500338874 --- /dev/null +++ b/Aaru.Decoders/Floppy/ISO.cs @@ -0,0 +1,139 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : ISO.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes ISO/ECMA floppy structures. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Runtime.InteropServices; + +namespace Aaru.Decoders.Floppy; + +// Information from: +// National Semiconductor PC87332VLJ datasheet +// SMsC FDC37C78 datasheet +// Intel 82078 datasheet +// Intel 82077AA datasheet +// Toshiba TC8566AF datasheet +// Fujitsu MB8876A datasheet +// ECMA-147 +// ECMA-100 + +/// Methods and structures for ISO floppy decoding (also used by Atari ST and others) +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +[SuppressMessage("ReSharper", "UnusedType.Global")] +public static class ISO +{ +#region Nested type: AddressMark + + /// Sector address mark for IBM System 34 floppies, contains sync word + public struct AddressMark + { + /// 12 bytes set to 0 + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] + public byte[] zero; + /// 3 bytes set to 0xA1 + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] aone; + /// Set to + public IBMIdType type; + /// Track number + public byte track; + /// Side number + public byte side; + /// Sector number + public byte sector; + /// + /// + /// + public IBMSectorSizeCode sectorSize; + /// CRC16 from to end of + public ushort crc; + } + +#endregion + +#region Nested type: DataBlock + + /// Sector data block for IBM System 34 floppies + public struct DataBlock + { + /// 12 bytes set to 0 + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] + public byte[] zero; + /// 3 bytes set to 0xA1 + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] aone; + /// Set to or to + public IBMIdType type; + /// User data + public byte[] data; + /// CRC16 from to end of + public ushort crc; + } + +#endregion + +#region Nested type: Sector + + /// Raw demodulated format for IBM System 34 floppies + public struct Sector + { + /// Sector address mark + public AddressMark addressMark; + /// 22 bytes set to 0x4E, set to 0x22 on Commodore 1581 + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 22)] + public byte[] innerGap; + /// Sector data block + public DataBlock dataBlock; + /// Variable bytes set to 0x4E, ECMA defines 54 + public byte[] outerGap; + } + +#endregion + +#region Nested type: Track + + /// ISO floppy track, also used by Atari ST and others + public struct Track + { + /// Start of track, 32 bytes set to 0x4E + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] + public byte[] innerGap; + /// Track sectors + public Sector[] sectors; + /// Undefined size + public byte[] gap; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/Floppy/Perpendicular.cs b/Aaru.Decoders/Floppy/Perpendicular.cs new file mode 100644 index 000000000..c6a68e05e --- /dev/null +++ b/Aaru.Decoders/Floppy/Perpendicular.cs @@ -0,0 +1,161 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : Perpendicular.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes perpendicular recording floppy structures. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Runtime.InteropServices; + +namespace Aaru.Decoders.Floppy; + +// Information from: +// National Semiconductor PC87332VLJ datasheet +// SMsC FDC37C78 datasheet +// Intel 82078 datasheet +// Intel 82077AA datasheet +// Toshiba TC8566AF datasheet +// Fujitsu MB8876A datasheet +// ECMA-147 +// ECMA-100 + +/// Methods and structures for perpendicular MFM floppy decoding +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +[SuppressMessage("ReSharper", "UnusedType.Global")] +public static class Perpendicular +{ +#region Nested type: AddressMark + + /// Sector address mark for IBM System 34 floppies, contains sync word + public struct AddressMark + { + /// 12 bytes set to 0 + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] + public byte[] zero; + /// 3 bytes set to 0xA1 + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] aone; + /// Set to + public IBMIdType type; + /// Track number + public byte track; + /// Side number + public byte side; + /// Sector number + public byte sector; + /// + /// + /// + public IBMSectorSizeCode sectorSize; + /// CRC16 from to end of + public ushort crc; + } + +#endregion + +#region Nested type: DataBlock + + /// Sector data block for IBM System 34 floppies + public struct DataBlock + { + /// 12 bytes set to 0 + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] + public byte[] zero; + /// 3 bytes set to 0xA1 + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] aone; + /// Set to or to + public IBMIdType type; + /// User data + public byte[] data; + /// CRC16 from to end of + public ushort crc; + } + +#endregion + +#region Nested type: Sector + + /// Raw demodulated format for perpendicular floppies + public struct Sector + { + /// Sector address mark + public AddressMark addressMark; + /// 41 bytes set to 0x4E + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 41)] + public byte[] innerGap; + /// Sector data block + public DataBlock dataBlock; + /// Variable-sized inter-sector gap, ECMA defines 83 bytes + public byte[] outerGap; + } + +#endregion + +#region Nested type: Track + + /// Perpendicular floppy track + public struct Track + { + /// Start of track + public TrackPreamble trackStart; + /// Track sectors + public Sector[] sectors; + /// Undefined size + public byte[] gap; + } + +#endregion + +#region Nested type: TrackPreamble + + /// Start of IBM PC MFM floppy track Used by IBM PC, Apple Macintosh (high-density only), and a lot others + public struct TrackPreamble + { + /// Gap from index pulse, 80 bytes set to 0x4E + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 80)] + public byte[] gap; + /// 12 bytes set to 0x00 + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] + public byte[] zero; + /// 3 bytes set to 0xC2 + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] ctwo; + /// Set to + public IBMIdType type; + /// Gap until first sector, 50 bytes to 0x4E + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)] + public byte[] gap1; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/Floppy/System34.cs b/Aaru.Decoders/Floppy/System34.cs new file mode 100644 index 000000000..494afaae1 --- /dev/null +++ b/Aaru.Decoders/Floppy/System34.cs @@ -0,0 +1,162 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : System34.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes IBM System 34 floppy structures. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Runtime.InteropServices; + +namespace Aaru.Decoders.Floppy; + +// Information from: +// National Semiconductor PC87332VLJ datasheet +// SMsC FDC37C78 datasheet +// Intel 82078 datasheet +// Intel 82077AA datasheet +// Toshiba TC8566AF datasheet +// Fujitsu MB8876A datasheet +// ECMA-147 +// ECMA-100 + +/// Methods and structures for IBM System 34 floppy decoding +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +[SuppressMessage("ReSharper", "UnusedType.Global")] +[SuppressMessage("ReSharper", "UnusedType.Global")] +public static class System34 +{ +#region Nested type: AddressMark + + /// Sector address mark for IBM System 34 floppies, contains sync word + public struct AddressMark + { + /// 12 bytes set to 0 + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] + public byte[] zero; + /// 3 bytes set to 0xA1 + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] aone; + /// Set to + public IBMIdType type; + /// Track number + public byte track; + /// Side number + public byte side; + /// Sector number + public byte sector; + /// + /// + /// + public IBMSectorSizeCode sectorSize; + /// CRC16 from to end of + public ushort crc; + } + +#endregion + +#region Nested type: DataBlock + + /// Sector data block for IBM System 34 floppies + public struct DataBlock + { + /// 12 bytes set to 0 + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] + public byte[] zero; + /// 3 bytes set to 0xA1 + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] aone; + /// Set to or to + public IBMIdType type; + /// User data + public byte[] data; + /// CRC16 from to end of + public ushort crc; + } + +#endregion + +#region Nested type: Sector + + /// Raw demodulated format for IBM System 34 floppies + public struct Sector + { + /// Sector address mark + public AddressMark addressMark; + /// 22 bytes set to 0x4E, set to 0x22 on Commodore 1581 + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 22)] + public byte[] innerGap; + /// Sector data block + public DataBlock dataBlock; + /// Variable bytes set to 0x4E, ECMA defines 54 + public byte[] outerGap; + } + +#endregion + +#region Nested type: Track + + /// Track format for IBM System 34 floppy Used by IBM PC, Apple Macintosh (high-density only), and a lot others + public struct Track + { + /// Start of track + public TrackPreamble trackStart; + /// Track sectors + public Sector[] sectors; + /// Undefined size + public byte[] gap; + } + +#endregion + +#region Nested type: TrackPreamble + + /// Start of IBM PC MFM floppy track Used by IBM PC, Apple Macintosh (high-density only), and a lot others + public struct TrackPreamble + { + /// Gap from index pulse, 80 bytes set to 0x4E + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 80)] + public byte[] gap; + /// 12 bytes set to 0x00 + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] + public byte[] zero; + /// 3 bytes set to 0xC2 + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] ctwo; + /// Set to + public IBMIdType type; + /// Gap until first sector, 50 bytes to 0x4E + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)] + public byte[] gap1; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/Floppy/System3740.cs b/Aaru.Decoders/Floppy/System3740.cs new file mode 100644 index 000000000..a67a8e789 --- /dev/null +++ b/Aaru.Decoders/Floppy/System3740.cs @@ -0,0 +1,152 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : System3740.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes IBM System 3740 floppy structures. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Runtime.InteropServices; + +namespace Aaru.Decoders.Floppy; + +// Information from: +// National Semiconductor PC87332VLJ datasheet +// SMsC FDC37C78 datasheet +// Intel 82078 datasheet +// Intel 82077AA datasheet +// Toshiba TC8566AF datasheet +// Fujitsu MB8876A datasheet +// ECMA-147 +// ECMA-100 + +/// Methods and structures for IBM System 3740 floppy decoding +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +[SuppressMessage("ReSharper", "UnusedType.Global")] +public static class System3740 +{ +#region Nested type: AddressMark + + /// Sector address mark for IBM System 3740 floppies, contains sync word + public struct AddressMark + { + /// 6 bytes set to 0 + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] + public byte[] zero; + /// Set to + public IBMIdType type; + /// Track number + public byte track; + /// Side number + public byte side; + /// Sector number + public byte sector; + /// + /// + /// + public IBMSectorSizeCode sectorSize; + /// CRC16 from to end of + public ushort crc; + } + +#endregion + +#region Nested type: DataBlock + + /// Sector data block for IBM System 3740 floppies + public struct DataBlock + { + /// 12 bytes set to 0 + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] + public byte[] zero; + /// Set to or to + public IBMIdType type; + /// User data + public byte[] data; + /// CRC16 from to end of + public ushort crc; + } + +#endregion + +#region Nested type: Sector + + /// Raw demodulated format for IBM System 3740 floppies + public struct Sector + { + /// Sector address mark + public AddressMark addressMark; + /// 11 bytes set to 0xFF + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)] + public byte[] innerGap; + /// Sector data block + public DataBlock dataBlock; + /// Variable bytes set to 0xFF + public byte[] outerGap; + } + +#endregion + +#region Nested type: Track + + /// Track format for IBM System 3740 floppy + public struct Track + { + /// Start of track + public TrackPreamble trackStart; + /// Track sectors + public Sector[] sectors; + /// Undefined size + public byte[] gap; + } + +#endregion + +#region Nested type: TrackPreamble + + /// Start of IBM PC FM floppy track + public struct TrackPreamble + { + /// Gap from index pulse, 80 bytes set to 0xFF + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)] + public byte[] gap; + /// 6 bytes set to 0x00 + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] + public byte[] zero; + /// Set to + public IBMIdType type; + /// Gap until first sector, 26 bytes to 0xFF + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 26)] + public byte[] gap1; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/LisaTag.cs b/Aaru.Decoders/LisaTag.cs new file mode 100644 index 000000000..e27920950 --- /dev/null +++ b/Aaru.Decoders/LisaTag.cs @@ -0,0 +1,521 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : LisaTag.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes Apple Lisa tags. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using Aaru.Helpers; + +namespace Aaru.Decoders; + +/// Represents a Lisa Office 7/7 sector tag +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "StructMemberCanBeMadeReadOnly")] +public static class LisaTag +{ + /// Decodes tag from a 3.5" Sony micro-floppy + /// Byte array containing raw tag data + /// Decoded tag in Sony's format + public static SonyTag? DecodeSonyTag(byte[] tag) + { + if(tag is not { Length: 12 }) + return null; + + var snTag = new SonyTag + { + Version = BigEndianBitConverter.ToUInt16(tag, 0), + Kind = (byte)((tag[2] & 0xC0) >> 6), + Reserved = (byte)(tag[2] & 0x3F), + Volume = tag[3], + FileId = BigEndianBitConverter.ToInt16(tag, 4), + RelPage = BigEndianBitConverter.ToUInt16(tag, 6), + NextBlock = (ushort)(BigEndianBitConverter.ToUInt16(tag, 8) & 0x7FF), + PrevBlock = (ushort)(BigEndianBitConverter.ToUInt16(tag, 10) & 0x7FF) + }; + + snTag.IsLast = snTag.NextBlock == 0x7FF; + snTag.IsFirst = snTag.PrevBlock == 0x7FF; + + return snTag; + } + + /// Decodes tag from a Profile + /// Byte array containing raw tag data + /// Decoded tag in Profile's format + public static ProfileTag? DecodeProfileTag(byte[] tag) + { + if(tag is not { Length: 20 }) + return null; + + var phTag = new ProfileTag(); + + var tmp = new byte[4]; + + phTag.Version = BigEndianBitConverter.ToUInt16(tag, 0); + phTag.Kind = (byte)((tag[2] & 0xC0) >> 6); + phTag.Reserved = (byte)(tag[2] & 0x3F); + phTag.Volume = tag[3]; + phTag.FileId = BigEndianBitConverter.ToInt16(tag, 4); + phTag.ValidChk |= (tag[6] & 0x80) == 0x80; + phTag.UsedBytes = (ushort)(BigEndianBitConverter.ToUInt16(tag, 6) & 0x7FFF); + + tmp[0] = 0x00; + tmp[1] = tag[8]; + tmp[2] = tag[9]; + tmp[3] = tag[10]; + phTag.AbsPage = BigEndianBitConverter.ToUInt32(tmp, 0); + + phTag.Checksum = tag[11]; + phTag.RelPage = BigEndianBitConverter.ToUInt16(tag, 12); + + tmp[0] = 0x00; + tmp[1] = tag[14]; + tmp[2] = tag[15]; + tmp[3] = tag[16]; + phTag.NextBlock = BigEndianBitConverter.ToUInt32(tmp, 0); + + tmp[0] = 0x00; + tmp[1] = tag[17]; + tmp[2] = tag[18]; + tmp[3] = tag[19]; + phTag.PrevBlock = BigEndianBitConverter.ToUInt32(tmp, 0); + + phTag.IsLast = phTag.NextBlock == 0xFFFFFF; + phTag.IsFirst = phTag.PrevBlock == 0xFFFFFF; + + return phTag; + } + + /// Decodes tag from a Priam + /// Byte array containing raw tag data + /// Decoded tag in Priam's format + public static PriamTag? DecodePriamTag(byte[] tag) + { + if(tag is not { Length: 24 }) + return null; + + var pmTag = new PriamTag(); + + var tmp = new byte[4]; + + pmTag.Version = BigEndianBitConverter.ToUInt16(tag, 0); + pmTag.Kind = (byte)((tag[2] & 0xC0) >> 6); + pmTag.Reserved = (byte)(tag[2] & 0x3F); + pmTag.Volume = tag[3]; + pmTag.FileId = BigEndianBitConverter.ToInt16(tag, 4); + pmTag.ValidChk |= (tag[6] & 0x80) == 0x80; + pmTag.UsedBytes = (ushort)(BigEndianBitConverter.ToUInt16(tag, 6) & 0x7FFF); + + tmp[0] = 0x00; + tmp[1] = tag[8]; + tmp[2] = tag[9]; + tmp[3] = tag[10]; + pmTag.AbsPage = BigEndianBitConverter.ToUInt32(tmp, 0); + + pmTag.Checksum = tag[11]; + pmTag.RelPage = BigEndianBitConverter.ToUInt16(tag, 12); + + tmp[0] = 0x00; + tmp[1] = tag[14]; + tmp[2] = tag[15]; + tmp[3] = tag[16]; + pmTag.NextBlock = BigEndianBitConverter.ToUInt32(tmp, 0); + + tmp[0] = 0x00; + tmp[1] = tag[17]; + tmp[2] = tag[18]; + tmp[3] = tag[19]; + pmTag.PrevBlock = BigEndianBitConverter.ToUInt32(tmp, 0); + + pmTag.DiskSize = BigEndianBitConverter.ToUInt32(tag, 20); + + pmTag.IsLast = pmTag.NextBlock == 0xFFFFFF; + pmTag.IsFirst = pmTag.PrevBlock == 0xFFFFFF; + + return pmTag; + } + + /// Decodes tag from any known format + /// Byte array containing raw tag data + /// Decoded tag in Priam's format + public static PriamTag? DecodeTag(byte[] tag) + { + if(tag == null) + return null; + + PriamTag pmTag; + + switch(tag.Length) + { + case 12: + SonyTag? snTag = DecodeSonyTag(tag); + + if(snTag == null) + return null; + + pmTag = new PriamTag + { + AbsPage = 0, + Checksum = 0, + DiskSize = 0, + FileId = snTag.Value.FileId, + Kind = snTag.Value.Kind, + NextBlock = snTag.Value.NextBlock, + PrevBlock = snTag.Value.PrevBlock, + RelPage = snTag.Value.RelPage, + Reserved = snTag.Value.Reserved, + UsedBytes = 0, + ValidChk = false, + Version = snTag.Value.Version, + Volume = snTag.Value.Volume, + IsFirst = snTag.Value.IsFirst, + IsLast = snTag.Value.IsLast + }; + + return pmTag; + case 20: + ProfileTag? phTag = DecodeProfileTag(tag); + + if(phTag == null) + return null; + + pmTag = new PriamTag + { + AbsPage = phTag.Value.AbsPage, + Checksum = phTag.Value.Checksum, + DiskSize = 0, + FileId = phTag.Value.FileId, + Kind = phTag.Value.Kind, + NextBlock = phTag.Value.NextBlock, + PrevBlock = phTag.Value.PrevBlock, + RelPage = phTag.Value.RelPage, + Reserved = phTag.Value.Reserved, + UsedBytes = phTag.Value.UsedBytes, + ValidChk = phTag.Value.ValidChk, + Version = phTag.Value.Version, + Volume = phTag.Value.Volume, + IsFirst = phTag.Value.IsFirst, + IsLast = phTag.Value.IsLast + }; + + return pmTag; + case 24: + return DecodePriamTag(tag); + default: + return null; + } + } + +#region Nested type: PriamTag + + /// LisaOS tag as stored on Priam DataTower disks (24 bytes) + public struct PriamTag + { + /// 0x00, Lisa OS version number + public ushort Version; + /// 0x02 bits 7 to 6, kind of info in this block + public byte Kind; + /// 0x02 bits 5 to 0, reserved + public byte Reserved; + /// 0x03, disk volume number + public byte Volume; + /// 0x04, file ID + public short FileId; + /// 0x06 bit 7, checksum valid? + public bool ValidChk; + /// 0x06 bits 6 to 0, used bytes in block + public ushort UsedBytes; + /// 0x08, 3 bytes, absolute page number + public uint AbsPage; + /// 0x0B, checksum of data + public byte Checksum; + /// 0x0C, relative page number + public ushort RelPage; + /// 0x0E, 3 bytes, next block, 0xFFFFFF if it's last block + public uint NextBlock; + /// 0x11, 3 bytes, previous block, 0xFFFFFF if it's first block + public uint PrevBlock; + /// 0x14, disk size + public uint DiskSize; + + /// On-memory value for easy first block search. + public bool IsFirst; + /// On-memory value for easy last block search. + public bool IsLast; + + /// Converts this tag to Apple Profile format + public ProfileTag ToProfile() => new() + { + AbsPage = AbsPage, + Checksum = Checksum, + FileId = FileId, + IsFirst = IsFirst, + IsLast = IsLast, + Kind = Kind, + NextBlock = IsLast ? 0xFFFFFF : NextBlock & 0xFFFFFF, + PrevBlock = IsFirst ? 0xFFFFFF : PrevBlock & 0xFFFFFF, + RelPage = RelPage, + UsedBytes = UsedBytes, + ValidChk = ValidChk, + Version = Version, + Volume = Volume + }; + + /// Converts this tag to Sony format + public SonyTag ToSony() => new() + { + FileId = FileId, + IsFirst = IsFirst, + IsLast = IsLast, + Kind = Kind, + NextBlock = (ushort)(IsLast ? 0x7FF : NextBlock & 0x7FF), + PrevBlock = (ushort)(IsFirst ? 0x7FF : PrevBlock & 0x7FF), + RelPage = RelPage, + Version = Version, + Volume = Volume + }; + + /// Gets a byte array representation of this tag + public byte[] GetBytes() + { + var tagBytes = new byte[24]; + + byte[] tmp = BigEndianBitConverter.GetBytes(Version); + Array.Copy(tmp, 0, tagBytes, 0, 2); + tagBytes[2] = (byte)(Kind << 6); + tagBytes[3] = Volume; + tmp = BigEndianBitConverter.GetBytes(FileId); + Array.Copy(tmp, 0, tagBytes, 4, 2); + tmp = BigEndianBitConverter.GetBytes((ushort)(UsedBytes & 0x7FFF)); + Array.Copy(tmp, 0, tagBytes, 6, 2); + + if(ValidChk) + tagBytes[6] += 0x80; + + tmp = BigEndianBitConverter.GetBytes(AbsPage); + Array.Copy(tmp, 1, tagBytes, 8, 3); + tagBytes[11] = Checksum; + tmp = BigEndianBitConverter.GetBytes(RelPage); + Array.Copy(tmp, 0, tagBytes, 12, 2); + tmp = BigEndianBitConverter.GetBytes(IsLast ? 0xFFFFFF : NextBlock); + Array.Copy(tmp, 1, tagBytes, 14, 3); + tmp = BigEndianBitConverter.GetBytes(IsFirst ? 0xFFFFFF : PrevBlock); + Array.Copy(tmp, 1, tagBytes, 17, 3); + tmp = BigEndianBitConverter.GetBytes(DiskSize); + Array.Copy(tmp, 0, tagBytes, 20, 4); + + return tagBytes; + } + } + +#endregion + +#region Nested type: ProfileTag + + /// LisaOS tag as stored on Apple Profile and FileWare disks (20 bytes) + public struct ProfileTag + { + /// 0x00, Lisa OS version number + public ushort Version; + /// 0x02 bits 7 to 6, kind of info in this block + public byte Kind; + /// 0x02 bits 5 to 0, reserved + public byte Reserved; + /// 0x03, disk volume number + public byte Volume; + /// 0x04, file ID + public short FileId; + /// 0x06 bit 7, checksum valid? + public bool ValidChk; + /// 0x06 bits 6 to 0, used bytes in block + public ushort UsedBytes; + /// 0x08, 3 bytes, absolute page number + public uint AbsPage; + /// 0x0B, checksum of data + public byte Checksum; + /// 0x0C, relative page number + public ushort RelPage; + /// 0x0E, 3 bytes, next block, 0xFFFFFF if it's last block + public uint NextBlock; + /// 0x11, 3 bytes, previous block, 0xFFFFFF if it's first block + public uint PrevBlock; + + /// On-memory value for easy first block search. + public bool IsFirst; + /// On-memory value for easy last block search. + public bool IsLast; + + /// Converts this tag to Priam DataTower format + public PriamTag ToPriam() => new() + { + AbsPage = AbsPage, + Checksum = Checksum, + FileId = FileId, + IsFirst = IsFirst, + IsLast = IsLast, + Kind = Kind, + NextBlock = IsLast ? 0xFFFFFF : NextBlock & 0xFFFFFF, + PrevBlock = IsFirst ? 0xFFFFFF : PrevBlock & 0xFFFFFF, + RelPage = RelPage, + UsedBytes = UsedBytes, + ValidChk = ValidChk, + Version = Version, + Volume = Volume + }; + + /// Converts this tag to Sony format + public SonyTag ToSony() => new() + { + FileId = FileId, + IsFirst = IsFirst, + IsLast = IsLast, + Kind = Kind, + NextBlock = (ushort)NextBlock, + PrevBlock = (ushort)PrevBlock, + RelPage = RelPage, + Version = Version, + Volume = Volume + }; + + /// Gets a byte array representation of this tag + public byte[] GetBytes() + { + var tagBytes = new byte[20]; + + byte[] tmp = BigEndianBitConverter.GetBytes(Version); + Array.Copy(tmp, 0, tagBytes, 0, 2); + tagBytes[2] = (byte)(Kind << 6); + tagBytes[3] = Volume; + tmp = BigEndianBitConverter.GetBytes(FileId); + Array.Copy(tmp, 0, tagBytes, 4, 2); + tmp = BigEndianBitConverter.GetBytes((ushort)(UsedBytes & 0x7FFF)); + Array.Copy(tmp, 0, tagBytes, 6, 2); + + if(ValidChk) + tagBytes[6] += 0x80; + + tmp = BigEndianBitConverter.GetBytes(AbsPage); + Array.Copy(tmp, 1, tagBytes, 8, 3); + tagBytes[11] = Checksum; + tmp = BigEndianBitConverter.GetBytes(RelPage); + Array.Copy(tmp, 0, tagBytes, 12, 2); + tmp = BigEndianBitConverter.GetBytes(IsLast ? 0xFFFFFF : NextBlock); + Array.Copy(tmp, 1, tagBytes, 14, 3); + tmp = BigEndianBitConverter.GetBytes(IsFirst ? 0xFFFFFF : PrevBlock); + Array.Copy(tmp, 1, tagBytes, 17, 3); + + return tagBytes; + } + } + +#endregion + +#region Nested type: SonyTag + + /// LisaOS tag as stored on Apple Sony disks (12 bytes) + public struct SonyTag + { + /// 0x00, Lisa OS version number + public ushort Version; + /// 0x02 bits 7 to 6, kind of info in this block + public byte Kind; + /// 0x02 bits 5 to 0, reserved + public byte Reserved; + /// 0x03, disk volume number + public byte Volume; + /// 0x04, file ID + public short FileId; + /// 0x06, relative page number + public ushort RelPage; + /// 0x08, 3 bytes, next block, 0x7FF if it's last block, 0x8000 set if block is valid + public ushort NextBlock; + /// 0x0A, 3 bytes, previous block, 0x7FF if it's first block + public ushort PrevBlock; + + /// On-memory value for easy first block search. + public bool IsFirst; + /// On-memory value for easy last block search. + public bool IsLast; + + /// Converts this tag to Apple Profile format + public ProfileTag ToProfile() => new() + { + FileId = FileId, + IsFirst = IsFirst, + IsLast = IsLast, + Kind = Kind, + NextBlock = (uint)(IsLast ? 0xFFFFFF : NextBlock & 0xFFFFFF), + PrevBlock = (uint)(IsFirst ? 0xFFFFFF : PrevBlock & 0xFFFFFF), + RelPage = RelPage, + Version = Version, + Volume = Volume + }; + + /// Converts this tag to Priam DataTower format + public PriamTag ToPriam() => new() + { + FileId = FileId, + IsFirst = IsFirst, + IsLast = IsLast, + Kind = Kind, + NextBlock = (uint)(IsLast ? 0xFFFFFF : NextBlock & 0xFFFFFF), + PrevBlock = (uint)(IsFirst ? 0xFFFFFF : PrevBlock & 0xFFFFFF), + RelPage = RelPage, + Version = Version, + Volume = Volume + }; + + /// Gets a byte array representation of this tag + public byte[] GetBytes() + { + var tagBytes = new byte[12]; + + byte[] tmp = BigEndianBitConverter.GetBytes(Version); + Array.Copy(tmp, 0, tagBytes, 0, 2); + tagBytes[2] = (byte)(Kind << 6); + tagBytes[3] = Volume; + tmp = BigEndianBitConverter.GetBytes(FileId); + Array.Copy(tmp, 0, tagBytes, 4, 2); + tmp = BigEndianBitConverter.GetBytes(RelPage); + Array.Copy(tmp, 0, tagBytes, 6, 2); + tmp = BigEndianBitConverter.GetBytes(IsLast ? 0x7FF : NextBlock); + Array.Copy(tmp, 1, tagBytes, 8, 2); + tmp = BigEndianBitConverter.GetBytes(IsFirst ? 0x7FF : PrevBlock); + Array.Copy(tmp, 1, tagBytes, 10, 2); + + return tagBytes; + } + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/Localization/Localization.Designer.cs b/Aaru.Decoders/Localization/Localization.Designer.cs new file mode 100644 index 000000000..f9fdfb43d --- /dev/null +++ b/Aaru.Decoders/Localization/Localization.Designer.cs @@ -0,0 +1,29039 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Aaru.Decoders { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Localization { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Localization() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Aaru.Decoders.Localization.Localization", typeof(Localization).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to DEVICE RESET is supported. + /// + internal static string _ { + get { + return ResourceManager.GetString("", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} hours shall be between the start of a background scan operation and the next. + /// + internal static string _0__hours_shall_be_between_the_start_of_a_background_scan_operation_and_the_next { + get { + return ResourceManager.GetString("_0__hours_shall_be_between_the_start_of_a_background_scan_operation_and_the_next", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} additional partitions defined. + /// + internal static string _0_additional_partitions_defined { + get { + return ResourceManager.GetString("_0_additional_partitions_defined", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} allocated spare blocks. + /// + internal static string _0_allocated_spare_blocks { + get { + return ResourceManager.GetString("_0_allocated_spare_blocks", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} allocated supplementary spare blocks. + /// + internal static string _0_allocated_supplementary_spare_blocks { + get { + return ResourceManager.GetString("_0_allocated_supplementary_spare_blocks", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} assigned tracks on the disc. + /// + internal static string _0_assigned_tracks_on_the_disc { + get { + return ResourceManager.GetString("_0_assigned_tracks_on_the_disc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} blocks are {1} and are {2} bytes each. + /// + internal static string _0_blocks_are_1_and_are_2_bytes_each { + get { + return ResourceManager.GetString("_0_blocks_are_1_and_are_2_bytes_each", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} blocks are {1} and have a variable length. + /// + internal static string _0_blocks_are_1_and_have_a_variable_length { + get { + return ResourceManager.GetString("_0_blocks_are_1_and_have_a_variable_length", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} blocks are {1} bytes each. + /// + internal static string _0_blocks_are_1_bytes_each { + get { + return ResourceManager.GetString("_0_blocks_are_1_bytes_each", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} blocks conform to {1} and are {2} bytes each. + /// + internal static string _0_blocks_conform_to_1_and_are_2_bytes_each { + get { + return ResourceManager.GetString("_0_blocks_conform_to_1_and_are_2_bytes_each", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} blocks conform to {1} and have a variable length. + /// + internal static string _0_blocks_conform_to_1_and_have_a_variable_length { + get { + return ResourceManager.GetString("_0_blocks_conform_to_1_and_have_a_variable_length", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} blocks have {1} and are {2} bytes each. + /// + internal static string _0_blocks_have_1_and_are_2_bytes_each { + get { + return ResourceManager.GetString("_0_blocks_have_1_and_are_2_bytes_each", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} blocks have a variable length. + /// + internal static string _0_blocks_have_a_variable_length { + get { + return ResourceManager.GetString("_0_blocks_have_a_variable_length", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} bytes count limit for ATAPI. + /// + internal static string _0_bytes_count_limit_for_ATAPI { + get { + return ResourceManager.GetString("_0_bytes_count_limit_for_ATAPI", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} bytes maximum can be transferred before disconnecting. + /// + internal static string _0_bytes_maximum_can_be_transferred_before_disconnecting { + get { + return ResourceManager.GetString("_0_bytes_maximum_can_be_transferred_before_disconnecting", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} bytes maximum can be transferred for a command along with the disconnect command. + /// + internal static string _0_bytes_maximum_can_be_transferred_for_a_command_along_with_the_disconnect_command { + get { + return ResourceManager.GetString("_0_bytes_maximum_can_be_transferred_for_a_command_along_with_the_disconnect_comma" + + "nd", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} bytes per logical block. + /// + internal static string _0_bytes_per_logical_block { + get { + return ResourceManager.GetString("_0_bytes_per_logical_block", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} Bytes per physical sector. + /// + internal static string _0_Bytes_per_physical_sector { + get { + return ResourceManager.GetString("_0_Bytes_per_physical_sector", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} bytes per sector. + /// + internal static string _0_bytes_per_sector { + get { + return ResourceManager.GetString("_0_bytes_per_sector", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} bytes per unformatted sector. + /// + internal static string _0_bytes_per_unformatted_sector { + get { + return ResourceManager.GetString("_0_bytes_per_unformatted_sector", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} bytes per unformatted track. + /// + internal static string _0_bytes_per_unformatted_track { + get { + return ResourceManager.GetString("_0_bytes_per_unformatted_track", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} current appendable tracks on the disc. + /// + internal static string _0_current_appendable_tracks_on_the_disc { + get { + return ResourceManager.GetString("_0_current_appendable_tracks_on_the_disc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} cylinders. + /// + internal static string _0_cylinders { + get { + return ResourceManager.GetString("_0_cylinders", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} depth of queue maximum. + /// + internal static string _0_depth_of_queue_maximum { + get { + return ResourceManager.GetString("_0_depth_of_queue_maximum", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} firmware sectors correctly programmed. + /// + internal static string _0_firmware_sectors_correctly_programmed { + get { + return ResourceManager.GetString("_0_firmware_sectors_correctly_programmed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} format layers recognized. + /// + internal static string _0_format_layers_recognized { + get { + return ResourceManager.GetString("_0_format_layers_recognized", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} free spare blocks. + /// + internal static string _0_free_spare_blocks { + get { + return ResourceManager.GetString("_0_free_spare_blocks", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} heads. + /// + internal static string _0_heads { + get { + return ResourceManager.GetString("_0_heads", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} KiB of dual ported multi sector buffer. + /// + internal static string _0_KiB_of_dual_ported_multi_sector_buffer { + get { + return ResourceManager.GetString("_0_KiB_of_dual_ported_multi_sector_buffer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} KiB of dual ported multi sector buffer with read caching. + /// + internal static string _0_KiB_of_dual_ported_multi_sector_buffer_with_read_caching { + get { + return ResourceManager.GetString("_0_KiB_of_dual_ported_multi_sector_buffer_with_read_caching", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} KiB of single ported single sector buffer. + /// + internal static string _0_KiB_of_single_ported_single_sector_buffer { + get { + return ResourceManager.GetString("_0_KiB_of_single_ported_single_sector_buffer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} KiB of unknown type {1} buffer. + /// + internal static string _0_KiB_of_unknown_type_1_buffer { + get { + return ResourceManager.GetString("_0_KiB_of_unknown_type_1_buffer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} logical blocks per media readable unit. + /// + internal static string _0_logical_blocks_per_media_readable_unit { + get { + return ResourceManager.GetString("_0_logical_blocks_per_media_readable_unit", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} logical blocks per media writable unit. + /// + internal static string _0_logical_blocks_per_media_writable_unit { + get { + return ResourceManager.GetString("_0_logical_blocks_per_media_writable_unit", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} maximum additional partitions. + /// + internal static string _0_maximum_additional_partitions { + get { + return ResourceManager.GetString("_0_maximum_additional_partitions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} maximum possible appendable tracks on the disc. + /// + internal static string _0_maximum_possible_appendable_tracks_on_the_disc { + get { + return ResourceManager.GetString("_0_maximum_possible_appendable_tracks_on_the_disc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} maximum possible tracks on the disc. + /// + internal static string _0_maximum_possible_tracks_on_the_disc { + get { + return ResourceManager.GetString("_0_maximum_possible_tracks_on_the_disc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} media blocks are required for the binding nonce. + /// + internal static string _0_media_blocks_are_required_for_the_binding_nonce { + get { + return ResourceManager.GetString("_0_media_blocks_are_required_for_the_binding_nonce", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} microseconds of interseek delay for ISO-7779 acoustic testing. + /// + internal static string _0_microseconds_of_interseek_delay_for_ISO_7779_acoustic_testing { + get { + return ResourceManager.GetString("_0_microseconds_of_interseek_delay_for_ISO_7779_acoustic_testing", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} minutes to complete enhanced secure erase. + /// + internal static string _0_minutes_to_complete_enhanced_secure_erase { + get { + return ResourceManager.GetString("_0_minutes_to_complete_enhanced_secure_erase", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} minutes to complete secure erase. + /// + internal static string _0_minutes_to_complete_secure_erase { + get { + return ResourceManager.GetString("_0_minutes_to_complete_secure_erase", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} ms before attempting asynchronous event notifications after initialization. + /// + internal static string _0_ms_before_attempting_asynchronous_event_notifications_after_initialization { + get { + return ResourceManager.GetString("_0_ms_before_attempting_asynchronous_event_notifications_after_initialization", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} ns. typical to clear BSY bit from receipt of SERVICE. + /// + internal static string _0_ns_typical_to_clear_BSY_bit_from_receipt_of_SERVICE { + get { + return ResourceManager.GetString("_0_ns_typical_to_clear_BSY_bit_from_receipt_of_SERVICE", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} ns. typical to release bus from receipt of PACKET. + /// + internal static string _0_ns_typical_to_release_bus_from_receipt_of_PACKET { + get { + return ResourceManager.GetString("_0_ns_typical_to_release_bus_from_receipt_of_PACKET", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} physical sectors per track. + /// + internal static string _0_physical_sectors_per_track { + get { + return ResourceManager.GetString("_0_physical_sectors_per_track", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} ratio of buffer that shall be empty prior to attempting a reselection. + /// + internal static string _0_ratio_of_buffer_that_shall_be_empty_prior_to_attempting_a_reselection { + get { + return ResourceManager.GetString("_0_ratio_of_buffer_that_shall_be_empty_prior_to_attempting_a_reselection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} ratio of buffer that shall be full prior to attempting a reselection. + /// + internal static string _0_ratio_of_buffer_that_shall_be_full_prior_to_attempting_a_reselection { + get { + return ResourceManager.GetString("_0_ratio_of_buffer_that_shall_be_full_prior_to_attempting_a_reselection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} remaining POW reallocation map entries. + /// + internal static string _0_remaining_POW_reallocation_map_entries { + get { + return ResourceManager.GetString("_0_remaining_POW_reallocation_map_entries", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} remaining POW replacements. + /// + internal static string _0_remaining_POW_replacements { + get { + return ResourceManager.GetString("_0_remaining_POW_replacements", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} remaining POW updates. + /// + internal static string _0_remaining_POW_updates { + get { + return ResourceManager.GetString("_0_remaining_POW_updates", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} seconds to complete extended self-test. + /// + internal static string _0_seconds_to_complete_extended_self_test { + get { + return ResourceManager.GetString("_0_seconds_to_complete_extended_self_test", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} sectors between last block of a cylinder and first block of the next one. + /// + internal static string _0_sectors_between_last_block_of_a_cylinder_and_first_block_of_the_next_one { + get { + return ResourceManager.GetString("_0_sectors_between_last_block_of_a_cylinder_and_first_block_of_the_next_one", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} sectors between last block of one track and first block of the next. + /// + internal static string _0_sectors_between_last_block_of_one_track_and_first_block_of_the_next { + get { + return ResourceManager.GetString("_0_sectors_between_last_block_of_one_track_and_first_block_of_the_next", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} sectors for Write/Read/Verify mode 3. + /// + internal static string _0_sectors_for_Write_Read_Verify_mode_three { + get { + return ResourceManager.GetString("_0_sectors_for_Write_Read_Verify_mode_three", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} sectors for Write/Read/Verify mode 2. + /// + internal static string _0_sectors_for_Write_Read_Verify_mode_two { + get { + return ResourceManager.GetString("_0_sectors_for_Write_Read_Verify_mode_two", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} sectors in 28-bit LBA mode. + /// + internal static string _0_sectors_in_28_bit_LBA_mode { + get { + return ResourceManager.GetString("_0_sectors_in_28_bit_LBA_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} sectors in 48-bit LBA mode. + /// + internal static string _0_sectors_in_48_bit_LBA_mode { + get { + return ResourceManager.GetString("_0_sectors_in_48_bit_LBA_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} sectors in card. + /// + internal static string _0_sectors_in_card { + get { + return ResourceManager.GetString("_0_sectors_in_card", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} sectors per track. + /// + internal static string _0_sectors_per_track { + get { + return ResourceManager.GetString("_0_sectors_per_track", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} sectors per zone that shall be reserved for defect handling. + /// + internal static string _0_sectors_per_zone_that_shall_be_reserved_for_defect_handling { + get { + return ResourceManager.GetString("_0_sectors_per_zone_that_shall_be_reserved_for_defect_handling", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} tracks per LUN that shall be reserved for defect handling. + /// + internal static string _0_tracks_per_LUN_that_shall_be_reserved_for_defect_handling { + get { + return ResourceManager.GetString("_0_tracks_per_LUN_that_shall_be_reserved_for_defect_handling", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} tracks per zone that shall be reserved for defect handling. + /// + internal static string _0_tracks_per_zone_that_shall_be_reserved_for_defect_handling { + get { + return ResourceManager.GetString("_0_tracks_per_zone_that_shall_be_reserved_for_defect_handling", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} tracks per zone to use in dividing the capacity for the purpose of allocating alternate sectors. + /// + internal static string _0_tracks_per_zone_to_use_in_dividing_the_capacity_for_the_purpose_of_allocating_alternate_sectors { + get { + return ResourceManager.GetString("_0_tracks_per_zone_to_use_in_dividing_the_capacity_for_the_purpose_of_allocating_" + + "alternate_sectors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} unused primary spare blocks. + /// + internal static string _0_unused_primary_spare_blocks { + get { + return ResourceManager.GetString("_0_unused_primary_spare_blocks", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} unused supplementary spare blocks. + /// + internal static string _0_unused_supplementary_spare_blocks { + get { + return ResourceManager.GetString("_0_unused_supplementary_spare_blocks", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} wraps. + /// + internal static string _0_wraps { + get { + return ResourceManager.GetString("_0_wraps", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} µs allowed to use the bus before disconnecting, if granted the privilege and not restricted. + /// + internal static string _0_µs_allowed_to_use_the_bus_before_disconnecting_if_granted_the_privilege_and_not_restricted { + get { + return ResourceManager.GetString("_0_µs_allowed_to_use_the_bus_before_disconnecting_if_granted_the_privilege_and_no" + + "t_restricted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} µs maximum permitted to assert BSY without a REQ/ACK handshake. + /// + internal static string _0_µs_maximum_permitted_to_assert_BSY_without_a_REQ_ACK_handshake { + get { + return ResourceManager.GetString("_0_µs_maximum_permitted_to_assert_BSY_without_a_REQ_ACK_handshake", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} µs maximum permitted wait after releasing the bus before attempting reselection. + /// + internal static string _0_µs_maximum_permitted_wait_after_releasing_the_bus_before_attempting_reselection { + get { + return ResourceManager.GetString("_0_µs_maximum_permitted_wait_after_releasing_the_bus_before_attempting_reselectio" + + "n", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 120mm. + /// + internal static string _120mm { + get { + return ResourceManager.GetString("_120mm", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 13262 flux transitions per radian. + /// + internal static string _13262_ftprad { + get { + return ResourceManager.GetString("_13262_ftprad", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 15916 flux transitions per radian. + /// + internal static string _15916_ftprad { + get { + return ResourceManager.GetString("_15916_ftprad", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 1997 or 2013. + /// + internal static string _1997_or_2013 { + get { + return ResourceManager.GetString("_1997_or_2013", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 1998 or 2014. + /// + internal static string _1998_or_2014 { + get { + return ResourceManager.GetString("_1998_or_2014", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 1999 or 2015. + /// + internal static string _1999_or_2015 { + get { + return ResourceManager.GetString("_1999_or_2015", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 2000 or 2016. + /// + internal static string _2000_or_2016 { + get { + return ResourceManager.GetString("_2000_or_2016", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 2001 or 2017. + /// + internal static string _2001_or_2017 { + get { + return ResourceManager.GetString("_2001_or_2017", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 2002 or 2018. + /// + internal static string _2002_or_2018 { + get { + return ResourceManager.GetString("_2002_or_2018", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 2003 or 2019. + /// + internal static string _2003_or_2019 { + get { + return ResourceManager.GetString("_2003_or_2019", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 2004 or 2020. + /// + internal static string _2004_or_2020 { + get { + return ResourceManager.GetString("_2004_or_2020", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 2005 or 2021. + /// + internal static string _2005_or_2021 { + get { + return ResourceManager.GetString("_2005_or_2021", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 2006 or 2022. + /// + internal static string _2006_or_2022 { + get { + return ResourceManager.GetString("_2006_or_2022", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 2007 or 2023. + /// + internal static string _2007_or_2023 { + get { + return ResourceManager.GetString("_2007_or_2023", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 2008 or 2024. + /// + internal static string _2008_or_2024 { + get { + return ResourceManager.GetString("_2008_or_2024", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 2009 or 2025. + /// + internal static string _2009_or_2025 { + get { + return ResourceManager.GetString("_2009_or_2025", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 28-bit LBA is supported. + /// + internal static string _28_bit_LBA_is_supported { + get { + return ResourceManager.GetString("_28_bit_LBA_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 48-bit LBA is supported. + /// + internal static string _48_bit_LBA_is_supported { + get { + return ResourceManager.GetString("_48_bit_LBA_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 48-bit LBA is supported and enabled. + /// + internal static string _48_bit_LBA_is_supported_and_enabled { + get { + return ResourceManager.GetString("_48_bit_LBA_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 4-byte tag, user data plus auxiliary data. + /// + internal static string _4byte_tag_user_data_plus_auxiliary_data { + get { + return ResourceManager.GetString("_4byte_tag_user_data_plus_auxiliary_data", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 60mm. + /// + internal static string _60mm { + get { + return ResourceManager.GetString("_60mm", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 7958 flux transitions per radian. + /// + internal static string _7958_ftprad { + get { + return ResourceManager.GetString("_7958_ftprad", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 80mm. + /// + internal static string _80mm { + get { + return ResourceManager.GetString("_80mm", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to (active) . + /// + internal static string _active_ { + get { + return ResourceManager.GetString("_active_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to a combination of read-only and erasable optical. + /// + internal static string a_combination_of_read_only_and_erasable_optical { + get { + return ResourceManager.GetString("a_combination_of_read_only_and_erasable_optical", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to a combination of write-once and erasable optical. + /// + internal static string a_combination_of_write_once_and_erasable_optical { + get { + return ResourceManager.GetString("a_combination_of_write_once_and_erasable_optical", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to A maximum of {0} blocks will be pre-fetched. + /// + internal static string A_maximum_of_0_blocks_will_be_pre_fetched { + get { + return ResourceManager.GetString("A_maximum_of_0_blocks_will_be_pre_fetched", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to A maximum of {0} blocks will be pre-fetched even if it is commanded to pre-fetch more. + /// + internal static string A_maximum_of_0_blocks_will_be_pre_fetched_even_if_it_is_commanded_to_pre_fetch_more { + get { + return ResourceManager.GetString("A_maximum_of_0_blocks_will_be_pre_fetched_even_if_it_is_commanded_to_pre_fetch_mo" + + "re", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to A maximum of {0} ms are allowed to remain busy. + /// + internal static string A_maximum_of_0_ms_are_allowed_to_remain_busy { + get { + return ResourceManager.GetString("A_maximum_of_0_ms_are_allowed_to_remain_busy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to A maximum of {0} sectors can be transferred per interrupt on READ/WRITE MULTIPLE. + /// + internal static string A_maximum_of_0_sectors_can_be_transferred_per_interrupt_on_READ_WRITE_MULTIPLE { + get { + return ResourceManager.GetString("A_maximum_of_0_sectors_can_be_transferred_per_interrupt_on_READ_WRITE_MULTIPLE", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to A test informational exception will raise on next timer. + /// + internal static string A_test_informational_exception_will_raise_on_next_timer { + get { + return ResourceManager.GetString("A_test_informational_exception_will_raise_on_next_timer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to A1 value: 0x{0:X6}. + /// + internal static string A1_value_0 { + get { + return ResourceManager.GetString("A1_value_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to A2 value: 0x{0:X6}. + /// + internal static string A2_value_0 { + get { + return ResourceManager.GetString("A2_value_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to A3 value: 0x{0:X6}. + /// + internal static string A3_value_0 { + get { + return ResourceManager.GetString("A3_value_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to AACS Data Keys in hex follows:. + /// + internal static string AACS_Data_Keys_in_hex_follows { + get { + return ResourceManager.GetString("AACS_Data_Keys_in_hex_follows", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to AACS Media Identifier in hex follows:. + /// + internal static string AACS_Media_Identifier_in_hex_follows { + get { + return ResourceManager.GetString("AACS_Media_Identifier_in_hex_follows", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to AACS Media Key Blocks in hex follows:. + /// + internal static string AACS_Media_Key_Blocks_in_hex_follows { + get { + return ResourceManager.GetString("AACS_Media_Key_Blocks_in_hex_follows", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to AACS Media Serial Number in hex follows:. + /// + internal static string AACS_Media_Serial_Number_in_hex_follows { + get { + return ResourceManager.GetString("AACS_Media_Serial_Number_in_hex_follows", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to AACS Volume Identifier in hex follows:. + /// + internal static string AACS_Volume_Identifier_in_hex_follows { + get { + return ResourceManager.GetString("AACS_Volume_Identifier_in_hex_follows", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Abort any write command without protection information. + /// + internal static string Abort_any_write_command_without_protection_information { + get { + return ResourceManager.GetString("Abort_any_write_command_without_protection_information", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Absolute time: {0:D2}:{1:D2}:{2:D2}. + /// + internal static string Absolute_time_0_1_2 { + get { + return ResourceManager.GetString("Absolute_time_0_1_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Absolute time: {3:D2}:{0:D2}:{1:D2}:{2:D2}. + /// + internal static string Absolute_time_3_0_1_2 { + get { + return ResourceManager.GetString("Absolute_time_3_0_1_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Accessible Max Address Configuration is supported. + /// + internal static string Accessible_Max_Address_Configuration_is_supported { + get { + return ResourceManager.GetString("Accessible_Max_Address_Configuration_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Accessible Max Address Configuration is supported and enabled. + /// + internal static string Accessible_Max_Address_Configuration_is_supported_and_enabled { + get { + return ResourceManager.GetString("Accessible_Max_Address_Configuration_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ACS-2 published, ANSI INCITS 482-2012. + /// + internal static string ACS_2_published_ANSI_INCITS_482_2012 { + get { + return ResourceManager.GetString("ACS_2_published_ANSI_INCITS_482_2012", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ACS-2 Revision 2. + /// + internal static string ACS_2_Revision_2 { + get { + return ResourceManager.GetString("ACS_2_Revision_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ACS-2 Revision 3. + /// + internal static string ACS_2_Revision_3 { + get { + return ResourceManager.GetString("ACS_2_Revision_3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ACS-3 Revision 3b. + /// + internal static string ACS_3_Revision_3b { + get { + return ResourceManager.GetString("ACS_3_Revision_3b", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ACS-3 Revision 4. + /// + internal static string ACS_3_Revision_4 { + get { + return ResourceManager.GetString("ACS_3_Revision_4", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ACS-3 Revision 5. + /// + internal static string ACS_3_Revision_5 { + get { + return ResourceManager.GetString("ACS_3_Revision_5", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Active format: {0}. + /// + internal static string Active_format_0 { + get { + return ResourceManager.GetString("Active_format_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Active partition: {0}. + /// + internal static string Active_partition_0 { + get { + return ResourceManager.GetString("Active_partition_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Actual retry count is {0}. + /// + internal static string Actual_retry_count_is_0 { + get { + return ResourceManager.GetString("Actual_retry_count_is_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Adding sector {0} of track {1}. + /// + internal static string Adding_sector_0_of_track_1 { + get { + return ResourceManager.GetString("Adding_sector_0_of_track_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Additional information:. + /// + internal static string Additional_information { + get { + return ResourceManager.GetString("Additional_information", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Additional product ID: {0}. + /// + internal static string Additional_product_ID_0 { + get { + return ResourceManager.GetString("Additional_product_ID_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Address for administrative configuration service: {0}. + /// + internal static string Address_for_administrative_configuration_service_0 { + get { + return ResourceManager.GetString("Address_for_administrative_configuration_service_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Address for code download: {0}. + /// + internal static string Address_for_code_download_0 { + get { + return ResourceManager.GetString("Address_for_code_download_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Address for copy service: {0}. + /// + internal static string Address_for_copy_service_0 { + get { + return ResourceManager.GetString("Address_for_copy_service_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Address for diagnostics: {0}. + /// + internal static string Address_for_diagnostics_0 { + get { + return ResourceManager.GetString("Address_for_diagnostics_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Address for logging: {0}. + /// + internal static string Address_for_logging_0 { + get { + return ResourceManager.GetString("Address_for_logging_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Address for status: {0}. + /// + internal static string Address_for_status_0 { + get { + return ResourceManager.GetString("Address_for_status_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Address for storage configuration service: {0}. + /// + internal static string Address_for_storage_configuration_service_0 { + get { + return ResourceManager.GetString("Address_for_storage_configuration_service_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Address of unknown type {1}: {0}. + /// + internal static string Address_of_unknown_type_1_0 { + get { + return ResourceManager.GetString("Address_of_unknown_type_1_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Address Offset Reserved Area Boot is supported. + /// + internal static string Address_Offset_Reserved_Area_Boot_is_supported { + get { + return ResourceManager.GetString("Address_Offset_Reserved_Area_Boot_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Address Offset Reserved Area Boot is supported and enabled. + /// + internal static string Address_Offset_Reserved_Area_Boot_is_supported_and_enabled { + get { + return ResourceManager.GetString("Address_Offset_Reserved_Area_Boot_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Advanced PIO: . + /// + internal static string Advanced_PIO { + get { + return ResourceManager.GetString("Advanced_PIO", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Advanced Power Management is supported. + /// + internal static string Advanced_Power_Management_is_supported { + get { + return ResourceManager.GetString("Advanced_Power_Management_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Advanced Power Management is supported and enabled with value {0}. + /// + internal static string Advanced_Power_Management_is_supported_and_enabled_with_value_0 { + get { + return ResourceManager.GetString("Advanced_Power_Management_is_supported_and_enabled_with_value_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Affected commands in the task set belonging with the CHECK CONDITION nexus shall be aborted. + /// + internal static string Affected_commands_in_the_task_set_belonging_with_the_CHECK_CONDITION_nexus_shall_be_aborted { + get { + return ResourceManager.GetString("Affected_commands_in_the_task_set_belonging_with_the_CHECK_CONDITION_nexus_shall_" + + "be_aborted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to AIT-1. + /// + internal static string AIT1 { + get { + return ResourceManager.GetString("AIT1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to AIT-2. + /// + internal static string AIT2 { + get { + return ResourceManager.GetString("AIT2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to AIT-3. + /// + internal static string AIT3 { + get { + return ResourceManager.GetString("AIT3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to album. + /// + internal static string album { + get { + return ResourceManager.GetString("album", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Alerts are enabled. + /// + internal static string Alerts_are_enabled { + get { + return ResourceManager.GetString("Alerts_are_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to All available recovery procedures will be used.. + /// + internal static string All_available_recovery_procedures_will_be_used { + get { + return ResourceManager.GetString("All_available_recovery_procedures_will_be_used", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to All data and the response for a command shall be transferred within a single interconnect tenancy. + /// + internal static string All_data_and_the_response_for_a_command_shall_be_transferred_within_a_single_interconnect_tenancy { + get { + return ResourceManager.GetString("All_data_and_the_response_for_a_command_shall_be_transferred_within_a_single_inte" + + "rconnect_tenancy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to All data for a command shall be transferred within a single interconnect tenancy. + /// + internal static string All_data_for_a_command_shall_be_transferred_within_a_single_interconnect_tenancy { + get { + return ResourceManager.GetString("All_data_for_a_command_shall_be_transferred_within_a_single_interconnect_tenancy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to All remaining blocks are {0} and are {1} bytes each. + /// + internal static string All_remaining_blocks_are_0_and_are_1_bytes_each { + get { + return ResourceManager.GetString("All_remaining_blocks_are_0_and_are_1_bytes_each", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to All remaining blocks are {0} and have a variable length. + /// + internal static string All_remaining_blocks_are_0_and_have_a_variable_length { + get { + return ResourceManager.GetString("All_remaining_blocks_are_0_and_have_a_variable_length", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to All remaining blocks are {0} bytes each. + /// + internal static string All_remaining_blocks_are_0_bytes_each { + get { + return ResourceManager.GetString("All_remaining_blocks_are_0_bytes_each", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to All remaining blocks conform to {0} and are {1} bytes each. + /// + internal static string All_remaining_blocks_conform_to_0_and_are_1_bytes_each { + get { + return ResourceManager.GetString("All_remaining_blocks_conform_to_0_and_are_1_bytes_each", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to All remaining blocks conform to {0} and have a variable length. + /// + internal static string All_remaining_blocks_conform_to_0_and_have_a_variable_length { + get { + return ResourceManager.GetString("All_remaining_blocks_conform_to_0_and_have_a_variable_length", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to All remaining blocks have {0} and are {1} bytes each. + /// + internal static string All_remaining_blocks_have_0_and_are_1_bytes_each { + get { + return ResourceManager.GetString("All_remaining_blocks_have_0_and_are_1_bytes_each", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to All remaining blocks have a variable length. + /// + internal static string All_remaining_blocks_have_a_variable_length { + get { + return ResourceManager.GetString("All_remaining_blocks_have_a_variable_length", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to All tasks received in nexus with ACA ACTIVE is set and an ACA condition is established shall terminate. + /// + internal static string All_tasks_received_in_nexus_with_ACA_ACTIVE_is_set_and_an_ACA_condition_is_established_shall_terminate { + get { + return ResourceManager.GetString("All_tasks_received_in_nexus_with_ACA_ACTIVE_is_set_and_an_ACA_condition_is_establ" + + "ished_shall_terminate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to All the affected commands in the task set shall be aborted when CHECK CONDITION is returned. + /// + internal static string All_the_affected_commands_in_the_task_set_shall_be_aborted_when_CHECK_CONDITION_is_returned { + get { + return ResourceManager.GetString("All_the_affected_commands_in_the_task_set_shall_be_aborted_when_CHECK_CONDITION_i" + + "s_returned", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Always apply the verify operation. + /// + internal static string Always_apply_the_verify_operation { + get { + return ResourceManager.GetString("Always_apply_the_verify_operation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to an unknown algorithm coded {0}. + /// + internal static string an_unknown_algorithm_coded_0 { + get { + return ResourceManager.GetString("an_unknown_algorithm_coded_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to an unknown medium type 0x{0:X2}. + /// + internal static string an_unknown_medium_type_0 { + get { + return ResourceManager.GetString("an_unknown_medium_type_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to an unregistered compression algorithm. + /// + internal static string an_unregistered_compression_algorithm { + get { + return ResourceManager.GetString("an_unregistered_compression_algorithm", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Application ID: {0}. + /// + internal static string Application_ID_0 { + get { + return ResourceManager.GetString("Application_ID_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Application Tag mode page is enabled. + /// + internal static string Application_Tag_mode_page_is_enabled { + get { + return ResourceManager.GetString("Application_Tag_mode_page_is_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Apply the verify operation depending on the condition. + /// + internal static string Apply_the_verify_operation_depending_on_the_condition { + get { + return ResourceManager.GetString("Apply_the_verify_operation_depending_on_the_condition", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Array controller device. + /// + internal static string Array_controller_device { + get { + return ResourceManager.GetString("Array_controller_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ASC {0:X2}h WITH ASCQ {1:X2}h. + /// + internal static string ASC_0_WITH_ASCQ_1 { + get { + return ResourceManager.GetString("ASC_0_WITH_ASCQ_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ASC {0:X2}h WITH VENDOR-SPECIFIC ASCQ {1:X2}h. + /// + internal static string ASC_0_WITH_VENDOR_SPECIFIC_ASCQ_1 { + get { + return ResourceManager.GetString("ASC_0_WITH_VENDOR_SPECIFIC_ASCQ_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Asia NTSC.. + /// + internal static string Asia_NTSC { + get { + return ResourceManager.GetString("Asia_NTSC", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Associated write protect is enabled. + /// + internal static string Associated_write_protect_is_enabled { + get { + return ResourceManager.GetString("Associated_write_protect_is_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Asynchronous data access time is {0}{1}. + /// + internal static string Asynchronous_data_access_time_is_0_1 { + get { + return ResourceManager.GetString("Asynchronous_data_access_time_is_0_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Asynchronous event reporting of informational exceptions. + /// + internal static string Asynchronous_event_reporting_of_informational_exceptions { + get { + return ResourceManager.GetString("Asynchronous_event_reporting_of_informational_exceptions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Asynchronous notification is supported. + /// + internal static string Asynchronous_notification_is_supported { + get { + return ResourceManager.GetString("Asynchronous_notification_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Asynchronous notification is supported and enabled. + /// + internal static string Asynchronous_notification_is_supported_and_enabled { + get { + return ResourceManager.GetString("Asynchronous_notification_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to AT Attachment Interface (ATA/ATAPI). + /// + internal static string AT_Attachment_Interface__ATA_ATAPI_ { + get { + return ResourceManager.GetString("AT_Attachment_Interface__ATA_ATAPI_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to At least {0} blocks will be always pre-fetched. + /// + internal static string At_least_0_blocks_will_be_always_pre_fetched { + get { + return ResourceManager.GetString("At_least_0_blocks_will_be_always_pre_fetched", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to At least {0} ms must be idle before resuming a suspended background scan operation. + /// + internal static string At_least_0_ms_must_be_idle_before_resuming_a_suspended_background_scan_operation { + get { + return ResourceManager.GetString("At_least_0_ms_must_be_idle_before_resuming_a_suspended_background_scan_operation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to at maximum volume. + /// + internal static string at_maximum_volume { + get { + return ResourceManager.GetString("at_maximum_volume", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to At minimum {0} ns. transfer cycle time per word in MDMA, {1} ns. recommended. + /// + internal static string At_minimum_0_ns_transfer_cycle_time_per_word_in_MDMA_1_ns_recommended { + get { + return ResourceManager.GetString("At_minimum_0_ns_transfer_cycle_time_per_word_in_MDMA_1_ns_recommended", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to At minimum {0} ns. transfer cycle time per word in PIO, with IORDY flow control. + /// + internal static string At_minimum_0_ns_transfer_cycle_time_per_word_in_PIO_with_IORDY_flow_control { + get { + return ResourceManager.GetString("At_minimum_0_ns_transfer_cycle_time_per_word_in_PIO_with_IORDY_flow_control", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to At minimum {0} ns. transfer cycle time per word in PIO, without flow control. + /// + internal static string At_minimum_0_ns_transfer_cycle_time_per_word_in_PIO_without_flow_control { + get { + return ResourceManager.GetString("At_minimum_0_ns_transfer_cycle_time_per_word_in_PIO_without_flow_control", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to At most {0} ms must be before suspending a background scan operation and processing received commands. + /// + internal static string At_most_0_ms_must_be_before_suspending_a_background_scan_operation_and_processing_received_commands { + get { + return ResourceManager.GetString("At_most_0_ms_must_be_before_suspending_a_background_scan_operation_and_processing" + + "_received_commands", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to at volume {0}. + /// + internal static string at_volume_0 { + get { + return ResourceManager.GetString("at_volume_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA-1 published, ANSI X3.221-1994. + /// + internal static string ATA_1_published_ANSI_X3_221_1994 { + get { + return ResourceManager.GetString("ATA_1_published_ANSI_X3_221_1994", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA-2 published, ANSI X3.279-1996. + /// + internal static string ATA_2_published_ANSI_X3_279_1996 { + get { + return ResourceManager.GetString("ATA_2_published_ANSI_X3_279_1996", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA-2 X3T10 948D prior to revision 2k. + /// + internal static string ATA_2_X3T10_948D_prior_to_revision_2k { + get { + return ResourceManager.GetString("ATA_2_X3T10_948D_prior_to_revision_2k", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA-2 X3T10 948D revision 2k. + /// + internal static string ATA_2_X3T10_948D_revision_2k { + get { + return ResourceManager.GetString("ATA_2_X3T10_948D_revision_2k", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA-2 X3T10 948D revision 3. + /// + internal static string ATA_2_X3T10_948D_revision_3 { + get { + return ResourceManager.GetString("ATA_2_X3T10_948D_revision_3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA-3 published, ANSI X3.298-1997. + /// + internal static string ATA_3_published_ANSI_X3_298_1997 { + get { + return ResourceManager.GetString("ATA_3_published_ANSI_X3_298_1997", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA-3 X3T10 2008D revision 0. + /// + internal static string ATA_3_X3T10_2008D_revision_0 { + get { + return ResourceManager.GetString("ATA_3_X3T10_2008D_revision_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA-3 X3T10 2008D revision 1. + /// + internal static string ATA_3_X3T10_2008D_revision_1 { + get { + return ResourceManager.GetString("ATA_3_X3T10_2008D_revision_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA-3 X3T10 2008D revision 6. + /// + internal static string ATA_3_X3T10_2008D_revision_6 { + get { + return ResourceManager.GetString("ATA_3_X3T10_2008D_revision_6", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA-3 X3T13 2008D revision 7. + /// + internal static string ATA_3_X3T13_2008D_revision_7 { + get { + return ResourceManager.GetString("ATA_3_X3T13_2008D_revision_7", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA (ATA-1) X3T9.2 781D prior to revision 4. + /// + internal static string ATA_ATA_1_X3T9_2_781D_prior_to_revision_4 { + get { + return ResourceManager.GetString("ATA_ATA_1_X3T9_2_781D_prior_to_revision_4", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA (ATA-1) X3T9.2 781D revision 4. + /// + internal static string ATA_ATA_1_X3T9_2_781D_revision_4 { + get { + return ResourceManager.GetString("ATA_ATA_1_X3T9_2_781D_revision_4", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA/ATAPI-4 published, ANSI INCITS 317-1998. + /// + internal static string ATA_ATAPI_4_published_ANSI_INCITS_317_1998 { + get { + return ResourceManager.GetString("ATA_ATAPI_4_published_ANSI_INCITS_317_1998", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA/ATAPI-4 T13 1153D revision 13. + /// + internal static string ATA_ATAPI_4_T13_1153D_revision_13 { + get { + return ResourceManager.GetString("ATA_ATAPI_4_T13_1153D_revision_13", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA/ATAPI-4 T13 1153D revision 14. + /// + internal static string ATA_ATAPI_4_T13_1153D_revision_14 { + get { + return ResourceManager.GetString("ATA_ATAPI_4_T13_1153D_revision_14", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA/ATAPI-4 T13 1153D revision 15. + /// + internal static string ATA_ATAPI_4_T13_1153D_revision_15 { + get { + return ResourceManager.GetString("ATA_ATAPI_4_T13_1153D_revision_15", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA/ATAPI-4 T13 1153D revision 17. + /// + internal static string ATA_ATAPI_4_T13_1153D_revision_17 { + get { + return ResourceManager.GetString("ATA_ATAPI_4_T13_1153D_revision_17", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA/ATAPI-4 T13 1153D revision 18. + /// + internal static string ATA_ATAPI_4_T13_1153D_revision_18 { + get { + return ResourceManager.GetString("ATA_ATAPI_4_T13_1153D_revision_18", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA/ATAPI-4 X3T13 1153D revision 6. + /// + internal static string ATA_ATAPI_4_X3T13_1153D_revision_6 { + get { + return ResourceManager.GetString("ATA_ATAPI_4_X3T13_1153D_revision_6", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA/ATAPI-4 X3T13 1153D revision 7. + /// + internal static string ATA_ATAPI_4_X3T13_1153D_revision_7 { + get { + return ResourceManager.GetString("ATA_ATAPI_4_X3T13_1153D_revision_7", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA/ATAPI-5 published, ANSI INCITS 340-2000. + /// + internal static string ATA_ATAPI_5_published_ANSI_INCITS_340_2000 { + get { + return ResourceManager.GetString("ATA_ATAPI_5_published_ANSI_INCITS_340_2000", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA/ATAPI-5 T13 1321D revision 1. + /// + internal static string ATA_ATAPI_5_T13_1321D_revision_1 { + get { + return ResourceManager.GetString("ATA_ATAPI_5_T13_1321D_revision_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA/ATAPI-5 T13 1321D revision 3. + /// + internal static string ATA_ATAPI_5_T13_1321D_revision_3 { + get { + return ResourceManager.GetString("ATA_ATAPI_5_T13_1321D_revision_3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA/ATAPI-6 published, ANSI INCITS 361-2002. + /// + internal static string ATA_ATAPI_6_published_ANSI_INCITS_361_2002 { + get { + return ResourceManager.GetString("ATA_ATAPI_6_published_ANSI_INCITS_361_2002", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA/ATAPI-6 T13 1410D revision 0. + /// + internal static string ATA_ATAPI_6_T13_1410D_revision_0 { + get { + return ResourceManager.GetString("ATA_ATAPI_6_T13_1410D_revision_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA/ATAPI-6 T13 1410D revision 1. + /// + internal static string ATA_ATAPI_6_T13_1410D_revision_1 { + get { + return ResourceManager.GetString("ATA_ATAPI_6_T13_1410D_revision_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA/ATAPI-6 T13 1410D revision 2. + /// + internal static string ATA_ATAPI_6_T13_1410D_revision_2 { + get { + return ResourceManager.GetString("ATA_ATAPI_6_T13_1410D_revision_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA/ATAPI-6 T13 1410D revision 3a. + /// + internal static string ATA_ATAPI_6_T13_1410D_revision_3a { + get { + return ResourceManager.GetString("ATA_ATAPI_6_T13_1410D_revision_3a", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA/ATAPI-7 published ANSI INCITS 397-2005. + /// + internal static string ATA_ATAPI_7_published_ANSI_INCITS_397_2005 { + get { + return ResourceManager.GetString("ATA_ATAPI_7_published_ANSI_INCITS_397_2005", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA/ATAPI-7 T13 1532D revision 0. + /// + internal static string ATA_ATAPI_7_T13_1532D_revision_0 { + get { + return ResourceManager.GetString("ATA_ATAPI_7_T13_1532D_revision_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA/ATAPI-7 T13 1532D revision 1. + /// + internal static string ATA_ATAPI_7_T13_1532D_revision_1 { + get { + return ResourceManager.GetString("ATA_ATAPI_7_T13_1532D_revision_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA/ATAPI-7 T13 1532D revision 4a. + /// + internal static string ATA_ATAPI_7_T13_1532D_revision_4a { + get { + return ResourceManager.GetString("ATA_ATAPI_7_T13_1532D_revision_4a", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA device. + /// + internal static string ATA_device { + get { + return ResourceManager.GetString("ATA_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA IDENTIFY information follows:. + /// + internal static string ATA_IDENTIFY_information_follows { + get { + return ResourceManager.GetString("ATA_IDENTIFY_information_follows", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA8-ACS Revision 2d. + /// + internal static string ATA8_ACS_revision_2d { + get { + return ResourceManager.GetString("ATA8_ACS_revision_2d", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA8-ACS Revision 3b. + /// + internal static string ATA8_ACS_revision_3b { + get { + return ResourceManager.GetString("ATA8_ACS_revision_3b", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA8-ACS Revision 3c. + /// + internal static string ATA8_ACS_revision_3c { + get { + return ResourceManager.GetString("ATA8_ACS_revision_3c", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA8-ACS Revision 3e. + /// + internal static string ATA8_ACS_Revision_3e { + get { + return ResourceManager.GetString("ATA8_ACS_Revision_3e", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA8-ACS Revision 3f. + /// + internal static string ATA8_ACS_Revision_3f { + get { + return ResourceManager.GetString("ATA8_ACS_Revision_3f", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA8-ACS Revision 4. + /// + internal static string ATA8_ACS_revision_4 { + get { + return ResourceManager.GetString("ATA8_ACS_revision_4", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA8-ACS Revision 4c. + /// + internal static string ATA8_ACS_Revision_4c { + get { + return ResourceManager.GetString("ATA8_ACS_Revision_4c", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATA8-ACS Revision 6. + /// + internal static string ATA8_ACS_revision_6 { + get { + return ResourceManager.GetString("ATA8_ACS_revision_6", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATAPI Array controller device. + /// + internal static string ATAPI_Array_controller_device { + get { + return ResourceManager.GetString("ATAPI_Array_controller_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATAPI Automation/Drive Interface. + /// + internal static string ATAPI_Automation_Drive_Interface { + get { + return ResourceManager.GetString("ATAPI_Automation_Drive_Interface", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATAPI Bridging Expanders. + /// + internal static string ATAPI_Bridging_Expanders { + get { + return ResourceManager.GetString("ATAPI_Bridging_Expanders", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATAPI CD-ROM/DVD/etc device. + /// + internal static string ATAPI_CD_ROM_DVD_etc_device { + get { + return ResourceManager.GetString("ATAPI_CD_ROM_DVD_etc_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATAPI Communications device. + /// + internal static string ATAPI_Communications_device { + get { + return ResourceManager.GetString("ATAPI_Communications_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATAPI device. + /// + internal static string ATAPI_device { + get { + return ResourceManager.GetString("ATAPI_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATAPI device requires ATA software reset. + /// + internal static string ATAPI_device_requires_ATA_software_reset { + get { + return ResourceManager.GetString("ATAPI_device_requires_ATA_software_reset", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATAPI device supports attention on slimline connected devices. + /// + internal static string ATAPI_device_supports_attention_on_slimline_connected_devices { + get { + return ResourceManager.GetString("ATAPI_device_supports_attention_on_slimline_connected_devices", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATAPI device supports command queueing. + /// + internal static string ATAPI_device_supports_command_queueing { + get { + return ResourceManager.GetString("ATAPI_device_supports_command_queueing", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATAPI device supports host environment detection. + /// + internal static string ATAPI_device_supports_host_environment_detection { + get { + return ResourceManager.GetString("ATAPI_device_supports_host_environment_detection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATAPI device supports interleaved DMA. + /// + internal static string ATAPI_device_supports_interleaved_DMA { + get { + return ResourceManager.GetString("ATAPI_device_supports_interleaved_DMA", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATAPI device supports overlapped operations. + /// + internal static string ATAPI_device_supports_overlapped_operations { + get { + return ResourceManager.GetString("ATAPI_device_supports_overlapped_operations", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATAPI device uses 12 byte command packet. + /// + internal static string ATAPI_device_uses_12_byte_command_packet { + get { + return ResourceManager.GetString("ATAPI_device_uses_12_byte_command_packet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATAPI device uses 16 byte command packet. + /// + internal static string ATAPI_device_uses_16_byte_command_packet { + get { + return ResourceManager.GetString("ATAPI_device_uses_16_byte_command_packet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATAPI Direct-access device. + /// + internal static string ATAPI_Direct_access_device { + get { + return ResourceManager.GetString("ATAPI_Direct_access_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATAPI Enclosure services device. + /// + internal static string ATAPI_Enclosure_services_device { + get { + return ResourceManager.GetString("ATAPI_Enclosure_services_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATAPI Graphics arts pre-press device (defined in ASC IT8). + /// + internal static string ATAPI_Graphics_arts_pre_press_device_defined_in_ASC_IT8 { + get { + return ResourceManager.GetString("ATAPI_Graphics_arts_pre_press_device_defined_in_ASC_IT8", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATAPI Medium change device. + /// + internal static string ATAPI_Medium_change_device { + get { + return ResourceManager.GetString("ATAPI_Medium_change_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATAPI Object-based Storage Device. + /// + internal static string ATAPI_Object_based_Storage_Device { + get { + return ResourceManager.GetString("ATAPI_Object_based_Storage_Device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATAPI Optical card reader/writer device. + /// + internal static string ATAPI_Optical_card_reader_writer_device { + get { + return ResourceManager.GetString("ATAPI_Optical_card_reader_writer_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATAPI Optical memory device. + /// + internal static string ATAPI_Optical_memory_device { + get { + return ResourceManager.GetString("ATAPI_Optical_memory_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATAPI Printer device. + /// + internal static string ATAPI_Printer_device { + get { + return ResourceManager.GetString("ATAPI_Printer_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATAPI Processor device. + /// + internal static string ATAPI_Processor_device { + get { + return ResourceManager.GetString("ATAPI_Processor_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATAPI Scanner device. + /// + internal static string ATAPI_Scanner_device { + get { + return ResourceManager.GetString("ATAPI_Scanner_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATAPI Sequential-access device. + /// + internal static string ATAPI_Sequential_access_device { + get { + return ResourceManager.GetString("ATAPI_Sequential_access_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATAPI Simplified direct-access device. + /// + internal static string ATAPI_Simplified_direct_access_device { + get { + return ResourceManager.GetString("ATAPI_Simplified_direct_access_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATAPI Unknown device type field value 0x{0:X2}. + /// + internal static string ATAPI_Unknown_device_type_field_value_0 { + get { + return ResourceManager.GetString("ATAPI_Unknown_device_type_field_value_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATAPI Unknown or no device type. + /// + internal static string ATAPI_Unknown_or_no_device_type { + get { + return ResourceManager.GetString("ATAPI_Unknown_or_no_device_type", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATAPI Well known logical unit. + /// + internal static string ATAPI_Well_known_logical_unit { + get { + return ResourceManager.GetString("ATAPI_Well_known_logical_unit", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATAPI Write-once device. + /// + internal static string ATAPI_Write_once_device { + get { + return ResourceManager.GetString("ATAPI_Write_once_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATIP Last possible start time of Lead-out: 0x{0:X6}. + /// + internal static string ATIP_Last_possible_start_time_of_Lead_out_0 { + get { + return ResourceManager.GetString("ATIP_Last_possible_start_time_of_Lead_out_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATIP Last possible start time of Lead-out: {0}:{1:D2}:{2:D2}. + /// + internal static string ATIP_Last_possible_start_time_of_Lead_out_0_1_2 { + get { + return ResourceManager.GetString("ATIP_Last_possible_start_time_of_Lead_out_0_1_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATIP Start time of Lead-in: 0x{0:X6}. + /// + internal static string ATIP_Start_time_of_Lead_in_0 { + get { + return ResourceManager.GetString("ATIP_Start_time_of_Lead_in_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ATIP Start time of Lead-in: {0}:{1:D2}:{2:D2}. + /// + internal static string ATIP_Start_time_of_Lead_in_0_1_2 { + get { + return ResourceManager.GetString("ATIP_Start_time_of_Lead_in_0_1_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Audio block.. + /// + internal static string Audio_block { + get { + return ResourceManager.GetString("Audio_block", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to audio information only. + /// + internal static string audio_information_only { + get { + return ResourceManager.GetString("audio_information_only", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Audio track {3} starts at: {0:D2}:{1:D2}:{2:D2} (. + /// + internal static string Audio_track_3_starts_at_0_1_2_open_parenthesis { + get { + return ResourceManager.GetString("Audio_track_3_starts_at_0_1_2_open_parenthesis", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Audio track {3} starts at: {4:D2}:{0:D2}:{1:D2}:{2:D2} (. + /// + internal static string Audio_track_3_starts_at_4_0_1_2_open_parenthesis { + get { + return ResourceManager.GetString("Audio_track_3_starts_at_4_0_1_2_open_parenthesis", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Audio/Visual data support mode is applied. + /// + internal static string Audio_Visual_data_support_mode_is_applied { + get { + return ResourceManager.GetString("Audio_Visual_data_support_mode_is_applied", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Automatic Acoustic Management is supported. + /// + internal static string Automatic_Acoustic_Management_is_supported { + get { + return ResourceManager.GetString("Automatic_Acoustic_Management_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Automatic Acoustic Management is supported and enabled with value {0} (vendor recommends {1}. + /// + internal static string Automatic_Acoustic_Management_is_supported_and_enabled_with_value_0_vendor_recommends_1 { + get { + return ResourceManager.GetString("Automatic_Acoustic_Management_is_supported_and_enabled_with_value_0_vendor_recomm" + + "ends_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Automatic Partial to Slumber transitions are enabled. + /// + internal static string Automatic_Partial_to_Slumber_transitions_are_enabled { + get { + return ResourceManager.GetString("Automatic_Partial_to_Slumber_transitions_are_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Automatic read reallocation is enabled. + /// + internal static string Automatic_read_reallocation_is_enabled { + get { + return ResourceManager.GetString("Automatic_read_reallocation_is_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Automatic write reallocation is enabled. + /// + internal static string Automatic_write_reallocation_is_enabled { + get { + return ResourceManager.GetString("Automatic_write_reallocation_is_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Automation/Drive Interface. + /// + internal static string Automation_Drive_Interface { + get { + return ResourceManager.GetString("Automation_Drive_Interface", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Automation/Drive Interface Transport. + /// + internal static string Automation_Drive_Interface_Transport { + get { + return ResourceManager.GetString("Automation_Drive_Interface_Transport", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Automation is disabled. + /// + internal static string Automation_is_disabled { + get { + return ResourceManager.GetString("Automation_is_disabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Background functions are enabled. + /// + internal static string Background_functions_are_enabled { + get { + return ResourceManager.GetString("Background_functions_are_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Background medium scans are enabled. + /// + internal static string Background_medium_scans_are_enabled { + get { + return ResourceManager.GetString("Background_medium_scans_are_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Background pre-scan operations can take a maximum of {0} hours. + /// + internal static string Background_pre_scan_operations_can_take_a_maximum_of_0_hours { + get { + return ResourceManager.GetString("Background_pre_scan_operations_can_take_a_maximum_of_0_hours", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Background pre-scans are enabled. + /// + internal static string Background_pre_scans_are_enabled { + get { + return ResourceManager.GetString("Background_pre_scans_are_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Background scans will be halted if log is full. + /// + internal static string Background_scans_will_be_halted_if_log_is_full { + get { + return ResourceManager.GetString("Background_scans_will_be_halted_if_log_is_full", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Background scans will only be logged if they require intervention. + /// + internal static string Background_scans_will_only_be_logged_if_they_require_intervention { + get { + return ResourceManager.GetString("Background_scans_will_only_be_logged_if_they_require_intervention", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to BGA device. + /// + internal static string BGA_device { + get { + return ResourceManager.GetString("BGA_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Binary contents: {0}. + /// + internal static string Binary_contents_0 { + get { + return ResourceManager.GetString("Binary_contents_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Blank checking during write is enabled. + /// + internal static string Blank_checking_during_write_is_enabled { + get { + return ResourceManager.GetString("Blank_checking_during_write_is_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to BLOCK ERASE EXT is supported. + /// + internal static string BLOCK_ERASE_EXT_is_supported { + get { + return ResourceManager.GetString("BLOCK_ERASE_EXT_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Block number {0}. + /// + internal static string Block_number_0 { + get { + return ResourceManager.GetString("Block_number_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Blu-ray Burst Cutting Area in hex follows:. + /// + internal static string Blu_ray_Burst_Cutting_Area_in_hex_follows { + get { + return ResourceManager.GetString("Blu_ray_Burst_Cutting_Area_in_hex_follows", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Blu-ray DDS Disc Type Specific Data in hex follows:. + /// + internal static string Blu_ray_DDS_Disc_Type_Specific_Data_in_hex_follows { + get { + return ResourceManager.GetString("Blu_ray_DDS_Disc_Type_Specific_Data_in_hex_follows", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Blu-ray DDS Status Bits in hex follows:. + /// + internal static string Blu_ray_DDS_Status_Bits_in_hex_follows { + get { + return ResourceManager.GetString("Blu_ray_DDS_Status_Bits_in_hex_follows", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Blu-ray DI Unit format dependent contents as hex follows:. + /// + internal static string Blu_ray_DI_Unit_format_dependent_contents_as_hex_follows { + get { + return ResourceManager.GetString("Blu_ray_DI_Unit_format_dependent_contents_as_hex_follows", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Book type: 0x{0:X2}. + /// + internal static string Book_type_0 { + get { + return ResourceManager.GetString("Book_type_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Boot area 1 is not protected. + /// + internal static string Boot_area_one_is_not_protected { + get { + return ResourceManager.GetString("Boot_area_one_is_not_protected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Boot area 1 is permanently protected. + /// + internal static string Boot_area_one_is_permanently_protected { + get { + return ResourceManager.GetString("Boot_area_one_is_permanently_protected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Boot area 1 is permanently write protected.. + /// + internal static string Boot_area_one_is_permanently_write_protected { + get { + return ResourceManager.GetString("Boot_area_one_is_permanently_write_protected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Boot area 1 is power on protected. + /// + internal static string Boot_area_one_is_power_on_protected { + get { + return ResourceManager.GetString("Boot_area_one_is_power_on_protected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Boot area 1 is write protected until next power cycle.. + /// + internal static string Boot_area_one_is_write_protected_until_next_power_cycle { + get { + return ResourceManager.GetString("Boot_area_one_is_write_protected_until_next_power_cycle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Boot area 2 is not protected. + /// + internal static string Boot_area_two_is_not_protected { + get { + return ResourceManager.GetString("Boot_area_two_is_not_protected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Boot area 2 is permanently protected. + /// + internal static string Boot_area_two_is_permanently_protected { + get { + return ResourceManager.GetString("Boot_area_two_is_permanently_protected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Boot area 2 is permanently write protected.. + /// + internal static string Boot_area_two_is_permanently_write_protected { + get { + return ResourceManager.GetString("Boot_area_two_is_permanently_write_protected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Boot area 2 is power on protected. + /// + internal static string Boot_area_two_is_power_on_protected { + get { + return ResourceManager.GetString("Boot_area_two_is_power_on_protected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Boot area 2 is write protected until next power cycle.. + /// + internal static string Boot_area_two_is_write_protected_until_next_power_cycle { + get { + return ResourceManager.GetString("Boot_area_two_is_write_protected_until_next_power_cycle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Boot firmware version: {0}. + /// + internal static string Boot_firmware_version_0 { + get { + return ResourceManager.GetString("Boot_firmware_version_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Both boot areas are permanently write protected.. + /// + internal static string Both_boot_areas_are_permanently_write_protected { + get { + return ResourceManager.GetString("Both_boot_areas_are_permanently_write_protected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Both boot areas are write protected until next power cycle.. + /// + internal static string Both_boot_areas_are_write_protected_until_next_power_cycle { + get { + return ResourceManager.GetString("Both_boot_areas_are_write_protected_until_next_power_cycle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Bridging Expanders. + /// + internal static string Bridging_Expanders { + get { + return ResourceManager.GetString("Bridging_Expanders", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to bytes. + /// + internal static string bytes { + get { + return ResourceManager.GetString("bytes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Caching analysis is permitted. + /// + internal static string Caching_analysis_is_permitted { + get { + return ResourceManager.GetString("Caching_analysis_is_permitted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Card ID: 0x{0:X4}. + /// + internal static string Card_ID_0 { + get { + return ResourceManager.GetString("Card_ID_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Card indicates compliance with PC Card Standard Release {0}.{1}. + /// + internal static string Card_indicates_compliance_with_PC_Card_Standard_Release_0_1 { + get { + return ResourceManager.GetString("Card_indicates_compliance_with_PC_Card_Standard_Release_0_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cartridge has an uncompressed capability of {0} gigabytes. + /// + internal static string Cartridge_has_an_uncompressed_capability_of_0_gigabytes { + get { + return ResourceManager.GetString("Cartridge_has_an_uncompressed_capability_of_0_gigabytes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cartridge is set to write protected. + /// + internal static string Cartridge_is_set_to_write_protected { + get { + return ResourceManager.GetString("Cartridge_is_set_to_write_protected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cartridge removable is prevented. + /// + internal static string Cartridge_removable_is_prevented { + get { + return ResourceManager.GetString("Cartridge_removable_is_prevented", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cartridge serial number: {0}. + /// + internal static string Cartridge_serial_number_0 { + get { + return ResourceManager.GetString("Cartridge_serial_number_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cartridge sets write protection. + /// + internal static string Cartridge_sets_write_protection { + get { + return ResourceManager.GetString("Cartridge_sets_write_protection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cartridge tape is threaded. + /// + internal static string Cartridge_tape_is_threaded { + get { + return ResourceManager.GetString("Cartridge_tape_is_threaded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cartridge will be loaded and threaded on insertion. + /// + internal static string Cartridge_will_be_loaded_and_threaded_on_insertion { + get { + return ResourceManager.GetString("Cartridge_will_be_loaded_and_threaded_on_insertion", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cartridge will be loaded but not threaded on insertion. + /// + internal static string Cartridge_will_be_loaded_but_not_threaded_on_insertion { + get { + return ResourceManager.GetString("Cartridge_will_be_loaded_but_not_threaded_on_insertion", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cartridge will not be loaded. + /// + internal static string Cartridge_will_not_be_loaded { + get { + return ResourceManager.GetString("Cartridge_will_not_be_loaded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Catalogue number: . + /// + internal static string Catalogue_number { + get { + return ResourceManager.GetString("Catalogue_number", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CD-ROM/DVD/etc device. + /// + internal static string CD_ROM_DVD_etc_device { + get { + return ResourceManager.GetString("CD_ROM_DVD_etc_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CD-ROM sector.. + /// + internal static string CD_ROM_sector { + get { + return ResourceManager.GetString("CD_ROM_sector", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CD sector.. + /// + internal static string CD_sector { + get { + return ResourceManager.GetString("CD_sector", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CD-Text pack contains arranger for album. + /// + internal static string CD_Text_pack_contains_arranger_for_album { + get { + return ResourceManager.GetString("CD_Text_pack_contains_arranger_for_album", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CD-Text pack contains arranger for track {0}. + /// + internal static string CD_Text_pack_contains_arranger_for_track_0 { + get { + return ResourceManager.GetString("CD_Text_pack_contains_arranger_for_track_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CD-Text pack contains content provider's message for album. + /// + internal static string CD_Text_pack_contains_content_provider_message_for_album { + get { + return ResourceManager.GetString("CD_Text_pack_contains_content_provider_message_for_album", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CD-Text pack contains content provider's message for track {0}. + /// + internal static string CD_Text_pack_contains_content_provider_message_for_track_0 { + get { + return ResourceManager.GetString("CD_Text_pack_contains_content_provider_message_for_track_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CD-Text pack contains data reserved for content provider only. + /// + internal static string CD_Text_pack_contains_data_reserved_for_content_provider_only { + get { + return ResourceManager.GetString("CD_Text_pack_contains_data_reserved_for_content_provider_only", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CD-Text pack contains disc identification information. + /// + internal static string CD_Text_pack_contains_disc_identification_information { + get { + return ResourceManager.GetString("CD_Text_pack_contains_disc_identification_information", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CD-Text pack contains genre identification information. + /// + internal static string CD_Text_pack_contains_genre_identification_information { + get { + return ResourceManager.GetString("CD_Text_pack_contains_genre_identification_information", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CD-Text pack contains performer for album. + /// + internal static string CD_Text_pack_contains_performer_for_album { + get { + return ResourceManager.GetString("CD_Text_pack_contains_performer_for_album", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CD-Text pack contains performer for track {0}. + /// + internal static string CD_Text_pack_contains_performer_for_track_0 { + get { + return ResourceManager.GetString("CD_Text_pack_contains_performer_for_track_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CD-Text pack contains reserved data. + /// + internal static string CD_Text_pack_contains_reserved_data { + get { + return ResourceManager.GetString("CD_Text_pack_contains_reserved_data", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CD-Text pack contains second table of contents information. + /// + internal static string CD_Text_pack_contains_second_table_of_contents_information { + get { + return ResourceManager.GetString("CD_Text_pack_contains_second_table_of_contents_information", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CD-Text pack contains size block information. + /// + internal static string CD_Text_pack_contains_size_block_information { + get { + return ResourceManager.GetString("CD_Text_pack_contains_size_block_information", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CD-Text pack contains songwriter for album. + /// + internal static string CD_Text_pack_contains_songwriter_for_album { + get { + return ResourceManager.GetString("CD_Text_pack_contains_songwriter_for_album", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CD-Text pack contains songwriter for track {0}. + /// + internal static string CD_Text_pack_contains_songwriter_for_track_0 { + get { + return ResourceManager.GetString("CD_Text_pack_contains_songwriter_for_track_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CD-Text pack contains table of contents information. + /// + internal static string CD_Text_pack_contains_table_of_contents_information { + get { + return ResourceManager.GetString("CD_Text_pack_contains_table_of_contents_information", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CD-Text pack contains title for album. + /// + internal static string CD_Text_pack_contains_title_for_album { + get { + return ResourceManager.GetString("CD_Text_pack_contains_title_for_album", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CD-Text pack contains title for track {0}. + /// + internal static string CD_Text_pack_contains_title_for_track_0 { + get { + return ResourceManager.GetString("CD_Text_pack_contains_title_for_track_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CD-Text pack contains UPC. + /// + internal static string CD_Text_pack_contains_UPC { + get { + return ResourceManager.GetString("CD_Text_pack_contains_UPC", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CD-V disc in NTSC format with digital bilingual sound. + /// + internal static string CD_V_disc_in_NTSC_format_with_digital_bilingual_sound { + get { + return ResourceManager.GetString("CD_V_disc_in_NTSC_format_with_digital_bilingual_sound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CD-V disc in NTSC format with digital stereo sound. + /// + internal static string CD_V_disc_in_NTSC_format_with_digital_stereo_sound { + get { + return ResourceManager.GetString("CD_V_disc_in_NTSC_format_with_digital_stereo_sound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CD-V disc in PAL format with digital bilingual sound. + /// + internal static string CD_V_disc_in_PAL_format_with_digital_bilingual_sound { + get { + return ResourceManager.GetString("CD_V_disc_in_PAL_format_with_digital_bilingual_sound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CD-V disc in PAL format with digital stereo sound. + /// + internal static string CD_V_disc_in_PAL_format_with_digital_stereo_sound { + get { + return ResourceManager.GetString("CD_V_disc_in_PAL_format_with_digital_stereo_sound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CD-V single in NTSC format with digital bilingual sound. + /// + internal static string CD_V_single_in_NTSC_format_with_digital_bilingual_sound { + get { + return ResourceManager.GetString("CD_V_single_in_NTSC_format_with_digital_bilingual_sound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CD-V single in NTSC format with digital stereo sound. + /// + internal static string CD_V_single_in_NTSC_format_with_digital_stereo_sound { + get { + return ResourceManager.GetString("CD_V_single_in_NTSC_format_with_digital_stereo_sound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CD-V single in PAL format with digital bilingual sound. + /// + internal static string CD_V_single_in_PAL_format_with_digital_bilingual_sound { + get { + return ResourceManager.GetString("CD_V_single_in_PAL_format_with_digital_bilingual_sound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CD-V single in PAL format with digital stereo sound. + /// + internal static string CD_V_single_in_PAL_format_with_digital_stereo_sound { + get { + return ResourceManager.GetString("CD_V_single_in_PAL_format_with_digital_stereo_sound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Base Mechanical Serial Number: {0}. + /// + internal static string Certance_Base_Mechanical_Serial_Number_0 { + get { + return ResourceManager.GetString("Certance_Base_Mechanical_Serial_Number_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Board Serial Number: {0}. + /// + internal static string Certance_Board_Serial_Number_0 { + get { + return ResourceManager.GetString("Certance_Board_Serial_Number_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Certance Drive Component Revision Levels page:. + /// + internal static string Certance_Certance_Drive_Component_Revision_Levels_page { + get { + return ResourceManager.GetString("Certance_Certance_Drive_Component_Revision_Levels_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Certance Drive Component Serial Number page:. + /// + internal static string Certance_Certance_Drive_Component_Serial_Number_page { + get { + return ResourceManager.GetString("Certance_Certance_Drive_Component_Serial_Number_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Component: {0}. + /// + internal static string Certance_Component_0 { + get { + return ResourceManager.GetString("Certance_Component_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Date: {0}. + /// + internal static string Certance_Date_0 { + get { + return ResourceManager.GetString("Certance_Date_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Certance Drive Capabilities Control Mode Page:. + /// + internal static string Certance_Drive_Capabilities_Control_Mode_Page { + get { + return ResourceManager.GetString("Certance_Drive_Capabilities_Control_Mode_Page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Certance drive status page:. + /// + internal static string Certance_drive_status_page { + get { + return ResourceManager.GetString("Certance_drive_status_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Head Assembly Serial Number: {0}. + /// + internal static string Certance_Head_Assembly_Serial_Number_0 { + get { + return ResourceManager.GetString("Certance_Head_Assembly_Serial_Number_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Certance Interface Control Mode Page:. + /// + internal static string Certance_Interface_Control_Mode_Page { + get { + return ResourceManager.GetString("Certance_Interface_Control_Mode_Page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reel Motor 1 Serial Number: {0}. + /// + internal static string Certance_Reel_Motor_1_Serial_Number_0 { + get { + return ResourceManager.GetString("Certance_Reel_Motor_1_Serial_Number_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reel Motor 2 Serial Number: {0}. + /// + internal static string Certance_Reel_Motor_2_Serial_Number_0 { + get { + return ResourceManager.GetString("Certance_Reel_Motor_2_Serial_Number_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Variant: {0}. + /// + internal static string Certance_Variant_0 { + get { + return ResourceManager.GetString("Certance_Variant_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Version: {0}. + /// + internal static string Certance_Version_0 { + get { + return ResourceManager.GetString("Certance_Version_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Challenge ID: {0}. + /// + internal static string Challenge_ID_0 { + get { + return ResourceManager.GetString("Challenge_ID_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Challenge level: {0}. + /// + internal static string Challenge_level_0 { + get { + return ResourceManager.GetString("Challenge_level_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Challenge value: 0x{0:X8}. + /// + internal static string Challenge_value_0 { + get { + return ResourceManager.GetString("Challenge_value_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Change of the boot configuration register bits is disabled until the next power cycle.. + /// + internal static string Change_of_the_boot_configuration_register_bits_is_disabled_until_the_next_power_cycle { + get { + return ResourceManager.GetString("Change_of_the_boot_configuration_register_bits_is_disabled_until_the_next_power_c" + + "ycle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Change of the boot configuration register bits is permanently disabled.. + /// + internal static string Change_of_the_boot_configuration_register_bits_is_permanently_disabled { + get { + return ResourceManager.GetString("Change_of_the_boot_configuration_register_bits_is_permanently_disabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Channel number: {0}. + /// + internal static string Channel_number_0 { + get { + return ResourceManager.GetString("Channel_number_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Character position {0}. + /// + internal static string Character_position_0 { + get { + return ResourceManager.GetString("Character_position_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CHECK CONDITION should be reported rather than a long busy condition. + /// + internal static string CHECK_CONDITION_should_be_reported_rather_than_a_long_busy_condition { + get { + return ResourceManager.GetString("CHECK_CONDITION_should_be_reported_rather_than_a_long_busy_condition", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Checksum {0}. + /// + internal static string Checksum_0 { + get { + return ResourceManager.GetString("Checksum_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CID CRC: 0x{0:X2}. + /// + internal static string CID_CRC_0 { + get { + return ResourceManager.GetString("CID_CRC_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cleaning behaviour is normal. + /// + internal static string Cleaning_behaviour_is_normal { + get { + return ResourceManager.GetString("Cleaning_behaviour_is_normal", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cleaning cartridge inserted. + /// + internal static string Cleaning_cartridge_inserted { + get { + return ResourceManager.GetString("Cleaning_cartridge_inserted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Clock dependent part of data access is {0} clock cycles. + /// + internal static string Clock_dependent_part_of_data_access_is_0_clock_cycles { + get { + return ResourceManager.GetString("Clock_dependent_part_of_data_access_is_0_clock_cycles", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ). + /// + internal static string close_parenthesis { + get { + return ResourceManager.GetString("close_parenthesis", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Code name: {0}. + /// + internal static string Code_name_0 { + get { + return ResourceManager.GetString("Code_name_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Coding information number: {0}. + /// + internal static string Coding_information_number_0 { + get { + return ResourceManager.GetString("Coding_information_number_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Command forwarding is disabled. + /// + internal static string Command_forwarding_is_disabled { + get { + return ResourceManager.GetString("Command_forwarding_is_disabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Command forwarding is enabled. + /// + internal static string Command_forwarding_is_enabled { + get { + return ResourceManager.GetString("Command_forwarding_is_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Command set and features:. + /// + internal static string Command_set_and_features { + get { + return ResourceManager.GetString("Command_set_and_features", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Commands can be reordered in any manner. + /// + internal static string Commands_can_be_reordered_in_any_manner { + get { + return ResourceManager.GetString("Commands_can_be_reordered_in_any_manner", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Commands should be sent strictly ordered. + /// + internal static string Commands_should_be_sent_strictly_ordered { + get { + return ResourceManager.GetString("Commands_should_be_sent_strictly_ordered", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Communications device. + /// + internal static string Communications_device { + get { + return ResourceManager.GetString("Communications_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CompactFlash device. + /// + internal static string CompactFlash_device { + get { + return ResourceManager.GetString("CompactFlash_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CompactFlash device supports power mode 1. + /// + internal static string CompactFlash_device_supports_power_mode_1 { + get { + return ResourceManager.GetString("CompactFlash_device_supports_power_mode_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CompactFlash device uses a maximum of {0} mA. + /// + internal static string CompactFlash_device_uses_a_maximum_of_0_mA { + get { + return ResourceManager.GetString("CompactFlash_device_uses_a_maximum_of_0_mA", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CompactFlash feature set is supported. + /// + internal static string CompactFlash_feature_set_is_supported { + get { + return ResourceManager.GetString("CompactFlash_feature_set_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CompactFlash feature set is supported and enabled. + /// + internal static string CompactFlash_feature_set_is_supported_and_enabled { + get { + return ResourceManager.GetString("CompactFlash_feature_set_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CompactFlash power mode 1 is disabled. + /// + internal static string CompactFlash_power_mode_1_is_disabled { + get { + return ResourceManager.GetString("CompactFlash_power_mode_1_is_disabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CompactFlash power mode 1 required for one or more commands. + /// + internal static string CompactFlash_power_mode_1_required_for_one_or_more_commands { + get { + return ResourceManager.GetString("CompactFlash_power_mode_1_required_for_one_or_more_commands", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Compression is controlled using mode pages 0Fh and 10h. + /// + internal static string Compression_is_controlled_using_mode_pages_0Fh_and_10h { + get { + return ResourceManager.GetString("Compression_is_controlled_using_mode_pages_0Fh_and_10h", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Compression is disabled and not controllable. + /// + internal static string Compression_is_disabled_and_not_controllable { + get { + return ResourceManager.GetString("Compression_is_disabled_and_not_controllable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Compression is enabled and not controllable. + /// + internal static string Compression_is_enabled_and_not_controllable { + get { + return ResourceManager.GetString("Compression_is_enabled_and_not_controllable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Conditionally generate recovered error on informational exceptions. + /// + internal static string Conditionally_generate_recovered_error_on_informational_exceptions { + get { + return ResourceManager.GetString("Conditionally_generate_recovered_error_on_informational_exceptions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Consumer purpose disc for use in consumer purpose drives. + /// + internal static string Consumer_purpose_disc_for_use_in_consumer_purpose_drives { + get { + return ResourceManager.GetString("Consumer_purpose_disc_for_use_in_consumer_purpose_drives", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Control Data Zone is pre-recorded. + /// + internal static string Control_Data_Zone_is_pre_recorded { + get { + return ResourceManager.GetString("Control_Data_Zone_is_pre_recorded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Controller firmware version: {0}. + /// + internal static string Controller_firmware_version_0 { + get { + return ResourceManager.GetString("Controller_firmware_version_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Controller hardware version: {0}. + /// + internal static string Controller_hardware_version_0 { + get { + return ResourceManager.GetString("Controller_hardware_version_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Copy of information of A1 from ATIP found. + /// + internal static string Copy_of_information_of_A1_from_ATIP_found { + get { + return ResourceManager.GetString("Copy_of_information_of_A1_from_ATIP_found", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Copyright: {0}. + /// + internal static string Copyright_0 { + get { + return ResourceManager.GetString("Copyright_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Correct ECC P.. + /// + internal static string Correct_ECC_P { + get { + return ResourceManager.GetString("Correct_ECC_P", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Correct ECC Q.. + /// + internal static string Correct_ECC_Q { + get { + return ResourceManager.GetString("Correct_ECC_Q", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Correct EDC.. + /// + internal static string Correct_EDC { + get { + return ResourceManager.GetString("Correct_EDC", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Correct sector contents.. + /// + internal static string Correct_sector_contents { + get { + return ResourceManager.GetString("Correct_sector_contents", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Correct zero fill.. + /// + internal static string Correct_zero_fill { + get { + return ResourceManager.GetString("Correct_zero_fill", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Could not decode ATA IDENTIFY information. + /// + internal static string Could_not_decode_ATA_IDENTIFY_information { + get { + return ResourceManager.GetString("Could_not_decode_ATA_IDENTIFY_information", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CPRM Media Key Blocks in hex follows:. + /// + internal static string CPRM_Media_Key_Blocks_in_hex_follows { + get { + return ResourceManager.GetString("CPRM_Media_Key_Blocks_in_hex_follows", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CRC: 0x{0:X4}. + /// + internal static string CRC_0_X4 { + get { + return ResourceManager.GetString("CRC_0_X4", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CRYPTO SCRAMBLE EXT is supported. + /// + internal static string CRYPTO_SCRAMBLE_EXT_is_supported { + get { + return ResourceManager.GetString("CRYPTO_SCRAMBLE_EXT_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CSD CRC: 0x{0:X2}. + /// + internal static string CSD_CRC_0 { + get { + return ResourceManager.GetString("CSD_CRC_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CSD version 1.{0} revision 1.{1}. + /// + internal static string CSD_version_one_0_revision_one_1 { + get { + return ResourceManager.GetString("CSD_version_one_0_revision_one_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CompactTape I. + /// + internal static string CT1 { + get { + return ResourceManager.GetString("CT1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CompactTape II. + /// + internal static string CT2 { + get { + return ResourceManager.GetString("CT2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to (current). + /// + internal static string current { + get { + return ResourceManager.GetString("current", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Current Border-Out first sector is PSN {0:X}h. + /// + internal static string Current_Border_Out_first_sector_is_PSN_0 { + get { + return ResourceManager.GetString("Current_Border_Out_first_sector_is_PSN_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Current media has a {0} bytes link available. + /// + internal static string Current_media_has_a_0_bytes_link_available { + get { + return ResourceManager.GetString("Current_media_has_a_0_bytes_link_available", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Current media is initialized with TCG OSSC. + /// + internal static string Current_media_is_initialized_with_TCG_OSSC { + get { + return ResourceManager.GetString("Current_media_is_initialized_with_TCG_OSSC", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Current operating definition: {0}. + /// + internal static string Current_operating_definition_0 { + get { + return ResourceManager.GetString("Current_operating_definition_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Current RMD in extra Border zone starts at PSN {0:X}h. + /// + internal static string Current_RMD_in_extra_Border_zone_starts_at_PSN_0 { + get { + return ResourceManager.GetString("Current_RMD_in_extra_Border_zone_starts_at_PSN_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Current Write/Read/Verify mode: {0}. + /// + internal static string Current_Write_Read_Verify_mode_0 { + get { + return ResourceManager.GetString("Current_Write_Read_Verify_mode_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cylinders: {0}. + /// + internal static string Cylinders_0 { + get { + return ResourceManager.GetString("Cylinders_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cylinders: {0} max., {1} current. + /// + internal static string Cylinders_0_max_1_current { + get { + return ResourceManager.GetString("Cylinders_0_max_1_current", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 200 mm optical disc. + /// + internal static string D407 { + get { + return ResourceManager.GetString("D407", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 89 mm Read/Write double-sided optical disc with 12500 tracks. + /// + internal static string D581 { + get { + return ResourceManager.GetString("D581", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Data area ends at PSN {0:X}h. + /// + internal static string Data_area_ends_at_PSN_0 { + get { + return ResourceManager.GetString("Data_area_ends_at_PSN_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Data area starts at PSN {0:X}h. + /// + internal static string Data_area_starts_at_PSN_0 { + get { + return ResourceManager.GetString("Data_area_starts_at_PSN_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Data block.. + /// + internal static string Data_block { + get { + return ResourceManager.GetString("Data_block", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Data compression is enabled with . + /// + internal static string Data_compression_is_enabled_with { + get { + return ResourceManager.GetString("Data_compression_is_enabled_with", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Data decompression is enabled. + /// + internal static string Data_decompression_is_enabled { + get { + return ResourceManager.GetString("Data_decompression_is_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Data has {0} bytes. + /// + internal static string Data_has_0_bytes { + get { + return ResourceManager.GetString("Data_has_0_bytes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Data not recovered within limits shall be transferred back before a CHECK CONDITION. + /// + internal static string Data_not_recovered_within_limits_shall_be_transferred_back_before_a_CHECK_CONDITION { + get { + return ResourceManager.GetString("Data_not_recovered_within_limits_shall_be_transferred_back_before_a_CHECK_CONDITI" + + "ON", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Data put by READ commands should be evicted from cache sooner than data put in read cache by other means. + /// + internal static string Data_put_by_READ_commands_should_be_evicted_from_cache_sooner_than_data_put_in_read_cache_by_other_means { + get { + return ResourceManager.GetString("Data_put_by_READ_commands_should_be_evicted_from_cache_sooner_than_data_put_in_re" + + "ad_cache_by_other_means", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Data put by READ commands should not be evicted if there is data cached by other means that can be evicted. + /// + internal static string Data_put_by_READ_commands_should_not_be_evicted_if_there_is_data_cached_by_other_means_that_can_be_evicted { + get { + return ResourceManager.GetString("Data_put_by_READ_commands_should_not_be_evicted_if_there_is_data_cached_by_other_" + + "means_that_can_be_evicted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Data put by WRITE commands should be evicted from cache sooner than data put in write cache by other means. + /// + internal static string Data_put_by_WRITE_commands_should_be_evicted_from_cache_sooner_than_data_put_in_write_cache_by_other_means { + get { + return ResourceManager.GetString("Data_put_by_WRITE_commands_should_be_evicted_from_cache_sooner_than_data_put_in_w" + + "rite_cache_by_other_means", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Data put by WRITE commands should not be evicted if there is data cached by other means that can be evicted. + /// + internal static string Data_put_by_WRITE_commands_should_not_be_evicted_if_there_is_data_cached_by_other_means_that_can_be_evicted { + get { + return ResourceManager.GetString("Data_put_by_WRITE_commands_should_not_be_evicted_if_there_is_data_cached_by_other" + + "_means_that_can_be_evicted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DATA SET MANAGEMENT can receive a maximum of {0} blocks of 512 bytes. + /// + internal static string DATA_SET_MANAGEMENT_can_receive_a_maximum_of_0_blocks_of_512_bytes { + get { + return ResourceManager.GetString("DATA_SET_MANAGEMENT_can_receive_a_maximum_of_0_blocks_of_512_bytes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Data strobe offset option is available. + /// + internal static string Data_strobe_offset_option_is_available { + get { + return ResourceManager.GetString("Data_strobe_offset_option_is_available", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Data tapes will be threaded at beginning, rest will be unloaded. + /// + internal static string Data_tapes_will_be_threaded_at_beginning_rest_will_be_unloaded { + get { + return ResourceManager.GetString("Data_tapes_will_be_threaded_at_beginning_rest_will_be_unloaded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Data track {3} starts at: {0:D2}:{1:D2}:{2:D2} (. + /// + internal static string Data_track_3_starts_at_0_1_2_open_parenthesis { + get { + return ResourceManager.GetString("Data_track_3_starts_at_0_1_2_open_parenthesis", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Data track {3} starts at: {4:D2}:{0:D2}:{1:D2}:{2:D2} (. + /// + internal static string Data_track_3_starts_at_4_0_1_2_open_parenthesis { + get { + return ResourceManager.GetString("Data_track_3_starts_at_4_0_1_2_open_parenthesis", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Data track, recorded incrementally. + /// + internal static string Data_track_recorded_incrementally { + get { + return ResourceManager.GetString("Data_track_recorded_incrementally", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Data track, recorded uninterrupted. + /// + internal static string Data_track_recorded_uninterrupted { + get { + return ResourceManager.GetString("Data_track_recorded_uninterrupted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Data transfer disconnect control is not used. + /// + internal static string Data_transfer_disconnect_control_is_not_used { + get { + return ResourceManager.GetString("Data_transfer_disconnect_control_is_not_used", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DC-9200. + /// + internal static string DC9200 { + get { + return ResourceManager.GetString("DC9200", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DC-9250. + /// + internal static string DC9250 { + get { + return ResourceManager.GetString("DC9250", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DCLZ. + /// + internal static string DCLZ { + get { + return ResourceManager.GetString("DCLZ", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DDS Format: 0x{0:X2}. + /// + internal static string DDS_Format_0 { + get { + return ResourceManager.GetString("DDS_Format_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DDS has been updated {0} times. + /// + internal static string DDS_has_been_updated_0_times { + get { + return ResourceManager.GetString("DDS_has_been_updated_0_times", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DDS-2. + /// + internal static string DDS2 { + get { + return ResourceManager.GetString("DDS2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DDS-3. + /// + internal static string DDS3 { + get { + return ResourceManager.GetString("DDS3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DDS-4. + /// + internal static string DDS4 { + get { + return ResourceManager.GetString("DDS4", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Default operating definition: {0}. + /// + internal static string Default_operating_definition_0 { + get { + return ResourceManager.GetString("Default_operating_definition_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Density "{0}" defined by "{1}".. + /// + internal static string Density_0_defined_by_1 { + get { + return ResourceManager.GetString("Density_0_defined_by_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Density description: {0}. + /// + internal static string Density_description_0 { + get { + return ResourceManager.GetString("Density_description_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Density has {0} bits per mm, with {1} tracks in a {2} mm width tape. + /// + internal static string Density_has_0_bits_per_mm__with_1_tracks_in_a_2_mm_width_tape { + get { + return ResourceManager.GetString("Density_has_0_bits_per_mm__with_1_tracks_in_a_2_mm_width_tape", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Density maximum capacity is {0} megabytes. + /// + internal static string Density_maximum_capacity_is_0_megabytes { + get { + return ResourceManager.GetString("Density_maximum_capacity_is_0_megabytes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Descriptor refers to {0} protocol. + /// + internal static string Descriptor_refers_to_0_protocol { + get { + return ResourceManager.GetString("Descriptor_refers_to_0_protocol", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Developer code: {0}. + /// + internal static string Developer_code_0 { + get { + return ResourceManager.GetString("Developer_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device allows reading partial blocks. + /// + internal static string Device_allows_reading_partial_blocks { + get { + return ResourceManager.GetString("Device_allows_reading_partial_blocks", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device allows writing partial blocks. + /// + internal static string Device_allows_writing_partial_blocks { + get { + return ResourceManager.GetString("Device_allows_writing_partial_blocks", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device boot partition 1 is enabled. + /// + internal static string Device_boot_partition_one_is_enabled { + get { + return ResourceManager.GetString("Device_boot_partition_one_is_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device boot partition 2 is enabled. + /// + internal static string Device_boot_partition_two_is_enabled { + get { + return ResourceManager.GetString("Device_boot_partition_two_is_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can achieve a minimum of {0}MB/s reading in DDR 52Mhz mode. + /// + internal static string Device_can_achieve_a_minimum_of_0_MB_s_reading_in_DDR_52Mhz_mode { + get { + return ResourceManager.GetString("Device_can_achieve_a_minimum_of_0_MB_s_reading_in_DDR_52Mhz_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can achieve a minimum of {0}MB/s reading in SDR 26Mhz 4-bit mode. + /// + internal static string Device_can_achieve_a_minimum_of_0_MB_s_reading_in_SDR_26Mhz_4_bit_mode { + get { + return ResourceManager.GetString("Device_can_achieve_a_minimum_of_0_MB_s_reading_in_SDR_26Mhz_4_bit_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can achieve a minimum of {0}MB/s reading in SDR 26Mhz mode. + /// + internal static string Device_can_achieve_a_minimum_of_0_MB_s_reading_in_SDR_26Mhz_mode { + get { + return ResourceManager.GetString("Device_can_achieve_a_minimum_of_0_MB_s_reading_in_SDR_26Mhz_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can achieve a minimum of {0}MB/s reading in SDR 52Mhz mode. + /// + internal static string Device_can_achieve_a_minimum_of_0_MB_s_reading_in_SDR_52Mhz_mode { + get { + return ResourceManager.GetString("Device_can_achieve_a_minimum_of_0_MB_s_reading_in_SDR_52Mhz_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can achieve a minimum of {0}MB/s writing in DDR 52Mhz mode. + /// + internal static string Device_can_achieve_a_minimum_of_0_MB_s_writing_in_DDR_52Mhz_mode { + get { + return ResourceManager.GetString("Device_can_achieve_a_minimum_of_0_MB_s_writing_in_DDR_52Mhz_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can achieve a minimum of {0}MB/s writing in SDR 26Mhz 4-bit mode. + /// + internal static string Device_can_achieve_a_minimum_of_0_MB_s_writing_in_SDR_26Mhz_4_bit_mode { + get { + return ResourceManager.GetString("Device_can_achieve_a_minimum_of_0_MB_s_writing_in_SDR_26Mhz_4_bit_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can achieve a minimum of {0}MB/s writing in SDR 26Mhz mode. + /// + internal static string Device_can_achieve_a_minimum_of_0_MB_s_writing_in_SDR_26Mhz_mode { + get { + return ResourceManager.GetString("Device_can_achieve_a_minimum_of_0_MB_s_writing_in_SDR_26Mhz_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can achieve a minimum of {0}MB/s writing in SDR 52Mhz mode. + /// + internal static string Device_can_achieve_a_minimum_of_0_MB_s_writing_in_SDR_52Mhz_mode { + get { + return ResourceManager.GetString("Device_can_achieve_a_minimum_of_0_MB_s_writing_in_SDR_52Mhz_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can erase a minimum of {0} blocks at a time. + /// + internal static string Device_can_erase_a_minimum_of_0_blocks_at_a_time { + get { + return ResourceManager.GetString("Device_can_erase_a_minimum_of_0_blocks_at_a_time", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can erase multiple blocks. + /// + internal static string Device_can_erase_multiple_blocks { + get { + return ResourceManager.GetString("Device_can_erase_multiple_blocks", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can have enhanced technological features in partitions and user data area. + /// + internal static string Device_can_have_enhanced_technological_features_in_partitions_and_user_data_area { + get { + return ResourceManager.GetString("Device_can_have_enhanced_technological_features_in_partitions_and_user_data_area", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can have extended partitions attribute.. + /// + internal static string Device_can_have_extended_partitions_attribute { + get { + return ResourceManager.GetString("Device_can_have_extended_partitions_attribute", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can switch to work with 1.8V supply. + /// + internal static string Device_can_switch_to_work_with_1_8V_supply { + get { + return ResourceManager.GetString("Device_can_switch_to_work_with_1_8V_supply", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can take a maximum of {0} ms when releasing from an interrupt. + /// + internal static string Device_can_take_a_maximum_of_0_ms_when_releasing_from_an_interrupt { + get { + return ResourceManager.GetString("Device_can_take_a_maximum_of_0_ms_when_releasing_from_an_interrupt", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can take a maximum of {0} ms when switching partitions. + /// + internal static string Device_can_take_a_maximum_of_0_ms_when_switching_partitions { + get { + return ResourceManager.GetString("Device_can_take_a_maximum_of_0_ms_when_switching_partitions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can work with supply 1.65~1.95V. + /// + internal static string Device_can_work_with_supply_1_65_1_95V { + get { + return ResourceManager.GetString("Device_can_work_with_supply_1_65_1_95V", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can work with supply 2.0~2.1V. + /// + internal static string Device_can_work_with_supply_2_0_2_1V { + get { + return ResourceManager.GetString("Device_can_work_with_supply_2_0_2_1V", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can work with supply 2.1~2.2V. + /// + internal static string Device_can_work_with_supply_2_1_2_2V { + get { + return ResourceManager.GetString("Device_can_work_with_supply_2_1_2_2V", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can work with supply 2.2~2.3V. + /// + internal static string Device_can_work_with_supply_2_2_2_3V { + get { + return ResourceManager.GetString("Device_can_work_with_supply_2_2_2_3V", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can work with supply 2.3~2.4V. + /// + internal static string Device_can_work_with_supply_2_3_2_4V { + get { + return ResourceManager.GetString("Device_can_work_with_supply_2_3_2_4V", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can work with supply 2.4~2.5V. + /// + internal static string Device_can_work_with_supply_2_4_2_5V { + get { + return ResourceManager.GetString("Device_can_work_with_supply_2_4_2_5V", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can work with supply 2.5~2.6V. + /// + internal static string Device_can_work_with_supply_2_5_2_6V { + get { + return ResourceManager.GetString("Device_can_work_with_supply_2_5_2_6V", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can work with supply 2.6~2.7V. + /// + internal static string Device_can_work_with_supply_2_6_2_7V { + get { + return ResourceManager.GetString("Device_can_work_with_supply_2_6_2_7V", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can work with supply 2.7~2.8V. + /// + internal static string Device_can_work_with_supply_2_7_2_8V { + get { + return ResourceManager.GetString("Device_can_work_with_supply_2_7_2_8V", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can work with supply 2.8~2.9V. + /// + internal static string Device_can_work_with_supply_2_8_2_9V { + get { + return ResourceManager.GetString("Device_can_work_with_supply_2_8_2_9V", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can work with supply 2.9~3.0V. + /// + internal static string Device_can_work_with_supply_2_9_3_0V { + get { + return ResourceManager.GetString("Device_can_work_with_supply_2_9_3_0V", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can work with supply 3.1~3.2V. + /// + internal static string Device_can_work_with_supply_3_1_3_2V { + get { + return ResourceManager.GetString("Device_can_work_with_supply_3_1_3_2V", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can work with supply 3.2~3.3V. + /// + internal static string Device_can_work_with_supply_3_2_3_3V { + get { + return ResourceManager.GetString("Device_can_work_with_supply_3_2_3_3V", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can work with supply 3.3~3.4V. + /// + internal static string Device_can_work_with_supply_3_3_3_4V { + get { + return ResourceManager.GetString("Device_can_work_with_supply_3_3_3_4V", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can work with supply 3.4~3.5V. + /// + internal static string Device_can_work_with_supply_3_4_3_5V { + get { + return ResourceManager.GetString("Device_can_work_with_supply_3_4_3_5V", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can work with supply 3.5~3.6V. + /// + internal static string Device_can_work_with_supply_3_5_3_6V { + get { + return ResourceManager.GetString("Device_can_work_with_supply_3_5_3_6V", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can write protect a minimum of {0} blocks at a time. + /// + internal static string Device_can_write_protect_a_minimum_of_0_blocks_at_a_time { + get { + return ResourceManager.GetString("Device_can_write_protect_a_minimum_of_0_blocks_at_a_time", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can write protect regions. + /// + internal static string Device_can_write_protect_regions { + get { + return ResourceManager.GetString("Device_can_write_protect_regions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device cannot achieve 2.4MB/s reading in SDR 26Mhz 4-bit mode. + /// + internal static string Device_cannot_achieve_2_4MB_s_reading_in_SDR_26Mhz_4_bit_mode { + get { + return ResourceManager.GetString("Device_cannot_achieve_2_4MB_s_reading_in_SDR_26Mhz_4_bit_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device cannot achieve 2.4MB/s reading in SDR 26Mhz mode. + /// + internal static string Device_cannot_achieve_2_4MB_s_reading_in_SDR_26Mhz_mode { + get { + return ResourceManager.GetString("Device_cannot_achieve_2_4MB_s_reading_in_SDR_26Mhz_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device cannot achieve 2.4MB/s reading in SDR 52Mhz mode. + /// + internal static string Device_cannot_achieve_2_4MB_s_reading_in_SDR_52Mhz_mode { + get { + return ResourceManager.GetString("Device_cannot_achieve_2_4MB_s_reading_in_SDR_52Mhz_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device cannot achieve 2.4MB/s writing in SDR 26Mhz 4-bit mode. + /// + internal static string Device_cannot_achieve_2_4MB_s_writing_in_SDR_26Mhz_4_bit_mode { + get { + return ResourceManager.GetString("Device_cannot_achieve_2_4MB_s_writing_in_SDR_26Mhz_4_bit_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device cannot achieve 2.4MB/s writing in SDR 26Mhz mode. + /// + internal static string Device_cannot_achieve_2_4MB_s_writing_in_SDR_26Mhz_mode { + get { + return ResourceManager.GetString("Device_cannot_achieve_2_4MB_s_writing_in_SDR_26Mhz_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device cannot achieve 2.4MB/s writing in SDR 52Mhz mode. + /// + internal static string Device_cannot_achieve_2_4MB_s_writing_in_SDR_52Mhz_mode { + get { + return ResourceManager.GetString("Device_cannot_achieve_2_4MB_s_writing_in_SDR_52Mhz_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device cannot achieve 4.8MB/s reading in DDR 52Mhz mode. + /// + internal static string Device_cannot_achieve_4_8MB_s_reading_in_DDR_52Mhz_mode { + get { + return ResourceManager.GetString("Device_cannot_achieve_4_8MB_s_reading_in_DDR_52Mhz_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device cannot achieve 4.8MB/s writing in DDR 52Mhz mode. + /// + internal static string Device_cannot_achieve_4_8MB_s_writing_in_DDR_52Mhz_mode { + get { + return ResourceManager.GetString("Device_cannot_achieve_4_8MB_s_writing_in_DDR_52Mhz_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device can't write protect regions. + /// + internal static string Device_cant_write_protect_regions { + get { + return ResourceManager.GetString("Device_cant_write_protect_regions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device capabilities:. + /// + internal static string Device_capabilities { + get { + return ResourceManager.GetString("Device_capabilities", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device checks the logical block application tag. + /// + internal static string Device_checks_the_logical_block_application_tag { + get { + return ResourceManager.GetString("Device_checks_the_logical_block_application_tag", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device checks the logical block guard. + /// + internal static string Device_checks_the_logical_block_guard { + get { + return ResourceManager.GetString("Device_checks_the_logical_block_guard", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device checks the logical block reference tag. + /// + internal static string Device_checks_the_logical_block_reference_tag { + get { + return ResourceManager.GetString("Device_checks_the_logical_block_reference_tag", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device claims to comply ECMA-111: Small Computer System Interface SCSI. + /// + internal static string Device_claims_to_comply_ECMA_111_Small_Computer_System_Interface_SCSI { + get { + return ResourceManager.GetString("Device_claims_to_comply_ECMA_111_Small_Computer_System_Interface_SCSI", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device claims to comply with ANSI X3.131:1986 (SCSI-1). + /// + internal static string Device_claims_to_comply_with_ANSI_X3_131_1986_SCSI_1 { + get { + return ResourceManager.GetString("Device_claims_to_comply_with_ANSI_X3_131_1986_SCSI_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device claims to comply with ANSI X3.131:1994 (SCSI-2). + /// + internal static string Device_claims_to_comply_with_ANSI_X3_131_1994_SCSI_2 { + get { + return ResourceManager.GetString("Device_claims_to_comply_with_ANSI_X3_131_1994_SCSI_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device claims to comply with ANSI X3.301:1997 (SPC-1). + /// + internal static string Device_claims_to_comply_with_ANSI_X3_301_1997_SPC_1 { + get { + return ResourceManager.GetString("Device_claims_to_comply_with_ANSI_X3_301_1997_SPC_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device claims to comply with ANSI X3.351:2001 (SPC-2). + /// + internal static string Device_claims_to_comply_with_ANSI_X3_351_2001_SPC_2 { + get { + return ResourceManager.GetString("Device_claims_to_comply_with_ANSI_X3_351_2001_SPC_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device claims to comply with ANSI X3.408:2005 (SPC-3). + /// + internal static string Device_claims_to_comply_with_ANSI_X3_408_2005_SPC_3 { + get { + return ResourceManager.GetString("Device_claims_to_comply_with_ANSI_X3_408_2005_SPC_3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device claims to comply with ANSI X3.408:2005 (SPC-4). + /// + internal static string Device_claims_to_comply_with_ANSI_X3_408_2005_SPC_4 { + get { + return ResourceManager.GetString("Device_claims_to_comply_with_ANSI_X3_408_2005_SPC_4", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device claims to comply with ISO/IEC 9316:1995. + /// + internal static string Device_claims_to_comply_with_ISO_IEC_9316_1995 { + get { + return ResourceManager.GetString("Device_claims_to_comply_with_ISO_IEC_9316_1995", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device claims to comply with unknown SCSI ANSI standard value 0x{0:X2}). + /// + internal static string Device_claims_to_comply_with_unknown_SCSI_ANSI_standard_value_0 { + get { + return ResourceManager.GetString("Device_claims_to_comply_with_unknown_SCSI_ANSI_standard_value_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device claims to comply with unknown SCSI ECMA standard value 0x{0:X2}). + /// + internal static string Device_claims_to_comply_with_unknown_SCSI_ECMA_standard_value_0 { + get { + return ResourceManager.GetString("Device_claims_to_comply_with_unknown_SCSI_ECMA_standard_value_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device claims to comply with unknown SCSI ISO/IEC standard value 0x{0:X2}). + /// + internal static string Device_claims_to_comply_with_unknown_SCSI_ISO_IEC_standard_value_0 { + get { + return ResourceManager.GetString("Device_claims_to_comply_with_unknown_SCSI_ISO_IEC_standard_value_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device clears any unit attention condition in all LUNs after reporting for any LUN. + /// + internal static string Device_clears_any_unit_attention_condition_in_all_LUNs_after_reporting_for_any_LUN { + get { + return ResourceManager.GetString("Device_clears_any_unit_attention_condition_in_all_LUNs_after_reporting_for_any_LU" + + "N", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ACS-2 ANSI INCITS 482-2013. + /// + internal static string Device_complies_with_ACS_2_ANSI_INCITS_482_2013 { + get { + return ResourceManager.GetString("Device_complies_with_ACS_2_ANSI_INCITS_482_2013", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ACS-2 (no version claimed). + /// + internal static string Device_complies_with_ACS_2_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_ACS_2_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ACS-3 (no version claimed). + /// + internal static string Device_complies_with_ACS_3_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_ACS_3_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ADC-2 ANSI INCITS 441-2008. + /// + internal static string Device_complies_with_ADC_2_ANSI_INCITS_441_2008 { + get { + return ResourceManager.GetString("Device_complies_with_ADC_2_ANSI_INCITS_441_2008", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ADC-2 (no version claimed). + /// + internal static string Device_complies_with_ADC_2_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_ADC_2_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ADC-2 T10/1741-D revision 7. + /// + internal static string Device_complies_with_ADC_2_T10_1741_D_revision_7 { + get { + return ResourceManager.GetString("Device_complies_with_ADC_2_T10_1741_D_revision_7", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ADC-2 T10/1741-D revision 8. + /// + internal static string Device_complies_with_ADC_2_T10_1741_D_revision_8 { + get { + return ResourceManager.GetString("Device_complies_with_ADC_2_T10_1741_D_revision_8", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ADC-3 ANSI INCITS 497-2012. + /// + internal static string Device_complies_with_ADC_3_ANSI_INCITS_497_2012 { + get { + return ResourceManager.GetString("Device_complies_with_ADC_3_ANSI_INCITS_497_2012", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ADC-3 (no version claimed). + /// + internal static string Device_complies_with_ADC_3_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_ADC_3_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ADC-3 T10/1895-D revision 04. + /// + internal static string Device_complies_with_ADC_3_T10_1895_D_revision_04 { + get { + return ResourceManager.GetString("Device_complies_with_ADC_3_T10_1895_D_revision_04", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ADC-3 T10/1895-D revision 05. + /// + internal static string Device_complies_with_ADC_3_T10_1895_D_revision_05 { + get { + return ResourceManager.GetString("Device_complies_with_ADC_3_T10_1895_D_revision_05", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ADC-3 T10/1895-D revision 05a. + /// + internal static string Device_complies_with_ADC_3_T10_1895_D_revision_05a { + get { + return ResourceManager.GetString("Device_complies_with_ADC_3_T10_1895_D_revision_05a", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ADC-4 (no version claimed). + /// + internal static string Device_complies_with_ADC_4_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_ADC_4_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ADC ANSI INCITS 403-2005. + /// + internal static string Device_complies_with_ADC_ANSI_INCITS_403_2005 { + get { + return ResourceManager.GetString("Device_complies_with_ADC_ANSI_INCITS_403_2005", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ADC (no version claimed). + /// + internal static string Device_complies_with_ADC_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_ADC_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ADC T10/1558-D revision 6. + /// + internal static string Device_complies_with_ADC_T10_1558_D_revision_6 { + get { + return ResourceManager.GetString("Device_complies_with_ADC_T10_1558_D_revision_6", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ADC T10/1558-D revision 7. + /// + internal static string Device_complies_with_ADC_T10_1558_D_revision_7 { + get { + return ResourceManager.GetString("Device_complies_with_ADC_T10_1558_D_revision_7", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ADP (no version claimed). + /// + internal static string Device_complies_with_ADP_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_ADP_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ADT-2 ANSI INCITS 472-2011. + /// + internal static string Device_complies_with_ADT_2_ANSI_INCITS_472_2011 { + get { + return ResourceManager.GetString("Device_complies_with_ADT_2_ANSI_INCITS_472_2011", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ADT-2 (no version claimed). + /// + internal static string Device_complies_with_ADT_2_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_ADT_2_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ADT-2 T10/1742-D revision 06. + /// + internal static string Device_complies_with_ADT_2_T10_1742_D_revision_06 { + get { + return ResourceManager.GetString("Device_complies_with_ADT_2_T10_1742_D_revision_06", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ADT-2 T10/1742-D revision 08. + /// + internal static string Device_complies_with_ADT_2_T10_1742_D_revision_08 { + get { + return ResourceManager.GetString("Device_complies_with_ADT_2_T10_1742_D_revision_08", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ADT-2 T10/1742-D revision 09. + /// + internal static string Device_complies_with_ADT_2_T10_1742_D_revision_09 { + get { + return ResourceManager.GetString("Device_complies_with_ADT_2_T10_1742_D_revision_09", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ADT-3 (no version claimed). + /// + internal static string Device_complies_with_ADT_3_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_ADT_3_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ADT ANSI INCITS 406-2005. + /// + internal static string Device_complies_with_ADT_ANSI_INCITS_406_2005 { + get { + return ResourceManager.GetString("Device_complies_with_ADT_ANSI_INCITS_406_2005", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ADT (no version claimed). + /// + internal static string Device_complies_with_ADT_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_ADT_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ADT T10/1557-D revision 11. + /// + internal static string Device_complies_with_ADT_T10_1557_D_revision_11 { + get { + return ResourceManager.GetString("Device_complies_with_ADT_T10_1557_D_revision_11", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ADT T10/1557-D revision 14. + /// + internal static string Device_complies_with_ADT_T10_1557_D_revision_14 { + get { + return ResourceManager.GetString("Device_complies_with_ADT_T10_1557_D_revision_14", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ANSI IEEE 1394-1995. + /// + internal static string Device_complies_with_ANSI_IEEE_1394_1995 { + get { + return ResourceManager.GetString("Device_complies_with_ANSI_IEEE_1394_1995", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ATA/ATAPI-6 ANSI INCITS 361-2002. + /// + internal static string Device_complies_with_ATA_ATAPI_6_ANSI_INCITS_361_2002 { + get { + return ResourceManager.GetString("Device_complies_with_ATA_ATAPI_6_ANSI_INCITS_361_2002", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ATA/ATAPI-6 (no version claimed). + /// + internal static string Device_complies_with_ATA_ATAPI_6_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_ATA_ATAPI_6_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ATA/ATAPI-7 ANSI INCITS 397-2005. + /// + internal static string Device_complies_with_ATA_ATAPI_7_ANSI_INCITS_397_2005 { + get { + return ResourceManager.GetString("Device_complies_with_ATA_ATAPI_7_ANSI_INCITS_397_2005", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ATA/ATAPI-7 ISO/IEC 24739. + /// + internal static string Device_complies_with_ATA_ATAPI_7_ISO_IEC_24739 { + get { + return ResourceManager.GetString("Device_complies_with_ATA_ATAPI_7_ISO_IEC_24739", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ATA/ATAPI-7 (no version claimed). + /// + internal static string Device_complies_with_ATA_ATAPI_7_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_ATA_ATAPI_7_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ATA/ATAPI-7 T13/1532-D revision 3. + /// + internal static string Device_complies_with_ATA_ATAPI_7_T13_1532_D_revision_3 { + get { + return ResourceManager.GetString("Device_complies_with_ATA_ATAPI_7_T13_1532_D_revision_3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ATA/ATAPI-8 ATA8-AAM ANSI INCITS 451-2008. + /// + internal static string Device_complies_with_ATA_ATAPI_8_ATA8_AAM_ANSI_INCITS_451_2008 { + get { + return ResourceManager.GetString("Device_complies_with_ATA_ATAPI_8_ATA8_AAM_ANSI_INCITS_451_2008", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ATA/ATAPI-8 ATA8-AAM (no version claimed). + /// + internal static string Device_complies_with_ATA_ATAPI_8_ATA8_AAM_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_ATA_ATAPI_8_ATA8_AAM_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ATA/ATAPI-8 ATA8-ACS ANSI INCITS 452-2009 w/ Amendment 1. + /// + internal static string Device_complies_with_ATA_ATAPI_8_ATA8_ACS_ANSI_INCITS_452_2009_w__Amendment_1 { + get { + return ResourceManager.GetString("Device_complies_with_ATA_ATAPI_8_ATA8_ACS_ANSI_INCITS_452_2009_w__Amendment_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ATA/ATAPI-8 ATA8-ACS ATA/ATAPI Command Set (no version claimed). + /// + internal static string Device_complies_with_ATA_ATAPI_8_ATA8_ACS_ATA_ATAPI_Command_Set_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_ATA_ATAPI_8_ATA8_ACS_ATA_ATAPI_Command_Set_no_version_claime" + + "d", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ATA/ATAPI-8 ATA8-APT Parallel Transport (no version claimed). + /// + internal static string Device_complies_with_ATA_ATAPI_8_ATA8_APT_Parallel_Transport_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_ATA_ATAPI_8_ATA8_APT_Parallel_Transport_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ATA/ATAPI-8 ATA8-AST Serial Transport (no version claimed). + /// + internal static string Device_complies_with_ATA_ATAPI_8_ATA8_AST_Serial_Transport_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_ATA_ATAPI_8_ATA8_AST_Serial_Transport_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with BCC (no version claimed). + /// + internal static string Device_complies_with_BCC_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_BCC_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with EPI ANSI INCITS TR-23 1999. + /// + internal static string Device_complies_with_EPI_ANSI_INCITS_TR_23_1999 { + get { + return ResourceManager.GetString("Device_complies_with_EPI_ANSI_INCITS_TR_23_1999", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with EPI (no version claimed). + /// + internal static string Device_complies_with_EPI_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_EPI_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with EPI T10/1134 revision 16. + /// + internal static string Device_complies_with_EPI_T10_1134_revision_16 { + get { + return ResourceManager.GetString("Device_complies_with_EPI_T10_1134_revision_16", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with Fast-20 ANSI INCITS 277-1996. + /// + internal static string Device_complies_with_Fast_20_ANSI_INCITS_277_1996 { + get { + return ResourceManager.GetString("Device_complies_with_Fast_20_ANSI_INCITS_277_1996", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with Fast-20 (no version claimed). + /// + internal static string Device_complies_with_Fast_20_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_Fast_20_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with Fast-20 T10/1071 revision 06. + /// + internal static string Device_complies_with_Fast_20_T10_1071_revision_06 { + get { + return ResourceManager.GetString("Device_complies_with_Fast_20_T10_1071_revision_06", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC 10GFC ANSI INCITS 364-2003. + /// + internal static string Device_complies_with_FC_10GFC_ANSI_INCITS_364_2003 { + get { + return ResourceManager.GetString("Device_complies_with_FC_10GFC_ANSI_INCITS_364_2003", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC 10GFC ANSI INCITS 364-2003 with AM1 ANSI INCITS 364/AM1-2007. + /// + internal static string Device_complies_with_FC_10GFC_ANSI_INCITS_364_2003_with_AM1_ANSI_INCITS_364_AM1_2007 { + get { + return ResourceManager.GetString("Device_complies_with_FC_10GFC_ANSI_INCITS_364_2003_with_AM1_ANSI_INCITS_364_AM1_2" + + "007", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC 10GFC ISO/IEC 14165-116. + /// + internal static string Device_complies_with_FC_10GFC_ISO_IEC_14165_116 { + get { + return ResourceManager.GetString("Device_complies_with_FC_10GFC_ISO_IEC_14165_116", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC 10GFC ISO/IEC 14165-116 with AM1. + /// + internal static string Device_complies_with_FC_10GFC_ISO_IEC_14165_116_with_AM1 { + get { + return ResourceManager.GetString("Device_complies_with_FC_10GFC_ISO_IEC_14165_116_with_AM1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC 10GFC (no version claimed). + /// + internal static string Device_complies_with_FC_10GFC_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_FC_10GFC_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-AL-2 ANSI INCITS 332-1999. + /// + internal static string Device_complies_with_FC_AL_2_ANSI_INCITS_332_1999 { + get { + return ResourceManager.GetString("Device_complies_with_FC_AL_2_ANSI_INCITS_332_1999", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-AL-2 ANSI INCITS 332-1999 with AM1-2003 & AM2-2006. + /// + internal static string Device_complies_with_FC_AL_2_ANSI_INCITS_332_1999_with_AM1_2003___AM2_2006 { + get { + return ResourceManager.GetString("Device_complies_with_FC_AL_2_ANSI_INCITS_332_1999_with_AM1_2003___AM2_2006", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-AL-2 ANSI INCITS 332-1999 with Amnd 1 AM1-2003. + /// + internal static string Device_complies_with_FC_AL_2_ANSI_INCITS_332_1999_with_Amnd_1_AM1_2003 { + get { + return ResourceManager.GetString("Device_complies_with_FC_AL_2_ANSI_INCITS_332_1999_with_Amnd_1_AM1_2003", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-AL-2 ANSI INCITS 332-1999 with Amnd 2 AM2-2006. + /// + internal static string Device_complies_with_FC_AL_2_ANSI_INCITS_332_1999_with_Amnd_2_AM2_2006 { + get { + return ResourceManager.GetString("Device_complies_with_FC_AL_2_ANSI_INCITS_332_1999_with_Amnd_2_AM2_2006", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-AL-2 ISO/IEC 14165-122 with AM1 & AM2. + /// + internal static string Device_complies_with_FC_AL_2_ISO_IEC_14165_122_with_AM1___AM2 { + get { + return ResourceManager.GetString("Device_complies_with_FC_AL_2_ISO_IEC_14165_122_with_AM1___AM2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-AL-2 (no version claimed). + /// + internal static string Device_complies_with_FC_AL_2_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_FC_AL_2_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-AL-2 T11/1133-D revision 7.0. + /// + internal static string Device_complies_with_FC_AL_2_T11_1133_D_revision_7_0 { + get { + return ResourceManager.GetString("Device_complies_with_FC_AL_2_T11_1133_D_revision_7_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-AL ANSI INCITS 272-1996. + /// + internal static string Device_complies_with_FC_AL_ANSI_INCITS_272_1996 { + get { + return ResourceManager.GetString("Device_complies_with_FC_AL_ANSI_INCITS_272_1996", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-AL (no version claimed). + /// + internal static string Device_complies_with_FC_AL_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_FC_AL_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-DA-2 INCITS TR-49 2012. + /// + internal static string Device_complies_with_FC_DA_2_INCITS_TR_49_2012 { + get { + return ResourceManager.GetString("Device_complies_with_FC_DA_2_INCITS_TR_49_2012", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-DA-2 (no version claimed). + /// + internal static string Device_complies_with_FC_DA_2_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_FC_DA_2_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-DA-2 T11/1870DT revision 1.04. + /// + internal static string Device_complies_with_FC_DA_2_T11_1870DT_revision_1_04 { + get { + return ResourceManager.GetString("Device_complies_with_FC_DA_2_T11_1870DT_revision_1_04", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-DA-2 T11/1870DT revision 1.06. + /// + internal static string Device_complies_with_FC_DA_2_T11_1870DT_revision_1_06 { + get { + return ResourceManager.GetString("Device_complies_with_FC_DA_2_T11_1870DT_revision_1_06", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-DA ANSI INCITS TR-36 2004. + /// + internal static string Device_complies_with_FC_DA_ANSI_INCITS_TR_36_2004 { + get { + return ResourceManager.GetString("Device_complies_with_FC_DA_ANSI_INCITS_TR_36_2004", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-DA ISO/IEC 14165-341. + /// + internal static string Device_complies_with_FC_DA_ISO_IEC_14165_341 { + get { + return ResourceManager.GetString("Device_complies_with_FC_DA_ISO_IEC_14165_341", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-DA (no version claimed). + /// + internal static string Device_complies_with_FC_DA_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_FC_DA_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-DA T11/1513-DT revision 3.1. + /// + internal static string Device_complies_with_FC_DA_T11_1513_DT_revision_3_1 { + get { + return ResourceManager.GetString("Device_complies_with_FC_DA_T11_1513_DT_revision_3_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-FLA ANSI INCITS TR-20 1998. + /// + internal static string Device_complies_with_FC_FLA_ANSI_INCITS_TR_20_1998 { + get { + return ResourceManager.GetString("Device_complies_with_FC_FLA_ANSI_INCITS_TR_20_1998", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-FLA (no version claimed). + /// + internal static string Device_complies_with_FC_FLA_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_FC_FLA_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-FLA T11/1235 revision 7. + /// + internal static string Device_complies_with_FC_FLA_T11_1235_revision_7 { + get { + return ResourceManager.GetString("Device_complies_with_FC_FLA_T11_1235_revision_7", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-FS-2 ANSI INCITS 242-2007. + /// + internal static string Device_complies_with_FC_FS_2_ANSI_INCITS_242_2007 { + get { + return ResourceManager.GetString("Device_complies_with_FC_FS_2_ANSI_INCITS_242_2007", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-FS-2 ANSI INCITS 242-2007 with AM1 ANSI INCITS 242/AM1-2007. + /// + internal static string Device_complies_with_FC_FS_2_ANSI_INCITS_242_2007_with_AM1_ANSI_INCITS_242_AM1_2007 { + get { + return ResourceManager.GetString("Device_complies_with_FC_FS_2_ANSI_INCITS_242_2007_with_AM1_ANSI_INCITS_242_AM1_20" + + "07", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-FS-2 (no version claimed). + /// + internal static string Device_complies_with_FC_FS_2_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_FC_FS_2_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-FS-3 ANSI INCITS 470-2011. + /// + internal static string Device_complies_with_FC_FS_3_ANSI_INCITS_470_2011 { + get { + return ResourceManager.GetString("Device_complies_with_FC_FS_3_ANSI_INCITS_470_2011", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-FS-3 (no version claimed). + /// + internal static string Device_complies_with_FC_FS_3_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_FC_FS_3_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-FS-3 T11/1861-D revision 0.9. + /// + internal static string Device_complies_with_FC_FS_3_T11_1861_D_revision_0_9 { + get { + return ResourceManager.GetString("Device_complies_with_FC_FS_3_T11_1861_D_revision_0_9", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-FS-3 T11/1861-D revision 1.0. + /// + internal static string Device_complies_with_FC_FS_3_T11_1861_D_revision_1_0 { + get { + return ResourceManager.GetString("Device_complies_with_FC_FS_3_T11_1861_D_revision_1_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-FS-3 T11/1861-D revision 1.10. + /// + internal static string Device_complies_with_FC_FS_3_T11_1861_D_revision_1_10 { + get { + return ResourceManager.GetString("Device_complies_with_FC_FS_3_T11_1861_D_revision_1_10", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-FS-4 (no version claimed). + /// + internal static string Device_complies_with_FC_FS_4_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_FC_FS_4_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-FS ANSI INCITS 373-2003. + /// + internal static string Device_complies_with_FC_FS_ANSI_INCITS_373_2003 { + get { + return ResourceManager.GetString("Device_complies_with_FC_FS_ANSI_INCITS_373_2003", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-FS ISO/IEC 14165-251. + /// + internal static string Device_complies_with_FC_FS_ISO_IEC_14165_251 { + get { + return ResourceManager.GetString("Device_complies_with_FC_FS_ISO_IEC_14165_251", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-FS (no version claimed). + /// + internal static string Device_complies_with_FC_FS_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_FC_FS_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-FS T11/1331-D revision 1.2. + /// + internal static string Device_complies_with_FC_FS_T11_1331_D_revision_1_2 { + get { + return ResourceManager.GetString("Device_complies_with_FC_FS_T11_1331_D_revision_1_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-FS T11/1331-D revision 1.7. + /// + internal static string Device_complies_with_FC_FS_T11_1331_D_revision_1_7 { + get { + return ResourceManager.GetString("Device_complies_with_FC_FS_T11_1331_D_revision_1_7", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-LS-2 ANSI INCITS 477-2011. + /// + internal static string Device_complies_with_FC_LS_2_ANSI_INCITS_477_2011 { + get { + return ResourceManager.GetString("Device_complies_with_FC_LS_2_ANSI_INCITS_477_2011", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-LS-2 (no version claimed). + /// + internal static string Device_complies_with_FC_LS_2_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_FC_LS_2_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-LS-2 T11/2103-D revision 2.11. + /// + internal static string Device_complies_with_FC_LS_2_T11_2103_D_revision_2_11 { + get { + return ResourceManager.GetString("Device_complies_with_FC_LS_2_T11_2103_D_revision_2_11", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-LS-2 T11/2103-D revision 2.21. + /// + internal static string Device_complies_with_FC_LS_2_T11_2103_D_revision_2_21 { + get { + return ResourceManager.GetString("Device_complies_with_FC_LS_2_T11_2103_D_revision_2_21", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-LS-3 (no version claimed). + /// + internal static string Device_complies_with_FC_LS_3_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_FC_LS_3_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-LS ANSI INCITS 433-2007. + /// + internal static string Device_complies_with_FC_LS_ANSI_INCITS_433_2007 { + get { + return ResourceManager.GetString("Device_complies_with_FC_LS_ANSI_INCITS_433_2007", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-LS (no version claimed). + /// + internal static string Device_complies_with_FC_LS_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_FC_LS_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-LS T11/1620-D revision 1.62. + /// + internal static string Device_complies_with_FC_LS_T11_1620_D_revision_1_62 { + get { + return ResourceManager.GetString("Device_complies_with_FC_LS_T11_1620_D_revision_1_62", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-PH-3 ANSI INCITS 303-1998. + /// + internal static string Device_complies_with_FC_PH_3_ANSI_INCITS_303_1998 { + get { + return ResourceManager.GetString("Device_complies_with_FC_PH_3_ANSI_INCITS_303_1998", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-PH-3 (no version claimed). + /// + internal static string Device_complies_with_FC_PH_3_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_FC_PH_3_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-PH ANSI INCITS 230-1994. + /// + internal static string Device_complies_with_FC_PH_ANSI_INCITS_230_1994 { + get { + return ResourceManager.GetString("Device_complies_with_FC_PH_ANSI_INCITS_230_1994", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-PH ANSI INCITS 230-1994 with Amnd 1 ANSI INCITS 230/AM1-1996. + /// + internal static string Device_complies_with_FC_PH_ANSI_INCITS_230_1994_with_Amnd_1_ANSI_INCITS_230_AM1_1996 { + get { + return ResourceManager.GetString("Device_complies_with_FC_PH_ANSI_INCITS_230_1994_with_Amnd_1_ANSI_INCITS_230_AM1_1" + + "996", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-PH (no version claimed). + /// + internal static string Device_complies_with_FC_PH_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_FC_PH_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-PI-2 ANSI INCITS 404-2006. + /// + internal static string Device_complies_with_FC_PI_2_ANSI_INCITS_404_2006 { + get { + return ResourceManager.GetString("Device_complies_with_FC_PI_2_ANSI_INCITS_404_2006", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-PI-2 (no version claimed). + /// + internal static string Device_complies_with_FC_PI_2_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_FC_PI_2_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-PI-2 T11/1506-D revision 5.0. + /// + internal static string Device_complies_with_FC_PI_2_T11_1506_D_revision_5_0 { + get { + return ResourceManager.GetString("Device_complies_with_FC_PI_2_T11_1506_D_revision_5_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-PI-3 ANSI INCITS 460-2011. + /// + internal static string Device_complies_with_FC_PI_3_ANSI_INCITS_460_2011 { + get { + return ResourceManager.GetString("Device_complies_with_FC_PI_3_ANSI_INCITS_460_2011", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-PI-3 (no version claimed). + /// + internal static string Device_complies_with_FC_PI_3_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_FC_PI_3_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-PI-3 T11/1625-D revision 2.0. + /// + internal static string Device_complies_with_FC_PI_3_T11_1625_D_revision_2_0 { + get { + return ResourceManager.GetString("Device_complies_with_FC_PI_3_T11_1625_D_revision_2_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-PI-3 T11/1625-D revision 2.1. + /// + internal static string Device_complies_with_FC_PI_3_T11_1625_D_revision_2_1 { + get { + return ResourceManager.GetString("Device_complies_with_FC_PI_3_T11_1625_D_revision_2_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-PI-3 T11/1625-D revision 4.0. + /// + internal static string Device_complies_with_FC_PI_3_T11_1625_D_revision_4_0 { + get { + return ResourceManager.GetString("Device_complies_with_FC_PI_3_T11_1625_D_revision_4_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-PI-4 ANSI INCITS 450-2009. + /// + internal static string Device_complies_with_FC_PI_4_ANSI_INCITS_450_2009 { + get { + return ResourceManager.GetString("Device_complies_with_FC_PI_4_ANSI_INCITS_450_2009", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-PI-4 (no version claimed). + /// + internal static string Device_complies_with_FC_PI_4_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_FC_PI_4_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-PI-4 T11/1647-D revision 8.0. + /// + internal static string Device_complies_with_FC_PI_4_T11_1647_D_revision_8_0 { + get { + return ResourceManager.GetString("Device_complies_with_FC_PI_4_T11_1647_D_revision_8_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-PI-5 ANSI INCITS 479-2011. + /// + internal static string Device_complies_with_FC_PI_5_ANSI_INCITS_479_2011 { + get { + return ResourceManager.GetString("Device_complies_with_FC_PI_5_ANSI_INCITS_479_2011", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-PI-5 (no version claimed). + /// + internal static string Device_complies_with_FC_PI_5_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_FC_PI_5_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-PI-5 T11/2118-D revision 2.00. + /// + internal static string Device_complies_with_FC_PI_5_T11_2118_D_revision_2_00 { + get { + return ResourceManager.GetString("Device_complies_with_FC_PI_5_T11_2118_D_revision_2_00", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-PI-5 T11/2118-D revision 3.00. + /// + internal static string Device_complies_with_FC_PI_5_T11_2118_D_revision_3_00 { + get { + return ResourceManager.GetString("Device_complies_with_FC_PI_5_T11_2118_D_revision_3_00", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-PI-5 T11/2118-D revision 6.00. + /// + internal static string Device_complies_with_FC_PI_5_T11_2118_D_revision_6_00 { + get { + return ResourceManager.GetString("Device_complies_with_FC_PI_5_T11_2118_D_revision_6_00", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-PI-5 T11/2118-D revision 6.10. + /// + internal static string Device_complies_with_FC_PI_5_T11_2118_D_revision_6_10 { + get { + return ResourceManager.GetString("Device_complies_with_FC_PI_5_T11_2118_D_revision_6_10", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-PI-6 (no version claimed). + /// + internal static string Device_complies_with_FC_PI_6_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_FC_PI_6_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-PI ANSI INCITS 352-2002. + /// + internal static string Device_complies_with_FC_PI_ANSI_INCITS_352_2002 { + get { + return ResourceManager.GetString("Device_complies_with_FC_PI_ANSI_INCITS_352_2002", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-PI (no version claimed). + /// + internal static string Device_complies_with_FC_PI_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_FC_PI_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-PLDA ANSI INCITS TR-19 1998. + /// + internal static string Device_complies_with_FC_PLDA_ANSI_INCITS_TR_19_1998 { + get { + return ResourceManager.GetString("Device_complies_with_FC_PLDA_ANSI_INCITS_TR_19_1998", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-PLDA (no version claimed). + /// + internal static string Device_complies_with_FC_PLDA_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_FC_PLDA_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-PLDA T11/1162 revision 2.1. + /// + internal static string Device_complies_with_FC_PLDA_T11_1162_revision_2_1 { + get { + return ResourceManager.GetString("Device_complies_with_FC_PLDA_T11_1162_revision_2_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-SCM INCITS TR-47 2012. + /// + internal static string Device_complies_with_FC_SCM_INCITS_TR_47_2012 { + get { + return ResourceManager.GetString("Device_complies_with_FC_SCM_INCITS_TR_47_2012", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-SCM (no version claimed). + /// + internal static string Device_complies_with_FC_SCM_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_FC_SCM_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-SCM T11/1824DT revision 1.0. + /// + internal static string Device_complies_with_FC_SCM_T11_1824DT_revision_1_0 { + get { + return ResourceManager.GetString("Device_complies_with_FC_SCM_T11_1824DT_revision_1_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-SCM T11/1824DT revision 1.1. + /// + internal static string Device_complies_with_FC_SCM_T11_1824DT_revision_1_1 { + get { + return ResourceManager.GetString("Device_complies_with_FC_SCM_T11_1824DT_revision_1_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-SCM T11/1824DT revision 1.4. + /// + internal static string Device_complies_with_FC_SCM_T11_1824DT_revision_1_4 { + get { + return ResourceManager.GetString("Device_complies_with_FC_SCM_T11_1824DT_revision_1_4", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-SP-2 (no version claimed). + /// + internal static string Device_complies_with_FC_SP_2_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_FC_SP_2_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-SP ANSI INCITS 426-2007. + /// + internal static string Device_complies_with_FC_SP_ANSI_INCITS_426_2007 { + get { + return ResourceManager.GetString("Device_complies_with_FC_SP_ANSI_INCITS_426_2007", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-SP (no version claimed). + /// + internal static string Device_complies_with_FC_SP_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_FC_SP_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-SP T11/1570-D revision 1.6. + /// + internal static string Device_complies_with_FC_SP_T11_1570_D_revision_1_6 { + get { + return ResourceManager.GetString("Device_complies_with_FC_SP_T11_1570_D_revision_1_6", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-Tape ANSI INCITS TR-24 1999. + /// + internal static string Device_complies_with_FC_Tape_ANSI_INCITS_TR_24_1999 { + get { + return ResourceManager.GetString("Device_complies_with_FC_Tape_ANSI_INCITS_TR_24_1999", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-Tape (no version claimed). + /// + internal static string Device_complies_with_FC_Tape_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_FC_Tape_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-Tape T11/1315 revision 1.16. + /// + internal static string Device_complies_with_FC_Tape_T11_1315_revision_1_16 { + get { + return ResourceManager.GetString("Device_complies_with_FC_Tape_T11_1315_revision_1_16", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FC-Tape T11/1315 revision 1.17. + /// + internal static string Device_complies_with_FC_Tape_T11_1315_revision_1_17 { + get { + return ResourceManager.GetString("Device_complies_with_FC_Tape_T11_1315_revision_1_17", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FCP-2 ANSI INCITS 350-2003. + /// + internal static string Device_complies_with_FCP_2_ANSI_INCITS_350_2003 { + get { + return ResourceManager.GetString("Device_complies_with_FCP_2_ANSI_INCITS_350_2003", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FCP-2 (no version claimed). + /// + internal static string Device_complies_with_FCP_2_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_FCP_2_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FCP-2 T10/1144-D revision 4. + /// + internal static string Device_complies_with_FCP_2_T10_1144_D_revision_4 { + get { + return ResourceManager.GetString("Device_complies_with_FCP_2_T10_1144_D_revision_4", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FCP-2 T10/1144-D revision 7. + /// + internal static string Device_complies_with_FCP_2_T10_1144_D_revision_7 { + get { + return ResourceManager.GetString("Device_complies_with_FCP_2_T10_1144_D_revision_7", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FCP-2 T10/1144-D revision 7a. + /// + internal static string Device_complies_with_FCP_2_T10_1144_D_revision_7a { + get { + return ResourceManager.GetString("Device_complies_with_FCP_2_T10_1144_D_revision_7a", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FCP-2 T10/1144-D revision 8. + /// + internal static string Device_complies_with_FCP_2_T10_1144_D_revision_8 { + get { + return ResourceManager.GetString("Device_complies_with_FCP_2_T10_1144_D_revision_8", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FCP-3 ANSI INCITS 416-2006. + /// + internal static string Device_complies_with_FCP_3_ANSI_INCITS_416_2006 { + get { + return ResourceManager.GetString("Device_complies_with_FCP_3_ANSI_INCITS_416_2006", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FCP-3 ISO/IEC 14776-223. + /// + internal static string Device_complies_with_FCP_3_ISO_IEC_14776_223 { + get { + return ResourceManager.GetString("Device_complies_with_FCP_3_ISO_IEC_14776_223", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FCP-3 (no version claimed). + /// + internal static string Device_complies_with_FCP_3_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_FCP_3_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FCP-3 T10/1560-D revision 3f. + /// + internal static string Device_complies_with_FCP_3_T10_1560_D_revision_3f { + get { + return ResourceManager.GetString("Device_complies_with_FCP_3_T10_1560_D_revision_3f", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FCP-3 T10/1560-D revision 4. + /// + internal static string Device_complies_with_FCP_3_T10_1560_D_revision_4 { + get { + return ResourceManager.GetString("Device_complies_with_FCP_3_T10_1560_D_revision_4", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FCP-4 ANSI INCITS 481-2012. + /// + internal static string Device_complies_with_FCP_4_ANSI_INCITS_481_2012 { + get { + return ResourceManager.GetString("Device_complies_with_FCP_4_ANSI_INCITS_481_2012", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FCP-4 (no version claimed). + /// + internal static string Device_complies_with_FCP_4_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_FCP_4_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FCP-4 T10/1828-D revision 01. + /// + internal static string Device_complies_with_FCP_4_T10_1828_D_revision_01 { + get { + return ResourceManager.GetString("Device_complies_with_FCP_4_T10_1828_D_revision_01", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FCP-4 T10/1828-D revision 02. + /// + internal static string Device_complies_with_FCP_4_T10_1828_D_revision_02 { + get { + return ResourceManager.GetString("Device_complies_with_FCP_4_T10_1828_D_revision_02", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FCP-4 T10/1828-D revision 02b. + /// + internal static string Device_complies_with_FCP_4_T10_1828_D_revision_02b { + get { + return ResourceManager.GetString("Device_complies_with_FCP_4_T10_1828_D_revision_02b", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FCP ANSI INCITS 269-1996. + /// + internal static string Device_complies_with_FCP_ANSI_INCITS_269_1996 { + get { + return ResourceManager.GetString("Device_complies_with_FCP_ANSI_INCITS_269_1996", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FCP (no version claimed). + /// + internal static string Device_complies_with_FCP_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_FCP_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with FCP T10/0993-D revision 12. + /// + internal static string Device_complies_with_FCP_T10_0993_D_revision_12 { + get { + return ResourceManager.GetString("Device_complies_with_FCP_T10_0993_D_revision_12", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with IEEE 1394 (no version claimed). + /// + internal static string Device_complies_with_IEEE_1394_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_IEEE_1394_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with IEEE 1394a (no version claimed). + /// + internal static string Device_complies_with_IEEE_1394a_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_IEEE_1394a_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with IEEE 1394b (no version claimed). + /// + internal static string Device_complies_with_IEEE_1394b_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_IEEE_1394b_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with IEEE 1667-2006. + /// + internal static string Device_complies_with_IEEE_1667_2006 { + get { + return ResourceManager.GetString("Device_complies_with_IEEE_1667_2006", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with IEEE 1667-2009. + /// + internal static string Device_complies_with_IEEE_1667_2009 { + get { + return ResourceManager.GetString("Device_complies_with_IEEE_1667_2009", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with IEEE 1667 (no version claimed). + /// + internal static string Device_complies_with_IEEE_1667_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_IEEE_1667_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with iSCSI (no version claimed). + /// + internal static string Device_complies_with_iSCSI_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_iSCSI_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with iSCSI revision {0}. + /// + internal static string Device_complies_with_iSCSI_revision_0 { + get { + return ResourceManager.GetString("Device_complies_with_iSCSI_revision_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with MMC-2 ANSI INCITS 333-2000. + /// + internal static string Device_complies_with_MMC_2_ANSI_INCITS_333_2000 { + get { + return ResourceManager.GetString("Device_complies_with_MMC_2_ANSI_INCITS_333_2000", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with MMC-2 (no version claimed). + /// + internal static string Device_complies_with_MMC_2_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_MMC_2_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with MMC-2 T10/1228-D revision 11. + /// + internal static string Device_complies_with_MMC_2_T10_1228_D_revision_11 { + get { + return ResourceManager.GetString("Device_complies_with_MMC_2_T10_1228_D_revision_11", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with MMC-2 T10/1228-D revision 11a. + /// + internal static string Device_complies_with_MMC_2_T10_1228_D_revision_11a { + get { + return ResourceManager.GetString("Device_complies_with_MMC_2_T10_1228_D_revision_11a", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with MMC-3 ANSI INCITS 360-2002. + /// + internal static string Device_complies_with_MMC_3_ANSI_INCITS_360_2002 { + get { + return ResourceManager.GetString("Device_complies_with_MMC_3_ANSI_INCITS_360_2002", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with MMC-3 (no version claimed). + /// + internal static string Device_complies_with_MMC_3_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_MMC_3_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with MMC-3 T10/1363-D revision 10g. + /// + internal static string Device_complies_with_MMC_3_T10_1363_D_revision_10g { + get { + return ResourceManager.GetString("Device_complies_with_MMC_3_T10_1363_D_revision_10g", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with MMC-3 T10/1363-D revision 9. + /// + internal static string Device_complies_with_MMC_3_T10_1363_D_revision_9 { + get { + return ResourceManager.GetString("Device_complies_with_MMC_3_T10_1363_D_revision_9", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with MMC-4 ANSI INCITS 401-2005. + /// + internal static string Device_complies_with_MMC_4_ANSI_INCITS_401_2005 { + get { + return ResourceManager.GetString("Device_complies_with_MMC_4_ANSI_INCITS_401_2005", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with MMC-4 (no version claimed). + /// + internal static string Device_complies_with_MMC_4_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_MMC_4_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with MMC-4 T10/1545-D revision 3. + /// + internal static string Device_complies_with_MMC_4_T10_1545_D_revision_3 { + get { + return ResourceManager.GetString("Device_complies_with_MMC_4_T10_1545_D_revision_3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with MMC-4 T10/1545-D revision 3d. + /// + internal static string Device_complies_with_MMC_4_T10_1545_D_revision_3d { + get { + return ResourceManager.GetString("Device_complies_with_MMC_4_T10_1545_D_revision_3d", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with MMC-4 T10/1545-D revision 5. + /// + internal static string Device_complies_with_MMC_4_T10_1545_D_revision_5 { + get { + return ResourceManager.GetString("Device_complies_with_MMC_4_T10_1545_D_revision_5", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with MMC-4 T10/1545-D revision 5a. + /// + internal static string Device_complies_with_MMC_4_T10_1545_D_revision_5a { + get { + return ResourceManager.GetString("Device_complies_with_MMC_4_T10_1545_D_revision_5a", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with MMC-5 ANSI INCITS 430-2007. + /// + internal static string Device_complies_with_MMC_5_ANSI_INCITS_430_2007 { + get { + return ResourceManager.GetString("Device_complies_with_MMC_5_ANSI_INCITS_430_2007", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with MMC-5 (no version claimed). + /// + internal static string Device_complies_with_MMC_5_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_MMC_5_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with MMC-5 T10/1675-D revision 03. + /// + internal static string Device_complies_with_MMC_5_T10_1675_D_revision_03 { + get { + return ResourceManager.GetString("Device_complies_with_MMC_5_T10_1675_D_revision_03", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with MMC-5 T10/1675-D revision 03b. + /// + internal static string Device_complies_with_MMC_5_T10_1675_D_revision_03b { + get { + return ResourceManager.GetString("Device_complies_with_MMC_5_T10_1675_D_revision_03b", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with MMC-5 T10/1675-D revision 04. + /// + internal static string Device_complies_with_MMC_5_T10_1675_D_revision_04 { + get { + return ResourceManager.GetString("Device_complies_with_MMC_5_T10_1675_D_revision_04", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with MMC-6 ANSI INCITS 468-2010. + /// + internal static string Device_complies_with_MMC_6_ANSI_INCITS_468_2010 { + get { + return ResourceManager.GetString("Device_complies_with_MMC_6_ANSI_INCITS_468_2010", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with MMC-6 ANSI INCITS 468-2010 + MMC-6/AM1 ANSI INCITS 468-2010/AM 1. + /// + internal static string Device_complies_with_MMC_6_ANSI_INCITS_468_2010_MMC_6_AM1_ANSI_INCITS_468_2010_AM_1 { + get { + return ResourceManager.GetString("Device_complies_with_MMC_6_ANSI_INCITS_468_2010_MMC_6_AM1_ANSI_INCITS_468_2010_AM" + + "_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with MMC-6 (no version claimed). + /// + internal static string Device_complies_with_MMC_6_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_MMC_6_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with MMC-6 T10/1836-D revision 02b. + /// + internal static string Device_complies_with_MMC_6_T10_1836_D_revision_02b { + get { + return ResourceManager.GetString("Device_complies_with_MMC_6_T10_1836_D_revision_02b", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with MMC-6 T10/1836-D revision 02g. + /// + internal static string Device_complies_with_MMC_6_T10_1836_D_revision_02g { + get { + return ResourceManager.GetString("Device_complies_with_MMC_6_T10_1836_D_revision_02g", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with MMC ANSI INCITS 304-1997. + /// + internal static string Device_complies_with_MMC_ANSI_INCITS_304_1997 { + get { + return ResourceManager.GetString("Device_complies_with_MMC_ANSI_INCITS_304_1997", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with MMC (no version claimed). + /// + internal static string Device_complies_with_MMC_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_MMC_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with MMC T10/1048-D revision 10a. + /// + internal static string Device_complies_with_MMC_T10_1048_D_revision_10a { + get { + return ResourceManager.GetString("Device_complies_with_MMC_T10_1048_D_revision_10a", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with OCRW ISO/IEC 14776-381. + /// + internal static string Device_complies_with_OCRW_ISO_IEC_14776_381 { + get { + return ResourceManager.GetString("Device_complies_with_OCRW_ISO_IEC_14776_381", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with OCRW (no version claimed). + /// + internal static string Device_complies_with_OCRW_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_OCRW_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with OSD-2 ANSI INCITS 458-2011. + /// + internal static string Device_complies_with_OSD_2_ANSI_INCITS_458_2011 { + get { + return ResourceManager.GetString("Device_complies_with_OSD_2_ANSI_INCITS_458_2011", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with OSD-2 (no version claimed). + /// + internal static string Device_complies_with_OSD_2_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_OSD_2_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with OSD-2 T10/1729-D revision 4. + /// + internal static string Device_complies_with_OSD_2_T10_1729_D_revision_4 { + get { + return ResourceManager.GetString("Device_complies_with_OSD_2_T10_1729_D_revision_4", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with OSD-2 T10/1729-D revision 5. + /// + internal static string Device_complies_with_OSD_2_T10_1729_D_revision_5 { + get { + return ResourceManager.GetString("Device_complies_with_OSD_2_T10_1729_D_revision_5", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with OSD-3 (no version claimed). + /// + internal static string Device_complies_with_OSD_3_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_OSD_3_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with OSD ANSI INCITS 400-2004. + /// + internal static string Device_complies_with_OSD_ANSI_INCITS_400_2004 { + get { + return ResourceManager.GetString("Device_complies_with_OSD_ANSI_INCITS_400_2004", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with OSD (no version claimed). + /// + internal static string Device_complies_with_OSD_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_OSD_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with OSD T10/1355-D revision 0. + /// + internal static string Device_complies_with_OSD_T10_1355_D_revision_0 { + get { + return ResourceManager.GetString("Device_complies_with_OSD_T10_1355_D_revision_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with OSD T10/1355-D revision 10. + /// + internal static string Device_complies_with_OSD_T10_1355_D_revision_10 { + get { + return ResourceManager.GetString("Device_complies_with_OSD_T10_1355_D_revision_10", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with OSD T10/1355-D revision 7a. + /// + internal static string Device_complies_with_OSD_T10_1355_D_revision_7a { + get { + return ResourceManager.GetString("Device_complies_with_OSD_T10_1355_D_revision_7a", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with OSD T10/1355-D revision 8. + /// + internal static string Device_complies_with_OSD_T10_1355_D_revision_8 { + get { + return ResourceManager.GetString("Device_complies_with_OSD_T10_1355_D_revision_8", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with OSD T10/1355-D revision 9. + /// + internal static string Device_complies_with_OSD_T10_1355_D_revision_9 { + get { + return ResourceManager.GetString("Device_complies_with_OSD_T10_1355_D_revision_9", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with PQI-2 (no version claimed). + /// + internal static string Device_complies_with_PQI_2_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_PQI_2_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with PQI ANSI INCITS 490-2014. + /// + internal static string Device_complies_with_PQI_ANSI_INCITS_490_2014 { + get { + return ResourceManager.GetString("Device_complies_with_PQI_ANSI_INCITS_490_2014", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with PQI (no version claimed). + /// + internal static string Device_complies_with_PQI_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_PQI_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with PQI T10/BSR INCITS 490 revision 6. + /// + internal static string Device_complies_with_PQI_T10_BSR_INCITS_490_revision_6 { + get { + return ResourceManager.GetString("Device_complies_with_PQI_T10_BSR_INCITS_490_revision_6", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with PQI T10/BSR INCITS 490 revision 7. + /// + internal static string Device_complies_with_PQI_T10_BSR_INCITS_490_revision_7 { + get { + return ResourceManager.GetString("Device_complies_with_PQI_T10_BSR_INCITS_490_revision_7", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with RBC ANSI INCITS 330-2000. + /// + internal static string Device_complies_with_RBC_ANSI_INCITS_330_2000 { + get { + return ResourceManager.GetString("Device_complies_with_RBC_ANSI_INCITS_330_2000", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with RBC (no version claimed). + /// + internal static string Device_complies_with_RBC_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_RBC_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with RBC T10/1240-D revision 10a. + /// + internal static string Device_complies_with_RBC_T10_1240_D_revision_10a { + get { + return ResourceManager.GetString("Device_complies_with_RBC_T10_1240_D_revision_10a", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAM-2 ANSI INCITS 366-2003. + /// + internal static string Device_complies_with_SAM_2_ANSI_INCITS_366_2003 { + get { + return ResourceManager.GetString("Device_complies_with_SAM_2_ANSI_INCITS_366_2003", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAM-2 ISO/IEC 14776-412. + /// + internal static string Device_complies_with_SAM_2_ISO_IEC_14776_412 { + get { + return ResourceManager.GetString("Device_complies_with_SAM_2_ISO_IEC_14776_412", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAM-2 (no version claimed). + /// + internal static string Device_complies_with_SAM_2_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SAM_2_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAM-2 T10/1157-D revision 23. + /// + internal static string Device_complies_with_SAM_2_T10_1157_D_revision_23 { + get { + return ResourceManager.GetString("Device_complies_with_SAM_2_T10_1157_D_revision_23", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAM-2 T10/1157-D revision 24. + /// + internal static string Device_complies_with_SAM_2_T10_1157_D_revision_24 { + get { + return ResourceManager.GetString("Device_complies_with_SAM_2_T10_1157_D_revision_24", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAM-3 ANSI INCITS 402-2005. + /// + internal static string Device_complies_with_SAM_3_ANSI_INCITS_402_2005 { + get { + return ResourceManager.GetString("Device_complies_with_SAM_3_ANSI_INCITS_402_2005", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAM-3 (no version claimed). + /// + internal static string Device_complies_with_SAM_3_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SAM_3_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAM-3 T10/1561-D revision 13. + /// + internal static string Device_complies_with_SAM_3_T10_1561_D_revision_13 { + get { + return ResourceManager.GetString("Device_complies_with_SAM_3_T10_1561_D_revision_13", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAM-3 T10/1561-D revision 14. + /// + internal static string Device_complies_with_SAM_3_T10_1561_D_revision_14 { + get { + return ResourceManager.GetString("Device_complies_with_SAM_3_T10_1561_D_revision_14", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAM-3 T10/1561-D revision 7. + /// + internal static string Device_complies_with_SAM_3_T10_1561_D_revision_7 { + get { + return ResourceManager.GetString("Device_complies_with_SAM_3_T10_1561_D_revision_7", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAM-4 ANSI INCITS 447-2008. + /// + internal static string Device_complies_with_SAM_4_ANSI_INCITS_447_2008 { + get { + return ResourceManager.GetString("Device_complies_with_SAM_4_ANSI_INCITS_447_2008", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAM-4 ISO/IEC 14776-414. + /// + internal static string Device_complies_with_SAM_4_ISO_IEC_14776_414 { + get { + return ResourceManager.GetString("Device_complies_with_SAM_4_ISO_IEC_14776_414", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAM-4 (no version claimed). + /// + internal static string Device_complies_with_SAM_4_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SAM_4_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAM-4 T10/1683-D revision 13. + /// + internal static string Device_complies_with_SAM_4_T10_1683_D_revision_13 { + get { + return ResourceManager.GetString("Device_complies_with_SAM_4_T10_1683_D_revision_13", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAM-4 T10/1683-D revision 14. + /// + internal static string Device_complies_with_SAM_4_T10_1683_D_revision_14 { + get { + return ResourceManager.GetString("Device_complies_with_SAM_4_T10_1683_D_revision_14", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAM-5 (no version claimed). + /// + internal static string Device_complies_with_SAM_5_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SAM_5_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAM-5 T10/2104-D revision 20. + /// + internal static string Device_complies_with_SAM_5_T10_2104_D_revision_20 { + get { + return ResourceManager.GetString("Device_complies_with_SAM_5_T10_2104_D_revision_20", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAM-5 T10/2104-D revision 21. + /// + internal static string Device_complies_with_SAM_5_T10_2104_D_revision_21 { + get { + return ResourceManager.GetString("Device_complies_with_SAM_5_T10_2104_D_revision_21", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAM-5 T10/2104-D revision 4. + /// + internal static string Device_complies_with_SAM_5_T10_2104_D_revision_4 { + get { + return ResourceManager.GetString("Device_complies_with_SAM_5_T10_2104_D_revision_4", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAM-6 (no version claimed). + /// + internal static string Device_complies_with_SAM_6_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SAM_6_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAM ANSI INCITS 270-1996. + /// + internal static string Device_complies_with_SAM_ANSI_INCITS_270_1996 { + get { + return ResourceManager.GetString("Device_complies_with_SAM_ANSI_INCITS_270_1996", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAM (no version claimed). + /// + internal static string Device_complies_with_SAM_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SAM_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAM T10/0994-D revision 18. + /// + internal static string Device_complies_with_SAM_T10_0994_D_revision_18 { + get { + return ResourceManager.GetString("Device_complies_with_SAM_T10_0994_D_revision_18", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAS-1.1 ANSI INCITS 417-2006. + /// + internal static string Device_complies_with_SAS_1_1_ANSI_INCITS_417_2006 { + get { + return ResourceManager.GetString("Device_complies_with_SAS_1_1_ANSI_INCITS_417_2006", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAS-1.1 ISO/IEC 14776-151. + /// + internal static string Device_complies_with_SAS_1_1_ISO_IEC_14776_151 { + get { + return ResourceManager.GetString("Device_complies_with_SAS_1_1_ISO_IEC_14776_151", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAS-1.1 (no version claimed). + /// + internal static string Device_complies_with_SAS_1_1_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SAS_1_1_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAS-1.1 T10/1601-D revision 10. + /// + internal static string Device_complies_with_SAS_1_1_T10_1601_D_revision_10 { + get { + return ResourceManager.GetString("Device_complies_with_SAS_1_1_T10_1601_D_revision_10", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAS-1.1 T10/1601-D revision 9. + /// + internal static string Device_complies_with_SAS_1_1_T10_1601_D_revision_9 { + get { + return ResourceManager.GetString("Device_complies_with_SAS_1_1_T10_1601_D_revision_9", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAS-2.1 ANSI INCITS 478-2011. + /// + internal static string Device_complies_with_SAS_2_1_ANSI_INCITS_478_2011 { + get { + return ResourceManager.GetString("Device_complies_with_SAS_2_1_ANSI_INCITS_478_2011", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAS-2.1 ANSI INCITS 478-2011 w/ Amnd 1 ANSI INCITS 478/AM1-2014. + /// + internal static string Device_complies_with_SAS_2_1_ANSI_INCITS_478_2011_w__Amnd_1_ANSI_INCITS_478_AM1_2014 { + get { + return ResourceManager.GetString("Device_complies_with_SAS_2_1_ANSI_INCITS_478_2011_w__Amnd_1_ANSI_INCITS_478_AM1_2" + + "014", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAS-2.1 ISO/IEC 14776-153. + /// + internal static string Device_complies_with_SAS_2_1_ISO_IEC_14776_153 { + get { + return ResourceManager.GetString("Device_complies_with_SAS_2_1_ISO_IEC_14776_153", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAS-2.1 (no version claimed). + /// + internal static string Device_complies_with_SAS_2_1_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SAS_2_1_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAS-2.1 T10/2125-D revision 04. + /// + internal static string Device_complies_with_SAS_2_1_T10_2125_D_revision_04 { + get { + return ResourceManager.GetString("Device_complies_with_SAS_2_1_T10_2125_D_revision_04", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAS-2.1 T10/2125-D revision 06. + /// + internal static string Device_complies_with_SAS_2_1_T10_2125_D_revision_06 { + get { + return ResourceManager.GetString("Device_complies_with_SAS_2_1_T10_2125_D_revision_06", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAS-2.1 T10/2125-D revision 07. + /// + internal static string Device_complies_with_SAS_2_1_T10_2125_D_revision_07 { + get { + return ResourceManager.GetString("Device_complies_with_SAS_2_1_T10_2125_D_revision_07", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAS-2 ANSI INCITS 457-2010. + /// + internal static string Device_complies_with_SAS_2_ANSI_INCITS_457_2010 { + get { + return ResourceManager.GetString("Device_complies_with_SAS_2_ANSI_INCITS_457_2010", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAS-2 (no version claimed). + /// + internal static string Device_complies_with_SAS_2_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SAS_2_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAS-2 T10/1760-D revision 14. + /// + internal static string Device_complies_with_SAS_2_T10_1760_D_revision_14 { + get { + return ResourceManager.GetString("Device_complies_with_SAS_2_T10_1760_D_revision_14", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAS-2 T10/1760-D revision 15. + /// + internal static string Device_complies_with_SAS_2_T10_1760_D_revision_15 { + get { + return ResourceManager.GetString("Device_complies_with_SAS_2_T10_1760_D_revision_15", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAS-2 T10/1760-D revision 16. + /// + internal static string Device_complies_with_SAS_2_T10_1760_D_revision_16 { + get { + return ResourceManager.GetString("Device_complies_with_SAS_2_T10_1760_D_revision_16", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAS-3 ANSI INCITS 519-2014. + /// + internal static string Device_complies_with_SAS_3_ANSI_INCITS_519_2014 { + get { + return ResourceManager.GetString("Device_complies_with_SAS_3_ANSI_INCITS_519_2014", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAS-3 (no version claimed). + /// + internal static string Device_complies_with_SAS_3_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SAS_3_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAS-3 T10/BSR INCITS 519 revision 05a. + /// + internal static string Device_complies_with_SAS_3_T10_BSR_INCITS_519_revision_05a { + get { + return ResourceManager.GetString("Device_complies_with_SAS_3_T10_BSR_INCITS_519_revision_05a", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAS-3 T10/BSR INCITS 519 revision 06. + /// + internal static string Device_complies_with_SAS_3_T10_BSR_INCITS_519_revision_06 { + get { + return ResourceManager.GetString("Device_complies_with_SAS_3_T10_BSR_INCITS_519_revision_06", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAS-4 (no version claimed). + /// + internal static string Device_complies_with_SAS_4_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SAS_4_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAS ANSI INCITS 376-2003. + /// + internal static string Device_complies_with_SAS_ANSI_INCITS_376_2003 { + get { + return ResourceManager.GetString("Device_complies_with_SAS_ANSI_INCITS_376_2003", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAS (no version claimed). + /// + internal static string Device_complies_with_SAS_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SAS_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAS T10/1562-D revision 01. + /// + internal static string Device_complies_with_SAS_T10_1562_D_revision_01 { + get { + return ResourceManager.GetString("Device_complies_with_SAS_T10_1562_D_revision_01", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAS T10/1562-D revision 03. + /// + internal static string Device_complies_with_SAS_T10_1562_D_revision_03 { + get { + return ResourceManager.GetString("Device_complies_with_SAS_T10_1562_D_revision_03", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAS T10/1562-D revision 04. + /// + internal static string Device_complies_with_SAS_T10_1562_D_revision_04 { + get { + return ResourceManager.GetString("Device_complies_with_SAS_T10_1562_D_revision_04", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAS T10/1562-D revision 05. + /// + internal static string Device_complies_with_SAS_T10_1562_D_revision_05 { + get { + return ResourceManager.GetString("Device_complies_with_SAS_T10_1562_D_revision_05", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAT-2 ANSI INCITS 465-2010. + /// + internal static string Device_complies_with_SAT_2_ANSI_INCITS_465_2010 { + get { + return ResourceManager.GetString("Device_complies_with_SAT_2_ANSI_INCITS_465_2010", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAT-2 (no version claimed). + /// + internal static string Device_complies_with_SAT_2_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SAT_2_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAT-2 T10/1826-D revision 06. + /// + internal static string Device_complies_with_SAT_2_T10_1826_D_revision_06 { + get { + return ResourceManager.GetString("Device_complies_with_SAT_2_T10_1826_D_revision_06", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAT-2 T10/1826-D revision 09. + /// + internal static string Device_complies_with_SAT_2_T10_1826_D_revision_09 { + get { + return ResourceManager.GetString("Device_complies_with_SAT_2_T10_1826_D_revision_09", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAT-3 ANSI INCITS 517-2015. + /// + internal static string Device_complies_with_SAT_3_ANSI_INCITS_517_2015 { + get { + return ResourceManager.GetString("Device_complies_with_SAT_3_ANSI_INCITS_517_2015", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAT-3 (no version claimed). + /// + internal static string Device_complies_with_SAT_3_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SAT_3_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAT-3 T10/BSR INCITS 517 revision 4. + /// + internal static string Device_complies_with_SAT_3_T10_BSR_INCITS_517_revision_4 { + get { + return ResourceManager.GetString("Device_complies_with_SAT_3_T10_BSR_INCITS_517_revision_4", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAT-3 T10/BSR INCITS 517 revision 7. + /// + internal static string Device_complies_with_SAT_3_T10_BSR_INCITS_517_revision_7 { + get { + return ResourceManager.GetString("Device_complies_with_SAT_3_T10_BSR_INCITS_517_revision_7", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAT-4 (no version claimed). + /// + internal static string Device_complies_with_SAT_4_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SAT_4_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAT ANSI INCITS 431-2007. + /// + internal static string Device_complies_with_SAT_ANSI_INCITS_431_2007 { + get { + return ResourceManager.GetString("Device_complies_with_SAT_ANSI_INCITS_431_2007", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAT (no version claimed). + /// + internal static string Device_complies_with_SAT_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SAT_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAT T10/1711-D revision 8. + /// + internal static string Device_complies_with_SAT_T10_1711_D_revision_8 { + get { + return ResourceManager.GetString("Device_complies_with_SAT_T10_1711_D_revision_8", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SAT T10/1711-D revision 9. + /// + internal static string Device_complies_with_SAT_T10_1711_D_revision_9 { + get { + return ResourceManager.GetString("Device_complies_with_SAT_T10_1711_D_revision_9", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SBC-2 ANSI INCITS 405-2005. + /// + internal static string Device_complies_with_SBC_2_ANSI_INCITS_405_2005 { + get { + return ResourceManager.GetString("Device_complies_with_SBC_2_ANSI_INCITS_405_2005", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SBC-2 ISO/IEC 14776-322. + /// + internal static string Device_complies_with_SBC_2_ISO_IEC_14776_322 { + get { + return ResourceManager.GetString("Device_complies_with_SBC_2_ISO_IEC_14776_322", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SBC-2 (no version claimed). + /// + internal static string Device_complies_with_SBC_2_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SBC_2_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SBC-2 T10/1417-D revision 15. + /// + internal static string Device_complies_with_SBC_2_T10_1417_D_revision_15 { + get { + return ResourceManager.GetString("Device_complies_with_SBC_2_T10_1417_D_revision_15", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SBC-2 T10/1417-D revision 16. + /// + internal static string Device_complies_with_SBC_2_T10_1417_D_revision_16 { + get { + return ResourceManager.GetString("Device_complies_with_SBC_2_T10_1417_D_revision_16", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SBC-2 T10/1417-D revision 5a. + /// + internal static string Device_complies_with_SBC_2_T10_1417_D_revision_5a { + get { + return ResourceManager.GetString("Device_complies_with_SBC_2_T10_1417_D_revision_5a", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SBC-3 ANSI INCITS 514-2014. + /// + internal static string Device_complies_with_SBC_3_ANSI_INCITS_514_2014 { + get { + return ResourceManager.GetString("Device_complies_with_SBC_3_ANSI_INCITS_514_2014", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SBC-3 (no version claimed). + /// + internal static string Device_complies_with_SBC_3_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SBC_3_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SBC-3 T10/BSR INCITS 514 revision 35. + /// + internal static string Device_complies_with_SBC_3_T10_BSR_INCITS_514_revision_35 { + get { + return ResourceManager.GetString("Device_complies_with_SBC_3_T10_BSR_INCITS_514_revision_35", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SBC-3 T10/BSR INCITS 514 revision 36. + /// + internal static string Device_complies_with_SBC_3_T10_BSR_INCITS_514_revision_36 { + get { + return ResourceManager.GetString("Device_complies_with_SBC_3_T10_BSR_INCITS_514_revision_36", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SBC-4 (no version claimed). + /// + internal static string Device_complies_with_SBC_4_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SBC_4_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SBC ANSI INCITS 306-1998. + /// + internal static string Device_complies_with_SBC_ANSI_INCITS_306_1998 { + get { + return ResourceManager.GetString("Device_complies_with_SBC_ANSI_INCITS_306_1998", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SBC (no version claimed). + /// + internal static string Device_complies_with_SBC_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SBC_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SBC T10/0996-D revision 08c. + /// + internal static string Device_complies_with_SBC_T10_0996_D_revision_08c { + get { + return ResourceManager.GetString("Device_complies_with_SBC_T10_0996_D_revision_08c", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SBP-2 ANSI INCITS 325-1998. + /// + internal static string Device_complies_with_SBP_2_ANSI_INCITS_325_1998 { + get { + return ResourceManager.GetString("Device_complies_with_SBP_2_ANSI_INCITS_325_1998", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SBP-2 (no version claimed). + /// + internal static string Device_complies_with_SBP_2_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SBP_2_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SBP-2 T10/1155-D revision 04. + /// + internal static string Device_complies_with_SBP_2_T10_1155_D_revision_04 { + get { + return ResourceManager.GetString("Device_complies_with_SBP_2_T10_1155_D_revision_04", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SBP-3 ANSI INCITS 375-2004. + /// + internal static string Device_complies_with_SBP_3_ANSI_INCITS_375_2004 { + get { + return ResourceManager.GetString("Device_complies_with_SBP_3_ANSI_INCITS_375_2004", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SBP-3 (no version claimed). + /// + internal static string Device_complies_with_SBP_3_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SBP_3_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SBP-3 T10/1467-D revision 1f. + /// + internal static string Device_complies_with_SBP_3_T10_1467_D_revision_1f { + get { + return ResourceManager.GetString("Device_complies_with_SBP_3_T10_1467_D_revision_1f", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SBP-3 T10/1467-D revision 3. + /// + internal static string Device_complies_with_SBP_3_T10_1467_D_revision_3 { + get { + return ResourceManager.GetString("Device_complies_with_SBP_3_T10_1467_D_revision_3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SBP-3 T10/1467-D revision 4. + /// + internal static string Device_complies_with_SBP_3_T10_1467_D_revision_4 { + get { + return ResourceManager.GetString("Device_complies_with_SBP_3_T10_1467_D_revision_4", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SBP-3 T10/1467-D revision 5. + /// + internal static string Device_complies_with_SBP_3_T10_1467_D_revision_5 { + get { + return ResourceManager.GetString("Device_complies_with_SBP_3_T10_1467_D_revision_5", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SCC-2 ANSI INCITS 318-1998. + /// + internal static string Device_complies_with_SCC_2_ANSI_INCITS_318_1998 { + get { + return ResourceManager.GetString("Device_complies_with_SCC_2_ANSI_INCITS_318_1998", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SCC-2 (no version claimed). + /// + internal static string Device_complies_with_SCC_2_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SCC_2_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SCC-2 T10/1125-D revision 04. + /// + internal static string Device_complies_with_SCC_2_T10_1125_D_revision_04 { + get { + return ResourceManager.GetString("Device_complies_with_SCC_2_T10_1125_D_revision_04", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SCC ANSI INCITS 276-1997. + /// + internal static string Device_complies_with_SCC_ANSI_INCITS_276_1997 { + get { + return ResourceManager.GetString("Device_complies_with_SCC_ANSI_INCITS_276_1997", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SCC (no version claimed). + /// + internal static string Device_complies_with_SCC_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SCC_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SCC T10/1047-D revision 06c. + /// + internal static string Device_complies_with_SCC_T10_1047_D_revision_06c { + get { + return ResourceManager.GetString("Device_complies_with_SCC_T10_1047_D_revision_06c", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SES-2 ANSI INCITS 448-2008. + /// + internal static string Device_complies_with_SES_2_ANSI_INCITS_448_2008 { + get { + return ResourceManager.GetString("Device_complies_with_SES_2_ANSI_INCITS_448_2008", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SES-2 ISO/IEC 14776-372. + /// + internal static string Device_complies_with_SES_2_ISO_IEC_14776_372 { + get { + return ResourceManager.GetString("Device_complies_with_SES_2_ISO_IEC_14776_372", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SES-2 (no version claimed). + /// + internal static string Device_complies_with_SES_2_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SES_2_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SES-2 T10/1559-D revision 16. + /// + internal static string Device_complies_with_SES_2_T10_1559_D_revision_16 { + get { + return ResourceManager.GetString("Device_complies_with_SES_2_T10_1559_D_revision_16", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SES-2 T10/1559-D revision 19. + /// + internal static string Device_complies_with_SES_2_T10_1559_D_revision_19 { + get { + return ResourceManager.GetString("Device_complies_with_SES_2_T10_1559_D_revision_19", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SES-2 T10/1559-D revision 20. + /// + internal static string Device_complies_with_SES_2_T10_1559_D_revision_20 { + get { + return ResourceManager.GetString("Device_complies_with_SES_2_T10_1559_D_revision_20", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SES-3 (no version claimed). + /// + internal static string Device_complies_with_SES_3_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SES_3_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SES ANSI INCITS 305-1998. + /// + internal static string Device_complies_with_SES_ANSI_INCITS_305_1998 { + get { + return ResourceManager.GetString("Device_complies_with_SES_ANSI_INCITS_305_1998", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SES ANSI INCITS 305-1998 w/ Amendment ANSI INCITS.305/AM1-2000. + /// + internal static string Device_complies_with_SES_ANSI_INCITS_305_1998_Amendment_ANSI_INCITS_305_AM1_2000 { + get { + return ResourceManager.GetString("Device_complies_with_SES_ANSI_INCITS_305_1998_Amendment_ANSI_INCITS_305_AM1_2000", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SES (no version claimed). + /// + internal static string Device_complies_with_SES_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SES_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SES T10/1212-D revision 08b. + /// + internal static string Device_complies_with_SES_T10_1212_D_revision_08b { + get { + return ResourceManager.GetString("Device_complies_with_SES_T10_1212_D_revision_08b", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SES T10/1212 revision 08b w/ Amendment ANSI INCITS.305/AM1-2000. + /// + internal static string Device_complies_with_SES_T10_1212_revision_08b_Amendment_ANSI_INCITS_305_AM1_2000 { + get { + return ResourceManager.GetString("Device_complies_with_SES_T10_1212_revision_08b_Amendment_ANSI_INCITS_305_AM1_2000" + + "", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SFSC BSR INCITS 501 revision 01. + /// + internal static string Device_complies_with_SFSC_BSR_INCITS_501_revision_01 { + get { + return ResourceManager.GetString("Device_complies_with_SFSC_BSR_INCITS_501_revision_01", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SFSC (no version claimed). + /// + internal static string Device_complies_with_SFSC_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SFSC_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SIP ANSI INCITS 292-1997. + /// + internal static string Device_complies_with_SIP_ANSI_INCITS_292_1997 { + get { + return ResourceManager.GetString("Device_complies_with_SIP_ANSI_INCITS_292_1997", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SIP (no version claimed). + /// + internal static string Device_complies_with_SIP_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SIP_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SIP T10/0856-D revision 10. + /// + internal static string Device_complies_with_SIP_T10_0856_D_revision_10 { + get { + return ResourceManager.GetString("Device_complies_with_SIP_T10_0856_D_revision_10", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SMC-2 ANSI INCITS 382-2004. + /// + internal static string Device_complies_with_SMC_2_ANSI_INCITS_382_2004 { + get { + return ResourceManager.GetString("Device_complies_with_SMC_2_ANSI_INCITS_382_2004", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SMC-2 (no version claimed). + /// + internal static string Device_complies_with_SMC_2_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SMC_2_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SMC-2 T10/1383-D revision 5. + /// + internal static string Device_complies_with_SMC_2_T10_1383_D_revision_5 { + get { + return ResourceManager.GetString("Device_complies_with_SMC_2_T10_1383_D_revision_5", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SMC-2 T10/1383-D revision 6. + /// + internal static string Device_complies_with_SMC_2_T10_1383_D_revision_6 { + get { + return ResourceManager.GetString("Device_complies_with_SMC_2_T10_1383_D_revision_6", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SMC-2 T10/1383-D revision 7. + /// + internal static string Device_complies_with_SMC_2_T10_1383_D_revision_7 { + get { + return ResourceManager.GetString("Device_complies_with_SMC_2_T10_1383_D_revision_7", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SMC-3 ANSI INCITS 484-2012. + /// + internal static string Device_complies_with_SMC_3_ANSI_INCITS_484_2012 { + get { + return ResourceManager.GetString("Device_complies_with_SMC_3_ANSI_INCITS_484_2012", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SMC-3 (no version claimed). + /// + internal static string Device_complies_with_SMC_3_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SMC_3_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SMC-3 T10/1730-D revision 15. + /// + internal static string Device_complies_with_SMC_3_T10_1730_D_revision_15 { + get { + return ResourceManager.GetString("Device_complies_with_SMC_3_T10_1730_D_revision_15", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SMC-3 T10/1730-D revision 16. + /// + internal static string Device_complies_with_SMC_3_T10_1730_D_revision_16 { + get { + return ResourceManager.GetString("Device_complies_with_SMC_3_T10_1730_D_revision_16", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SMC ANSI INCITS 314-1998. + /// + internal static string Device_complies_with_SMC_ANSI_INCITS_314_1998 { + get { + return ResourceManager.GetString("Device_complies_with_SMC_ANSI_INCITS_314_1998", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SMC ISO/IEC 14776-351. + /// + internal static string Device_complies_with_SMC_ISO_IEC_14776_351 { + get { + return ResourceManager.GetString("Device_complies_with_SMC_ISO_IEC_14776_351", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SMC (no version claimed). + /// + internal static string Device_complies_with_SMC_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SMC_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SMC T10/0999-D revision 10a. + /// + internal static string Device_complies_with_SMC_T10_0999_D_revision_10a { + get { + return ResourceManager.GetString("Device_complies_with_SMC_T10_0999_D_revision_10a", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SOP-2 (no version claimed). + /// + internal static string Device_complies_with_SOP_2_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SOP_2_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SOP ANSI INCITS 489-2014. + /// + internal static string Device_complies_with_SOP_ANSI_INCITS_489_2014 { + get { + return ResourceManager.GetString("Device_complies_with_SOP_ANSI_INCITS_489_2014", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SOP (no version claimed). + /// + internal static string Device_complies_with_SOP_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SOP_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SOP T10/BSR INCITS 489 revision 4. + /// + internal static string Device_complies_with_SOP_T10_BSR_INCITS_489_revision_4 { + get { + return ResourceManager.GetString("Device_complies_with_SOP_T10_BSR_INCITS_489_revision_4", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SOP T10/BSR INCITS 489 revision 5. + /// + internal static string Device_complies_with_SOP_T10_BSR_INCITS_489_revision_5 { + get { + return ResourceManager.GetString("Device_complies_with_SOP_T10_BSR_INCITS_489_revision_5", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPC-2 ANSI INCITS 351-2001. + /// + internal static string Device_complies_with_SPC_2_ANSI_INCITS_351_2001 { + get { + return ResourceManager.GetString("Device_complies_with_SPC_2_ANSI_INCITS_351_2001", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPC-2 ISO/IEC 14776-452. + /// + internal static string Device_complies_with_SPC_2_ISO_IEC_14776_452 { + get { + return ResourceManager.GetString("Device_complies_with_SPC_2_ISO_IEC_14776_452", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPC-2 (no version claimed). + /// + internal static string Device_complies_with_SPC_2_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SPC_2_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPC-2 T10/1236-D revision 12. + /// + internal static string Device_complies_with_SPC_2_T10_1236_D_revision_12 { + get { + return ResourceManager.GetString("Device_complies_with_SPC_2_T10_1236_D_revision_12", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPC-2 T10/1236-D revision 18. + /// + internal static string Device_complies_with_SPC_2_T10_1236_D_revision_18 { + get { + return ResourceManager.GetString("Device_complies_with_SPC_2_T10_1236_D_revision_18", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPC-2 T10/1236-D revision 19. + /// + internal static string Device_complies_with_SPC_2_T10_1236_D_revision_19 { + get { + return ResourceManager.GetString("Device_complies_with_SPC_2_T10_1236_D_revision_19", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPC-2 T10/1236-D revision 20. + /// + internal static string Device_complies_with_SPC_2_T10_1236_D_revision_20 { + get { + return ResourceManager.GetString("Device_complies_with_SPC_2_T10_1236_D_revision_20", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPC-3 ANSI INCITS 408-2005. + /// + internal static string Device_complies_with_SPC_3_ANSI_INCITS_408_2005 { + get { + return ResourceManager.GetString("Device_complies_with_SPC_3_ANSI_INCITS_408_2005", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPC-3 ISO/IEC 14776-453. + /// + internal static string Device_complies_with_SPC_3_ISO_IEC_14776_453 { + get { + return ResourceManager.GetString("Device_complies_with_SPC_3_ISO_IEC_14776_453", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPC-3 (no version claimed). + /// + internal static string Device_complies_with_SPC_3_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SPC_3_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPC-3 T10/1416-D revision 21. + /// + internal static string Device_complies_with_SPC_3_T10_1416_D_revision_21 { + get { + return ResourceManager.GetString("Device_complies_with_SPC_3_T10_1416_D_revision_21", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPC-3 T10/1416-D revision 22. + /// + internal static string Device_complies_with_SPC_3_T10_1416_D_revision_22 { + get { + return ResourceManager.GetString("Device_complies_with_SPC_3_T10_1416_D_revision_22", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPC-3 T10/1416-D revision 23. + /// + internal static string Device_complies_with_SPC_3_T10_1416_D_revision_23 { + get { + return ResourceManager.GetString("Device_complies_with_SPC_3_T10_1416_D_revision_23", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPC-3 T10/1416-D revision 7. + /// + internal static string Device_complies_with_SPC_3_T10_1416_D_revision_7 { + get { + return ResourceManager.GetString("Device_complies_with_SPC_3_T10_1416_D_revision_7", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPC-4 ANSI INCITS 513-2015. + /// + internal static string Device_complies_with_SPC_4_ANSI_INCITS_513_2015 { + get { + return ResourceManager.GetString("Device_complies_with_SPC_4_ANSI_INCITS_513_2015", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPC-4 (no version claimed). + /// + internal static string Device_complies_with_SPC_4_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SPC_4_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPC-4 T10/BSR INCITS 513 revision 16. + /// + internal static string Device_complies_with_SPC_4_T10_BSR_INCITS_513_revision_16 { + get { + return ResourceManager.GetString("Device_complies_with_SPC_4_T10_BSR_INCITS_513_revision_16", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPC-4 T10/BSR INCITS 513 revision 18. + /// + internal static string Device_complies_with_SPC_4_T10_BSR_INCITS_513_revision_18 { + get { + return ResourceManager.GetString("Device_complies_with_SPC_4_T10_BSR_INCITS_513_revision_18", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPC-4 T10/BSR INCITS 513 revision 23. + /// + internal static string Device_complies_with_SPC_4_T10_BSR_INCITS_513_revision_23 { + get { + return ResourceManager.GetString("Device_complies_with_SPC_4_T10_BSR_INCITS_513_revision_23", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPC-4 T10/BSR INCITS 513 revision 36. + /// + internal static string Device_complies_with_SPC_4_T10_BSR_INCITS_513_revision_36 { + get { + return ResourceManager.GetString("Device_complies_with_SPC_4_T10_BSR_INCITS_513_revision_36", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPC-4 T10/BSR INCITS 513 revision 37. + /// + internal static string Device_complies_with_SPC_4_T10_BSR_INCITS_513_revision_37 { + get { + return ResourceManager.GetString("Device_complies_with_SPC_4_T10_BSR_INCITS_513_revision_37", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPC-4 T10/BSR INCITS 513 revision 37a. + /// + internal static string Device_complies_with_SPC_4_T10_BSR_INCITS_513_revision_37a { + get { + return ResourceManager.GetString("Device_complies_with_SPC_4_T10_BSR_INCITS_513_revision_37a", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPC-5 (no version claimed). + /// + internal static string Device_complies_with_SPC_5_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SPC_5_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPC ANSI INCITS 301-1997. + /// + internal static string Device_complies_with_SPC_ANSI_INCITS_301_1997 { + get { + return ResourceManager.GetString("Device_complies_with_SPC_ANSI_INCITS_301_1997", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPC (no version claimed). + /// + internal static string Device_complies_with_SPC_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SPC_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPC T10/0995-D revision 11a. + /// + internal static string Device_complies_with_SPC_T10_0995_D_revision_11a { + get { + return ResourceManager.GetString("Device_complies_with_SPC_T10_0995_D_revision_11a", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPI-2 ANSI INCITS 302-1999. + /// + internal static string Device_complies_with_SPI_2_ANSI_INCITS_302_1999 { + get { + return ResourceManager.GetString("Device_complies_with_SPI_2_ANSI_INCITS_302_1999", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPI-2 (no version claimed). + /// + internal static string Device_complies_with_SPI_2_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SPI_2_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPI-2 T10/1142-D revision 20b. + /// + internal static string Device_complies_with_SPI_2_T10_1142_D_revision_20b { + get { + return ResourceManager.GetString("Device_complies_with_SPI_2_T10_1142_D_revision_20b", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPI-3 ANSI INCITS 336-2000. + /// + internal static string Device_complies_with_SPI_3_ANSI_INCITS_336_2000 { + get { + return ResourceManager.GetString("Device_complies_with_SPI_3_ANSI_INCITS_336_2000", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPI-3 (no version claimed). + /// + internal static string Device_complies_with_SPI_3_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SPI_3_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPI-3 T10/1302-D revision 10. + /// + internal static string Device_complies_with_SPI_3_T10_1302_D_revision_10 { + get { + return ResourceManager.GetString("Device_complies_with_SPI_3_T10_1302_D_revision_10", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPI-3 T10/1302-D revision 13a. + /// + internal static string Device_complies_with_SPI_3_T10_1302_D_revision_13a { + get { + return ResourceManager.GetString("Device_complies_with_SPI_3_T10_1302_D_revision_13a", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPI-3 T10/1302-D revision 14. + /// + internal static string Device_complies_with_SPI_3_T10_1302_D_revision_14 { + get { + return ResourceManager.GetString("Device_complies_with_SPI_3_T10_1302_D_revision_14", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPI-4 ANSI INCITS 362-2002. + /// + internal static string Device_complies_with_SPI_4_ANSI_INCITS_362_2002 { + get { + return ResourceManager.GetString("Device_complies_with_SPI_4_ANSI_INCITS_362_2002", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPI-4 (no version claimed). + /// + internal static string Device_complies_with_SPI_4_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SPI_4_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPI-4 T10/1365-D revision 10. + /// + internal static string Device_complies_with_SPI_4_T10_1365_D_revision_10 { + get { + return ResourceManager.GetString("Device_complies_with_SPI_4_T10_1365_D_revision_10", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPI-4 T10/1365-D revision 7. + /// + internal static string Device_complies_with_SPI_4_T10_1365_D_revision_7 { + get { + return ResourceManager.GetString("Device_complies_with_SPI_4_T10_1365_D_revision_7", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPI-4 T10/1365-D revision 9. + /// + internal static string Device_complies_with_SPI_4_T10_1365_D_revision_9 { + get { + return ResourceManager.GetString("Device_complies_with_SPI_4_T10_1365_D_revision_9", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPI-5 ANSI INCITS 367-2003. + /// + internal static string Device_complies_with_SPI_5_ANSI_INCITS_367_2003 { + get { + return ResourceManager.GetString("Device_complies_with_SPI_5_ANSI_INCITS_367_2003", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPI-5 (no version claimed). + /// + internal static string Device_complies_with_SPI_5_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SPI_5_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPI-5 T10/1525-D revision 3. + /// + internal static string Device_complies_with_SPI_5_T10_1525_D_revision_3 { + get { + return ResourceManager.GetString("Device_complies_with_SPI_5_T10_1525_D_revision_3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPI-5 T10/1525-D revision 5. + /// + internal static string Device_complies_with_SPI_5_T10_1525_D_revision_5 { + get { + return ResourceManager.GetString("Device_complies_with_SPI_5_T10_1525_D_revision_5", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPI-5 T10/1525-D revision 6. + /// + internal static string Device_complies_with_SPI_5_T10_1525_D_revision_6 { + get { + return ResourceManager.GetString("Device_complies_with_SPI_5_T10_1525_D_revision_6", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPI ANSI INCITS 253-1995. + /// + internal static string Device_complies_with_SPI_ANSI_INCITS_253_1995 { + get { + return ResourceManager.GetString("Device_complies_with_SPI_ANSI_INCITS_253_1995", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPI ANSI INCITS 253-1995 with SPI Amnd ANSI INCITS 253/AM1-1998. + /// + internal static string Device_complies_with_SPI_ANSI_INCITS_253_1995_with_SPI_Amnd_ANSI_INCITS_253_AM1_1998 { + get { + return ResourceManager.GetString("Device_complies_with_SPI_ANSI_INCITS_253_1995_with_SPI_Amnd_ANSI_INCITS_253_AM1_1" + + "998", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPI (no version claimed). + /// + internal static string Device_complies_with_SPI_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SPI_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPI T10/0855-D revision 15a. + /// + internal static string Device_complies_with_SPI_T10_0855_D_revision_15a { + get { + return ResourceManager.GetString("Device_complies_with_SPI_T10_0855_D_revision_15a", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPI T10/0855-D revision 15a with SPI Amnd revision 3a. + /// + internal static string Device_complies_with_SPI_T10_0855_D_revision_15a_with_SPI_Amnd_revision_3a { + get { + return ResourceManager.GetString("Device_complies_with_SPI_T10_0855_D_revision_15a_with_SPI_Amnd_revision_3a", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPL-2 ANSI INCITS 505-2013. + /// + internal static string Device_complies_with_SPL_2_ANSI_INCITS_505_2013 { + get { + return ResourceManager.GetString("Device_complies_with_SPL_2_ANSI_INCITS_505_2013", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPL-2 (no version claimed). + /// + internal static string Device_complies_with_SPL_2_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SPL_2_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPL-2 T10/BSR INCITS 505 revision 4. + /// + internal static string Device_complies_with_SPL_2_T10_BSR_INCITS_505_revision_4 { + get { + return ResourceManager.GetString("Device_complies_with_SPL_2_T10_BSR_INCITS_505_revision_4", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPL-2 T10/BSR INCITS 505 revision 5. + /// + internal static string Device_complies_with_SPL_2_T10_BSR_INCITS_505_revision_5 { + get { + return ResourceManager.GetString("Device_complies_with_SPL_2_T10_BSR_INCITS_505_revision_5", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPL-3 ANSI INCITS 492-2015. + /// + internal static string Device_complies_with_SPL_3_ANSI_INCITS_492_2015 { + get { + return ResourceManager.GetString("Device_complies_with_SPL_3_ANSI_INCITS_492_2015", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPL-3 (no version claimed). + /// + internal static string Device_complies_with_SPL_3_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SPL_3_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPL-3 T10/BSR INCITS 492 revision 6. + /// + internal static string Device_complies_with_SPL_3_T10_BSR_INCITS_492_revision_6 { + get { + return ResourceManager.GetString("Device_complies_with_SPL_3_T10_BSR_INCITS_492_revision_6", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPL-3 T10/BSR INCITS 492 revision 7. + /// + internal static string Device_complies_with_SPL_3_T10_BSR_INCITS_492_revision_7 { + get { + return ResourceManager.GetString("Device_complies_with_SPL_3_T10_BSR_INCITS_492_revision_7", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPL-4 (no version claimed). + /// + internal static string Device_complies_with_SPL_4_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SPL_4_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPL ANSI INCITS 476-2011. + /// + internal static string Device_complies_with_SPL_ANSI_INCITS_476_2011 { + get { + return ResourceManager.GetString("Device_complies_with_SPL_ANSI_INCITS_476_2011", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPL ANSI INCITS 476-2011 + SPL AM1 INCITS 476/AM1 2012. + /// + internal static string Device_complies_with_SPL_ANSI_INCITS_476_2011_SPL_AM1_INCITS_476_AM1_2012 { + get { + return ResourceManager.GetString("Device_complies_with_SPL_ANSI_INCITS_476_2011_SPL_AM1_INCITS_476_AM1_2012", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPL ISO/IEC 14776-261:2012. + /// + internal static string Device_complies_with_SPL_ISO_IEC_14776_261_2012 { + get { + return ResourceManager.GetString("Device_complies_with_SPL_ISO_IEC_14776_261_2012", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPL (no version claimed). + /// + internal static string Device_complies_with_SPL_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SPL_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPL T10/2124-D revision 6a. + /// + internal static string Device_complies_with_SPL_T10_2124_D_revision_6a { + get { + return ResourceManager.GetString("Device_complies_with_SPL_T10_2124_D_revision_6a", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SPL T10/2124-D revision 7. + /// + internal static string Device_complies_with_SPL_T10_2124_D_revision_7 { + get { + return ResourceManager.GetString("Device_complies_with_SPL_T10_2124_D_revision_7", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SRP ANSI INCITS 365-2002. + /// + internal static string Device_complies_with_SRP_ANSI_INCITS_365_2002 { + get { + return ResourceManager.GetString("Device_complies_with_SRP_ANSI_INCITS_365_2002", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SRP (no version claimed). + /// + internal static string Device_complies_with_SRP_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SRP_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SRP T10/1415-D revision 10. + /// + internal static string Device_complies_with_SRP_T10_1415_D_revision_10 { + get { + return ResourceManager.GetString("Device_complies_with_SRP_T10_1415_D_revision_10", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SRP T10/1415-D revision 16a. + /// + internal static string Device_complies_with_SRP_T10_1415_D_revision_16a { + get { + return ResourceManager.GetString("Device_complies_with_SRP_T10_1415_D_revision_16a", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSA-PH2 ANSI INCITS 293-1996. + /// + internal static string Device_complies_with_SSA_PH2_ANSI_INCITS_293_1996 { + get { + return ResourceManager.GetString("Device_complies_with_SSA_PH2_ANSI_INCITS_293_1996", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSA-PH2 (no version claimed). + /// + internal static string Device_complies_with_SSA_PH2_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SSA_PH2_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSA-PH2 T10.1/1145-D revision 09c. + /// + internal static string Device_complies_with_SSA_PH2_T10_1_1145_D_revision_09c { + get { + return ResourceManager.GetString("Device_complies_with_SSA_PH2_T10_1_1145_D_revision_09c", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSA-PH3 ANSI INCITS 307-1998. + /// + internal static string Device_complies_with_SSA_PH3_ANSI_INCITS_307_1998 { + get { + return ResourceManager.GetString("Device_complies_with_SSA_PH3_ANSI_INCITS_307_1998", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSA-PH3 (no version claimed). + /// + internal static string Device_complies_with_SSA_PH3_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SSA_PH3_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSA-PH3 T10.1/1146-D revision 05b. + /// + internal static string Device_complies_with_SSA_PH3_T10_1_1146_D_revision_05b { + get { + return ResourceManager.GetString("Device_complies_with_SSA_PH3_T10_1_1146_D_revision_05b", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSA-S2P ANSI INCITS 294-1996. + /// + internal static string Device_complies_with_SSA_S2P_ANSI_INCITS_294_1996 { + get { + return ResourceManager.GetString("Device_complies_with_SSA_S2P_ANSI_INCITS_294_1996", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSA-S2P (no version claimed). + /// + internal static string Device_complies_with_SSA_S2P_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SSA_S2P_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSA-S2P T10.1/1121-D revision 07b. + /// + internal static string Device_complies_with_SSA_S2P_T10_1_1121_D_revision_07b { + get { + return ResourceManager.GetString("Device_complies_with_SSA_S2P_T10_1_1121_D_revision_07b", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSA-S3P ANSI INCITS 309-1998. + /// + internal static string Device_complies_with_SSA_S3P_ANSI_INCITS_309_1998 { + get { + return ResourceManager.GetString("Device_complies_with_SSA_S3P_ANSI_INCITS_309_1998", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSA-S3P (no version claimed). + /// + internal static string Device_complies_with_SSA_S3P_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SSA_S3P_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSA-S3P T10.1/1051-D revision 05b. + /// + internal static string Device_complies_with_SSA_S3P_T10_1_1051_D_revision_05b { + get { + return ResourceManager.GetString("Device_complies_with_SSA_S3P_T10_1_1051_D_revision_05b", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSA-TL1 ANSI INCITS 295-1996. + /// + internal static string Device_complies_with_SSA_TL1_ANSI_INCITS_295_1996 { + get { + return ResourceManager.GetString("Device_complies_with_SSA_TL1_ANSI_INCITS_295_1996", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSA-TL1 (no version claimed). + /// + internal static string Device_complies_with_SSA_TL1_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SSA_TL1_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSA-TL1 T10.1/0989-D revision 10b. + /// + internal static string Device_complies_with_SSA_TL1_T10_1_0989_D_revision_10b { + get { + return ResourceManager.GetString("Device_complies_with_SSA_TL1_T10_1_0989_D_revision_10b", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSA-TL2 ANSI INCITS 308-1998. + /// + internal static string Device_complies_with_SSA_TL2_ANSI_INCITS_308_1998 { + get { + return ResourceManager.GetString("Device_complies_with_SSA_TL2_ANSI_INCITS_308_1998", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSA-TL2 (no version claimed). + /// + internal static string Device_complies_with_SSA_TL2_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SSA_TL2_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSA-TL2 T10.1/1147-D revision 05b. + /// + internal static string Device_complies_with_SSA_TL2_T10_1_1147_D_revision_05b { + get { + return ResourceManager.GetString("Device_complies_with_SSA_TL2_T10_1_1147_D_revision_05b", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSC-2 ANSI INCITS 380-2003. + /// + internal static string Device_complies_with_SSC_2_ANSI_INCITS_380_2003 { + get { + return ResourceManager.GetString("Device_complies_with_SSC_2_ANSI_INCITS_380_2003", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSC-2 (no version claimed). + /// + internal static string Device_complies_with_SSC_2_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SSC_2_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSC-2 T10/1434-D revision 7. + /// + internal static string Device_complies_with_SSC_2_T10_1434_D_revision_7 { + get { + return ResourceManager.GetString("Device_complies_with_SSC_2_T10_1434_D_revision_7", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSC-2 T10/1434-D revision 9. + /// + internal static string Device_complies_with_SSC_2_T10_1434_D_revision_9 { + get { + return ResourceManager.GetString("Device_complies_with_SSC_2_T10_1434_D_revision_9", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSC-3 ANSI INCITS 467-2011. + /// + internal static string Device_complies_with_SSC_3_ANSI_INCITS_467_2011 { + get { + return ResourceManager.GetString("Device_complies_with_SSC_3_ANSI_INCITS_467_2011", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSC-3 ISO/IEC 14776-333:2013. + /// + internal static string Device_complies_with_SSC_3_ISO_IEC_14776_333_2013 { + get { + return ResourceManager.GetString("Device_complies_with_SSC_3_ISO_IEC_14776_333_2013", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSC-3 (no version claimed). + /// + internal static string Device_complies_with_SSC_3_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SSC_3_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSC-3 T10/1611-D revision 04a. + /// + internal static string Device_complies_with_SSC_3_T10_1611_D_revision_04a { + get { + return ResourceManager.GetString("Device_complies_with_SSC_3_T10_1611_D_revision_04a", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSC-3 T10/1611-D revision 05. + /// + internal static string Device_complies_with_SSC_3_T10_1611_D_revision_05 { + get { + return ResourceManager.GetString("Device_complies_with_SSC_3_T10_1611_D_revision_05", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSC-4 ANSI INCITS 516-2013. + /// + internal static string Device_complies_with_SSC_4_ANSI_INCITS_516_2013 { + get { + return ResourceManager.GetString("Device_complies_with_SSC_4_ANSI_INCITS_516_2013", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSC-4 (no version claimed). + /// + internal static string Device_complies_with_SSC_4_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SSC_4_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSC-4 T10/BSR INCITS 516 revision 2. + /// + internal static string Device_complies_with_SSC_4_T10_BSR_INCITS_516_revision_2 { + get { + return ResourceManager.GetString("Device_complies_with_SSC_4_T10_BSR_INCITS_516_revision_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSC-4 T10/BSR INCITS 516 revision 3. + /// + internal static string Device_complies_with_SSC_4_T10_BSR_INCITS_516_revision_3 { + get { + return ResourceManager.GetString("Device_complies_with_SSC_4_T10_BSR_INCITS_516_revision_3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSC-5 (no version claimed). + /// + internal static string Device_complies_with_SSC_5_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SSC_5_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSC ANSI INCITS 335-2000. + /// + internal static string Device_complies_with_SSC_ANSI_INCITS_335_2000 { + get { + return ResourceManager.GetString("Device_complies_with_SSC_ANSI_INCITS_335_2000", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSC (no version claimed). + /// + internal static string Device_complies_with_SSC_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SSC_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSC T10/0997-D revision 17. + /// + internal static string Device_complies_with_SSC_T10_0997_D_revision_17 { + get { + return ResourceManager.GetString("Device_complies_with_SSC_T10_0997_D_revision_17", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SSC T10/0997-D revision 22. + /// + internal static string Device_complies_with_SSC_T10_0997_D_revision_22 { + get { + return ResourceManager.GetString("Device_complies_with_SSC_T10_0997_D_revision_22", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SST (no version claimed). + /// + internal static string Device_complies_with_SST_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_SST_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with SST T10/1380-D revision 8b. + /// + internal static string Device_complies_with_SST_T10_1380_D_revision_8b { + get { + return ResourceManager.GetString("Device_complies_with_SST_T10_1380_D_revision_8b", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with UAS-2 (no version claimed). + /// + internal static string Device_complies_with_UAS_2_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_UAS_2_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with UAS ANSI INCITS 471-2010. + /// + internal static string Device_complies_with_UAS_ANSI_INCITS_471_2010 { + get { + return ResourceManager.GetString("Device_complies_with_UAS_ANSI_INCITS_471_2010", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with UAS ISO/IEC 14776-251:2014. + /// + internal static string Device_complies_with_UAS_ISO_IEC_14776_251_2014 { + get { + return ResourceManager.GetString("Device_complies_with_UAS_ISO_IEC_14776_251_2014", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with UAS (no version claimed). + /// + internal static string Device_complies_with_UAS_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_UAS_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with UAS T10/2095-D revision 02. + /// + internal static string Device_complies_with_UAS_T10_2095_D_revision_02 { + get { + return ResourceManager.GetString("Device_complies_with_UAS_T10_2095_D_revision_02", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with UAS T10/2095-D revision 04. + /// + internal static string Device_complies_with_UAS_T10_2095_D_revision_04 { + get { + return ResourceManager.GetString("Device_complies_with_UAS_T10_2095_D_revision_04", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with Universal Serial Bus Specification, Revision 1.1. + /// + internal static string Device_complies_with_Universal_Serial_Bus_Specification__Revision_1_1 { + get { + return ResourceManager.GetString("Device_complies_with_Universal_Serial_Bus_Specification__Revision_1_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with Universal Serial Bus Specification, Revision 2.0. + /// + internal static string Device_complies_with_Universal_Serial_Bus_Specification__Revision_2_0 { + get { + return ResourceManager.GetString("Device_complies_with_Universal_Serial_Bus_Specification__Revision_2_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with unknown standard code 0x{0:X4}. + /// + internal static string Device_complies_with_unknown_standard_code_0 { + get { + return ResourceManager.GetString("Device_complies_with_unknown_standard_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with USB Mass Storage Class Bulk-Only Transport, Revision 1.0. + /// + internal static string Device_complies_with_USB_Mass_Storage_Class_Bulk_Only_Transport__Revision_1_0 { + get { + return ResourceManager.GetString("Device_complies_with_USB_Mass_Storage_Class_Bulk_Only_Transport__Revision_1_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ZBC BSR INCITS 536 revision 02. + /// + internal static string Device_complies_with_ZBC_BSR_INCITS_536_revision_02 { + get { + return ResourceManager.GetString("Device_complies_with_ZBC_BSR_INCITS_536_revision_02", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device complies with ZBC (no version claimed). + /// + internal static string Device_complies_with_ZBC_no_version_claimed { + get { + return ResourceManager.GetString("Device_complies_with_ZBC_no_version_claimed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DEVICE CONFIGURATION IDENTIFY DMA and DEVICE CONFIGURATION SET DMA are supported. + /// + internal static string DEVICE_CONFIGURATION_IDENTIFY_DMA_and_DEVICE_CONFIGURATION_SET_DMA_are_supported { + get { + return ResourceManager.GetString("DEVICE_CONFIGURATION_IDENTIFY_DMA_and_DEVICE_CONFIGURATION_SET_DMA_are_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device Configuration Overlay feature set is supported. + /// + internal static string Device_Configuration_Overlay_feature_set_is_supported { + get { + return ResourceManager.GetString("Device_Configuration_Overlay_feature_set_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device Configuration Overlay feature set is supported and enabled. + /// + internal static string Device_Configuration_Overlay_feature_set_is_supported_and_enabled { + get { + return ResourceManager.GetString("Device_Configuration_Overlay_feature_set_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device contains an Access Control Coordinator. + /// + internal static string Device_contains_an_Access_Control_Coordinator { + get { + return ResourceManager.GetString("Device_contains_an_Access_Control_Coordinator", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device contains an embedded enclosure services component. + /// + internal static string Device_contains_an_embedded_enclosure_services_component { + get { + return ResourceManager.GetString("Device_contains_an_embedded_enclosure_services_component", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device contains an embedded storage array controller. + /// + internal static string Device_contains_an_embedded_storage_array_controller { + get { + return ResourceManager.GetString("Device_contains_an_embedded_storage_array_controller", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device contains or is attached to a medium changer. + /// + internal static string Device_contains_or_is_attached_to_a_medium_changer { + get { + return ResourceManager.GetString("Device_contains_or_is_attached_to_a_medium_changer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device contents are original. + /// + internal static string Device_contents_are_original { + get { + return ResourceManager.GetString("Device_contents_are_original", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device currently addresses 4096 byte sectors. + /// + internal static string Device_currently_addresses_4096_byte_sectors { + get { + return ResourceManager.GetString("Device_currently_addresses_4096_byte_sectors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device currently addresses 512 byte sectors. + /// + internal static string Device_currently_addresses_512_byte_sectors { + get { + return ResourceManager.GetString("Device_currently_addresses_512_byte_sectors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device currently addresses unknown sector size indicated by code {0}. + /// + internal static string Device_currently_addresses_unknown_sector_size_indicated_by_code_0 { + get { + return ResourceManager.GetString("Device_currently_addresses_unknown_sector_size_indicated_by_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device currently uses BCH(542, 512) ECC. + /// + internal static string Device_currently_uses_BCH_542_512_ECC { + get { + return ResourceManager.GetString("Device_currently_uses_BCH_542_512_ECC", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device currently uses no ECC. + /// + internal static string Device_currently_uses_no_ECC { + get { + return ResourceManager.GetString("Device_currently_uses_no_ECC", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device currently uses unknown ECC code {0}. + /// + internal static string Device_currently_uses_unknown_ECC_code_0 { + get { + return ResourceManager.GetString("Device_currently_uses_unknown_ECC_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device does not claim to comply with any SCSI ANSI standard. + /// + internal static string Device_does_not_claim_to_comply_with_any_SCSI_ANSI_standard { + get { + return ResourceManager.GetString("Device_does_not_claim_to_comply_with_any_SCSI_ANSI_standard", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device does not claim to comply with any SCSI ECMA standard. + /// + internal static string Device_does_not_claim_to_comply_with_any_SCSI_ECMA_standard { + get { + return ResourceManager.GetString("Device_does_not_claim_to_comply_with_any_SCSI_ECMA_standard", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device does not claim to comply with any SCSI ISO/IEC standard. + /// + internal static string Device_does_not_claim_to_comply_with_any_SCSI_ISO_IEC_standard { + get { + return ResourceManager.GetString("Device_does_not_claim_to_comply_with_any_SCSI_ISO_IEC_standard", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device does not report an optimal read size. + /// + internal static string Device_does_not_report_an_optimal_read_size { + get { + return ResourceManager.GetString("Device_does_not_report_an_optimal_read_size", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device does not report an optimal trim size. + /// + internal static string Device_does_not_report_an_optimal_trim_size { + get { + return ResourceManager.GetString("Device_does_not_report_an_optimal_trim_size", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device does not report an optimal write size. + /// + internal static string Device_does_not_report_an_optimal_write_size { + get { + return ResourceManager.GetString("Device_does_not_report_an_optimal_write_size", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device does not require SET FEATURES to spin up and IDENTIFY DEVICE response is complete.. + /// + internal static string Device_does_not_require_SET_FEATURES_to_spin_up_and_IDENTIFY_DEVICE_response_is_complete { + get { + return ResourceManager.GetString("Device_does_not_require_SET_FEATURES_to_spin_up_and_IDENTIFY_DEVICE_response_is_c" + + "omplete", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device does not require SET FEATURES to spin up and IDENTIFY DEVICE response is incomplete.. + /// + internal static string Device_does_not_require_SET_FEATURES_to_spin_up_and_IDENTIFY_DEVICE_response_is_incomplete { + get { + return ResourceManager.GetString("Device_does_not_require_SET_FEATURES_to_spin_up_and_IDENTIFY_DEVICE_response_is_i" + + "ncomplete", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device does not rotate.. + /// + internal static string Device_does_not_rotate { + get { + return ResourceManager.GetString("Device_does_not_rotate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device does not support asymmetrical access. + /// + internal static string Device_does_not_support_asymmetrical_access { + get { + return ResourceManager.GetString("Device_does_not_support_asymmetrical_access", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device does not support CPRM. + /// + internal static string Device_does_not_support_CPRM { + get { + return ResourceManager.GetString("Device_does_not_support_CPRM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device does not use CPRM. + /// + internal static string Device_does_not_use_CPRM { + get { + return ResourceManager.GetString("Device_does_not_use_CPRM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device emulates unknown sector size indicated by code {0}. + /// + internal static string Device_emulates_unknown_sector_size_indicated_by_code_0 { + get { + return ResourceManager.GetString("Device_emulates_unknown_sector_size_indicated_by_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device encrypts all user data. + /// + internal static string Device_encrypts_all_user_data { + get { + return ResourceManager.GetString("Device_encrypts_all_user_data", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device erase groups are {0} KiB. + /// + internal static string Device_erase_groups_are_0_KiB { + get { + return ResourceManager.GetString("Device_erase_groups_are_0_KiB", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device exceeded its maximum estimated life time. + /// + internal static string Device_exceeded_its_maximum_estimated_life_time { + get { + return ResourceManager.GetString("Device_exceeded_its_maximum_estimated_life_time", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device follows CFast specification. + /// + internal static string Device_follows_CFast_specification { + get { + return ResourceManager.GetString("Device_follows_CFast_specification", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device follows compatibility MMC command set.. + /// + internal static string Device_follows_compatibility_MMC_command_set { + get { + return ResourceManager.GetString("Device_follows_compatibility_MMC_command_set", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device follows IEEE-1667. + /// + internal static string Device_follows_IEEE_1667 { + get { + return ResourceManager.GetString("Device_follows_IEEE_1667", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device follows SecureDigital Physical Layer Specification version 1.0x. + /// + internal static string Device_follows_SecureDigital_Physical_Layer_Specification_version_1_0x { + get { + return ResourceManager.GetString("Device_follows_SecureDigital_Physical_Layer_Specification_version_1_0x", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device follows SecureDigital Physical Layer Specification version 1.10. + /// + internal static string Device_follows_SecureDigital_Physical_Layer_Specification_version_1_10 { + get { + return ResourceManager.GetString("Device_follows_SecureDigital_Physical_Layer_Specification_version_1_10", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device follows SecureDigital Physical Layer Specification version 2.00. + /// + internal static string Device_follows_SecureDigital_Physical_Layer_Specification_version_2_00 { + get { + return ResourceManager.GetString("Device_follows_SecureDigital_Physical_Layer_Specification_version_2_00", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device follows SecureDigital Physical Layer Specification version 3.0x. + /// + internal static string Device_follows_SecureDigital_Physical_Layer_Specification_version_3_0x { + get { + return ResourceManager.GetString("Device_follows_SecureDigital_Physical_Layer_Specification_version_3_0x", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device follows SecureDigital Physical Layer Specification version 4.xx. + /// + internal static string Device_follows_SecureDigital_Physical_Layer_Specification_version_4_xx { + get { + return ResourceManager.GetString("Device_follows_SecureDigital_Physical_Layer_Specification_version_4_xx", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device follows SecureDigital Physical Layer Specification version 5.xx. + /// + internal static string Device_follows_SecureDigital_Physical_Layer_Specification_version_5_xx { + get { + return ResourceManager.GetString("Device_follows_SecureDigital_Physical_Layer_Specification_version_5_xx", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device follows SecureDigital Physical Layer Specification version 6.xx. + /// + internal static string Device_follows_SecureDigital_Physical_Layer_Specification_version_6_xx { + get { + return ResourceManager.GetString("Device_follows_SecureDigital_Physical_Layer_Specification_version_6_xx", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device follows SecureDigital Physical Layer Specification version 7.xx. + /// + internal static string Device_follows_SecureDigital_Physical_Layer_Specification_version_7_xx { + get { + return ResourceManager.GetString("Device_follows_SecureDigital_Physical_Layer_Specification_version_7_xx", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device follows SecureDigital Physical Layer Specification version 8.xx. + /// + internal static string Device_follows_SecureDigital_Physical_Layer_Specification_version_8_xx { + get { + return ResourceManager.GetString("Device_follows_SecureDigital_Physical_Layer_Specification_version_8_xx", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device follows SecureDigital Physical Layer Specification with unknown version {0}.{1}.{2}.{3}. + /// + internal static string Device_follows_SecureDigital_Physical_Layer_Specification_with_unknown_version_0_1_2_3 { + get { + return ResourceManager.GetString("Device_follows_SecureDigital_Physical_Layer_Specification_with_unknown_version_0_" + + "1_2_3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device follows standard MMC command set v4.0.. + /// + internal static string Device_follows_standard_MMC_command_set_v4_0 { + get { + return ResourceManager.GetString("Device_follows_standard_MMC_command_set_v4_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device follows standard MMC command set with unknown version code {0}.. + /// + internal static string Device_follows_standard_MMC_command_set_with_unknown_version_code_0 { + get { + return ResourceManager.GetString("Device_follows_standard_MMC_command_set_with_unknown_version_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device follows unknown MMC command set code {0} with revision code {1}.. + /// + internal static string Device_follows_unknown_MMC_command_set_code_0_with_revision_code_1 { + get { + return ResourceManager.GetString("Device_follows_unknown_MMC_command_set_code_0_with_revision_code_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device has {0} blocks. + /// + internal static string Device_has_0_blocks { + get { + return ResourceManager.GetString("Device_has_0_blocks", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device has {0} bytes. + /// + internal static string Device_has_0_bytes { + get { + return ResourceManager.GetString("Device_has_0_bytes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device has {0} GiB. + /// + internal static string Device_has_0_GiB { + get { + return ResourceManager.GetString("Device_has_0_GiB", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device has {0} KiB. + /// + internal static string Device_has_0_KiB { + get { + return ResourceManager.GetString("Device_has_0_KiB", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device has {0} KiB of cache. + /// + internal static string Device_has_0_KiB_of_cache { + get { + return ResourceManager.GetString("Device_has_0_KiB_of_cache", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device has {0} MiB. + /// + internal static string Device_has_0_MiB { + get { + return ResourceManager.GetString("Device_has_0_MiB", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device has {0} sectors. + /// + internal static string Device_has_0_sectors { + get { + return ResourceManager.GetString("Device_has_0_sectors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device has {0} TiB. + /// + internal static string Device_has_0_TiB { + get { + return ResourceManager.GetString("Device_has_0_TiB", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device has a {0} KiB boot partition. + /// + internal static string Device_has_a_0_KiB_boot_partition { + get { + return ResourceManager.GetString("Device_has_a_0_KiB_boot_partition", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device has a {0} KiB replay protected memory block. + /// + internal static string Device_has_a_0_KiB_replay_protected_memory_block { + get { + return ResourceManager.GetString("Device_has_a_0_KiB_replay_protected_memory_block", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device has a non-volatile cache. + /// + internal static string Device_has_a_non_volatile_cache { + get { + return ResourceManager.GetString("Device_has_a_non_volatile_cache", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device has a page size of {0} KiB. + /// + internal static string Device_has_a_page_size_of_0_KiB { + get { + return ResourceManager.GetString("Device_has_a_page_size_of_0_KiB", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device has a volatile cache. + /// + internal static string Device_has_a_volatile_cache { + get { + return ResourceManager.GetString("Device_has_a_volatile_cache", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device has a World Wide Name. + /// + internal static string Device_has_a_World_Wide_Name { + get { + return ResourceManager.GetString("Device_has_a_World_Wide_Name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device has critical operations outstanding. + /// + internal static string Device_has_critical_operations_outstanding { + get { + return ResourceManager.GetString("Device_has_critical_operations_outstanding", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device has disabled protection information checks. + /// + internal static string Device_has_disabled_protection_information_checks { + get { + return ResourceManager.GetString("Device_has_disabled_protection_information_checks", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device has enabled command queuing. + /// + internal static string Device_has_enabled_command_queuing { + get { + return ResourceManager.GetString("Device_has_enabled_command_queuing", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device has no cache. + /// + internal static string Device_has_no_cache { + get { + return ResourceManager.GetString("Device_has_no_cache", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device has no pending background operations. + /// + internal static string Device_has_no_pending_background_operations { + get { + return ResourceManager.GetString("Device_has_no_pending_background_operations", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device has non critical operations outstanding. + /// + internal static string Device_has_non_critical_operations_outstanding { + get { + return ResourceManager.GetString("Device_has_non_critical_operations_outstanding", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device has performance impacted operations outstanding. + /// + internal static string Device_has_performance_impacted_operations_outstanding { + get { + return ResourceManager.GetString("Device_has_performance_impacted_operations_outstanding", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device has secure write protection enabled. + /// + internal static string Device_has_secure_write_protection_enabled { + get { + return ResourceManager.GetString("Device_has_secure_write_protection_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device has unknown timing mode {0}.. + /// + internal static string Device_has_unknown_timing_mode_0 { + get { + return ResourceManager.GetString("Device_has_unknown_timing_mode_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device implements alternate reset handling. + /// + internal static string Device_implements_alternate_reset_handling { + get { + return ResourceManager.GetString("Device_implements_alternate_reset_handling", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device implements configurable driver stage. + /// + internal static string Device_implements_configurable_driver_stage { + get { + return ResourceManager.GetString("Device_implements_configurable_driver_stage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device implements HPI using CMD12. + /// + internal static string Device_implements_HPI_using_CMD12 { + get { + return ResourceManager.GetString("Device_implements_HPI_using_CMD12", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device implements HPI using CMD13. + /// + internal static string Device_implements_HPI_using_CMD13 { + get { + return ResourceManager.GetString("Device_implements_HPI_using_CMD13", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device implements RESET as a soft reset. + /// + internal static string Device_implements_RESET_as_a_soft_reset { + get { + return ResourceManager.GetString("Device_implements_RESET_as_a_soft_reset", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device indicates a specific minimum standby timer value. + /// + internal static string Device_indicates_a_specific_minimum_standby_timer_value { + get { + return ResourceManager.GetString("Device_indicates_a_specific_minimum_standby_timer_value", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device informs it should be replace immediately. + /// + internal static string Device_informs_it_should_be_replace_immediately { + get { + return ResourceManager.GetString("Device_informs_it_should_be_replace_immediately", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device informs it should be replaced soon. + /// + internal static string Device_informs_it_should_be_replaced_soon { + get { + return ResourceManager.GetString("Device_informs_it_should_be_replaced_soon", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device informs it's in good health. + /// + internal static string Device_informs_its_in_good_health { + get { + return ResourceManager.GetString("Device_informs_its_in_good_health", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device-initiated power management is supported. + /// + internal static string Device_initiated_power_management_is_supported { + get { + return ResourceManager.GetString("Device_initiated_power_management_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device-initiated power management is supported and enabled. + /// + internal static string Device_initiated_power_management_is_supported_and_enabled { + get { + return ResourceManager.GetString("Device_initiated_power_management_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is a dual device supporting CD and Non-CD Optical. + /// + internal static string Device_is_a_dual_device_supporting_CD_and_Non_CD_Optical { + get { + return ResourceManager.GetString("Device_is_a_dual_device_supporting_CD_and_Non_CD_Optical", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is byte addressed. + /// + internal static string Device_is_byte_addressed { + get { + return ResourceManager.GetString("Device_is_byte_addressed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is capable of recognizing both medium partitions and format. + /// + internal static string Device_is_capable_of_recognizing_both_medium_partitions_and_format { + get { + return ResourceManager.GetString("Device_is_capable_of_recognizing_both_medium_partitions_and_format", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is capable of recognizing medium format. + /// + internal static string Device_is_capable_of_recognizing_medium_format { + get { + return ResourceManager.GetString("Device_is_capable_of_recognizing_medium_format", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is capable of recognizing medium partitions. + /// + internal static string Device_is_capable_of_recognizing_medium_partitions { + get { + return ResourceManager.GetString("Device_is_capable_of_recognizing_medium_partitions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is connected and supported.. + /// + internal static string Device_is_connected_and_supported { + get { + return ResourceManager.GetString("Device_is_connected_and_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is connected but unsupported.. + /// + internal static string Device_is_connected_but_unsupported { + get { + return ResourceManager.GetString("Device_is_connected_but_unsupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is emulating 512 byte sectors. + /// + internal static string Device_is_emulating_512_byte_sectors { + get { + return ResourceManager.GetString("Device_is_emulating_512_byte_sectors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is fixed. + /// + internal static string Device_is_fixed { + get { + return ResourceManager.GetString("Device_is_fixed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is formatted like a floppy disk using Microsoft FAT. + /// + internal static string Device_is_formatted_like_a_floppy_disk_using_Microsoft_FAT { + get { + return ResourceManager.GetString("Device_is_formatted_like_a_floppy_disk_using_Microsoft_FAT", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is formatted like a hard disk. + /// + internal static string Device_is_formatted_like_a_hard_disk { + get { + return ResourceManager.GetString("Device_is_formatted_like_a_hard_disk", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is hard sectored. + /// + internal static string Device_is_hard_sectored { + get { + return ResourceManager.GetString("Device_is_hard_sectored", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is in High Speed mode.. + /// + internal static string Device_is_in_High_Speed_mode { + get { + return ResourceManager.GetString("Device_is_in_High_Speed_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is in highest relative power consumption level. + /// + internal static string Device_is_in_highest_relative_power_consumption_level { + get { + return ResourceManager.GetString("Device_is_in_highest_relative_power_consumption_level", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is in HS-200 mode.. + /// + internal static string Device_is_in_HS200_mode { + get { + return ResourceManager.GetString("Device_is_in_HS200_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is in HS-400 mode.. + /// + internal static string Device_is_in_HS400_mode { + get { + return ResourceManager.GetString("Device_is_in_HS400_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is in intermediate relative power consumption level. + /// + internal static string Device_is_in_intermediate_relative_power_consumption_level { + get { + return ResourceManager.GetString("Device_is_in_intermediate_relative_power_consumption_level", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is in low power mode. + /// + internal static string Device_is_in_low_power_mode { + get { + return ResourceManager.GetString("Device_is_in_low_power_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is in lowest relative power consumption level. + /// + internal static string Device_is_in_lowest_relative_power_consumption_level { + get { + return ResourceManager.GetString("Device_is_in_lowest_relative_power_consumption_level", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is not boot enabled. + /// + internal static string Device_is_not_boot_enabled { + get { + return ResourceManager.GetString("Device_is_not_boot_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is not capable of recognizing neither medium partitions nor format. + /// + internal static string Device_is_not_capable_of_recognizing_neither_medium_partitions_nor_format { + get { + return ResourceManager.GetString("Device_is_not_capable_of_recognizing_neither_medium_partitions_nor_format", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is not MFM encoded. + /// + internal static string Device_is_not_MFM_encoded { + get { + return ResourceManager.GetString("Device_is_not_MFM_encoded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is permanently write protected. + /// + internal static string Device_is_permanently_write_protected { + get { + return ResourceManager.GetString("Device_is_permanently_write_protected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is powering up. + /// + internal static string Device_is_powering_up { + get { + return ResourceManager.GetString("Device_is_powering_up", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is removable. + /// + internal static string Device_is_removable { + get { + return ResourceManager.GetString("Device_is_removable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is SDHC, SDXC or higher. + /// + internal static string Device_is_SDHC_SDXC_or_higher { + get { + return ResourceManager.GetString("Device_is_SDHC_SDXC_or_higher", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is sector addressed. + /// + internal static string Device_is_sector_addressed { + get { + return ResourceManager.GetString("Device_is_sector_addressed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is soft sectored. + /// + internal static string Device_is_soft_sectored { + get { + return ResourceManager.GetString("Device_is_soft_sectored", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is supported but not connected.. + /// + internal static string Device_is_supported_but_not_connected { + get { + return ResourceManager.GetString("Device_is_supported_but_not_connected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is temporarily write protected. + /// + internal static string Device_is_temporarily_write_protected { + get { + return ResourceManager.GetString("Device_is_temporarily_write_protected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is UHS-II or higher. + /// + internal static string Device_is_UHS_II_or_higher { + get { + return ResourceManager.GetString("Device_is_UHS_II_or_higher", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is using 1-bit data bus. + /// + internal static string Device_is_using_1bit_data_bus { + get { + return ResourceManager.GetString("Device_is_using_1bit_data_bus", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is using 4-bit data bus. + /// + internal static string Device_is_using_4bit_data_bus { + get { + return ResourceManager.GetString("Device_is_using_4bit_data_bus", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is using 4-bit DDR data bus. + /// + internal static string Device_is_using_4bit_DDR_data_bus { + get { + return ResourceManager.GetString("Device_is_using_4bit_DDR_data_bus", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is using 8-bit data bus. + /// + internal static string Device_is_using_8bit_data_bus { + get { + return ResourceManager.GetString("Device_is_using_8bit_data_bus", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is using 8-bit DDR data bus. + /// + internal static string Device_is_using_8bit_DDR_data_bus { + get { + return ResourceManager.GetString("Device_is_using_8bit_DDR_data_bus", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is using natively sized sectors. + /// + internal static string Device_is_using_natively_sized_sectors { + get { + return ResourceManager.GetString("Device_is_using_natively_sized_sectors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is using unknown data bus code {0}. + /// + internal static string Device_is_using_unknown_data_bus_code_0 { + get { + return ResourceManager.GetString("Device_is_using_unknown_data_bus_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device is zoned. + /// + internal static string Device_is_zoned { + get { + return ResourceManager.GetString("Device_is_zoned", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device manufactured month {0} of {1}. + /// + internal static string Device_manufactured_month_0_of_1 { + get { + return ResourceManager.GetString("Device_manufactured_month_0_of_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device may be bigger than 2GiB and have its real size defined in the extended CSD. + /// + internal static string Device_may_be_bigger_than_2GiB_and_have_its_real_size_defined_in_the_extended_CSD { + get { + return ResourceManager.GetString("Device_may_be_bigger_than_2GiB_and_have_its_real_size_defined_in_the_extended_CSD" + + "", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device may erase any or all partitions on MODE SELECT for partitioning. + /// + internal static string Device_may_erase_any_or_all_partitions_on_MODE_SELECT_for_partitioning { + get { + return ResourceManager.GetString("Device_may_erase_any_or_all_partitions_on_MODE_SELECT_for_partitioning", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device must erase a minimum of {0} blocks at a time. + /// + internal static string Device_must_erase_a_minimum_of_0_blocks_at_a_time { + get { + return ResourceManager.GetString("Device_must_erase_a_minimum_of_0_blocks_at_a_time", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device name: {0}. + /// + internal static string Device_name_0 { + get { + return ResourceManager.GetString("Device_name_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device natively uses 4096 byte sectors. + /// + internal static string Device_natively_uses_4096_byte_sectors { + get { + return ResourceManager.GetString("Device_natively_uses_4096_byte_sectors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device natively uses 512 byte sectors. + /// + internal static string Device_natively_uses_512_byte_sectors { + get { + return ResourceManager.GetString("Device_natively_uses_512_byte_sectors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device natively uses unknown sector size indicated by code {0}. + /// + internal static string Device_natively_uses_unknown_sector_size_indicated_by_code_0 { + get { + return ResourceManager.GetString("Device_natively_uses_unknown_sector_size_indicated_by_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device needs cleaning cartridge. + /// + internal static string Device_needs_cleaning_cartridge { + get { + return ResourceManager.GetString("Device_needs_cleaning_cartridge", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device nominal size field value {0} is unknown. + /// + internal static string Device_nominal_size_field_value_0_is_unknown { + get { + return ResourceManager.GetString("Device_nominal_size_field_value_0_is_unknown", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device nominal size is 1.8". + /// + internal static string Device_nominal_size_is_1_8 { + get { + return ResourceManager.GetString("Device_nominal_size_is_1_8", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device nominal size is 2.5". + /// + internal static string Device_nominal_size_is_2_5 { + get { + return ResourceManager.GetString("Device_nominal_size_is_2_5", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device nominal size is 3.5". + /// + internal static string Device_nominal_size_is_3_5 { + get { + return ResourceManager.GetString("Device_nominal_size_is_3_5", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device nominal size is 5.25". + /// + internal static string Device_nominal_size_is_5_25 { + get { + return ResourceManager.GetString("Device_nominal_size_is_5_25", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device nominal size is smaller than 1.8". + /// + internal static string Device_nominal_size_is_smaller_than_1_8 { + get { + return ResourceManager.GetString("Device_nominal_size_is_smaller_than_1_8", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device only supports explicit asymmetrical access. + /// + internal static string Device_only_supports_explicit_asymmetrical_access { + get { + return ResourceManager.GetString("Device_only_supports_explicit_asymmetrical_access", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device only supports implicit asymmetrical access. + /// + internal static string Device_only_supports_implicit_asymmetrical_access { + get { + return ResourceManager.GetString("Device_only_supports_implicit_asymmetrical_access", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device power consumption is dictated by identifier {0} of Power Consumption VPD. + /// + internal static string Device_power_consumption_is_dictated_by_identifier_0_of_Power_Consumption_VPD { + get { + return ResourceManager.GetString("Device_power_consumption_is_dictated_by_identifier_0_of_Power_Consumption_VPD", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device prints directly. + /// + internal static string Device_prints_directly { + get { + return ResourceManager.GetString("Device_prints_directly", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device recognizes one single partition spanning whole medium. + /// + internal static string Device_recognizes_one_single_partition_spanning_whole_medium { + get { + return ResourceManager.GetString("Device_recognizes_one_single_partition_spanning_whole_medium", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device release level: {0}. + /// + internal static string Device_release_level_0 { + get { + return ResourceManager.GetString("Device_release_level_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device requires SET FEATURES to spin up and IDENTIFY DEVICE response is complete.. + /// + internal static string Device_requires_SET_FEATURES_to_spin_up_and_IDENTIFY_DEVICE_response_is_complete { + get { + return ResourceManager.GetString("Device_requires_SET_FEATURES_to_spin_up_and_IDENTIFY_DEVICE_response_is_complete", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device requires SET FEATURES to spin up and IDENTIFY DEVICE response is incomplete.. + /// + internal static string Device_requires_SET_FEATURES_to_spin_up_and_IDENTIFY_DEVICE_response_is_incomplete { + get { + return ResourceManager.GetString("Device_requires_SET_FEATURES_to_spin_up_and_IDENTIFY_DEVICE_response_is_incomplet" + + "e", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DEVICE RESET is supported and enabled. + /// + internal static string DEVICE_RESET_is_supported_and_enabled { + get { + return ResourceManager.GetString("DEVICE_RESET_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device responded to ATA command {0:X2}h. + /// + internal static string Device_responded_to_ATA_command_0 { + get { + return ResourceManager.GetString("Device_responded_to_ATA_command_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device responded to ATA IDENTIFY DEVICE command.. + /// + internal static string Device_responded_to_ATA_IDENTIFY_DEVICE_command { + get { + return ResourceManager.GetString("Device_responded_to_ATA_IDENTIFY_DEVICE_command", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device responded to ATA IDENTIFY PACKET DEVICE command.. + /// + internal static string Device_responded_to_ATA_IDENTIFY_PACKET_DEVICE_command { + get { + return ResourceManager.GetString("Device_responded_to_ATA_IDENTIFY_PACKET_DEVICE_command", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device rotates at {0} rpm.. + /// + internal static string Device_rotates_at_0_rpm { + get { + return ResourceManager.GetString("Device_rotates_at_0_rpm", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device's clock frequency: {0}{1}. + /// + internal static string Device_s_clock_frequency_0_1 { + get { + return ResourceManager.GetString("Device_s_clock_frequency_0_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device's write cache is non-volatile. + /// + internal static string Device_s_write_cache_is_non_volatile { + get { + return ResourceManager.GetString("Device_s_write_cache_is_non_volatile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device sends boot acknowledge. + /// + internal static string Device_sends_boot_acknowledge { + get { + return ResourceManager.GetString("Device_sends_boot_acknowledge", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device shall assert INTRQ when DRQ is set to one. + /// + internal static string Device_shall_assert_INTRQ_when_DRQ_is_set_to_one { + get { + return ResourceManager.GetString("Device_shall_assert_INTRQ_when_DRQ_is_set_to_one", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device shall erase all partitions differing on size on MODE SELECT for partitioning. + /// + internal static string Device_shall_erase_all_partitions_differing_on_size_on_MODE_SELECT_for_partitioning { + get { + return ResourceManager.GetString("Device_shall_erase_all_partitions_differing_on_size_on_MODE_SELECT_for_partitioni" + + "ng", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device shall erase all partitions on MODE SELECT for partitioning. + /// + internal static string Device_shall_erase_all_partitions_on_MODE_SELECT_for_partitioning { + get { + return ResourceManager.GetString("Device_shall_erase_all_partitions_on_MODE_SELECT_for_partitioning", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device shall not erase any partition on MODE SELECT for partitioning. + /// + internal static string Device_shall_not_erase_any_partition_on_MODE_SELECT_for_partitioning { + get { + return ResourceManager.GetString("Device_shall_not_erase_any_partition_on_MODE_SELECT_for_partitioning", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device shall return descriptor format sense data when returning sense data in the same transactions as a CHECK CONDITION. + /// + internal static string Device_shall_return_descriptor_format_sense_data_when_returning_sense_data_in_the_same_transactions_as_a_CHECK_CONDITION { + get { + return ResourceManager.GetString("Device_shall_return_descriptor_format_sense_data_when_returning_sense_data_in_the" + + "_same_transactions_as_a_CHECK_CONDITION", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device shall set DRQ within 3 ms of receiving PACKET. + /// + internal static string Device_shall_set_DRQ_within_3_ms_of_receiving_PACKET { + get { + return ResourceManager.GetString("Device_shall_set_DRQ_within_3_ms_of_receiving_PACKET", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device shall set DRQ within 50 µs of receiving PACKET. + /// + internal static string Device_shall_set_DRQ_within_50_µs_of_receiving_PACKET { + get { + return ResourceManager.GetString("Device_shall_set_DRQ_within_50_µs_of_receiving_PACKET", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device should use number of cache segments or cache segment size for caching. + /// + internal static string Device_should_use_number_of_cache_segments_or_cache_segment_size_for_caching { + get { + return ResourceManager.GetString("Device_should_use_number_of_cache_segments_or_cache_segment_size_for_caching", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device size in 28-bit LBA mode: {0} bytes, {1} Gb, {2} GiB. + /// + internal static string Device_size_in_28_bit_LBA_mode_0_bytes_1_Gb_2_GiB { + get { + return ResourceManager.GetString("Device_size_in_28_bit_LBA_mode_0_bytes_1_Gb_2_GiB", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device size in 28-bit LBA mode: {0} bytes, {1} Mb, {2} MiB. + /// + internal static string Device_size_in_28_bit_LBA_mode_0_bytes_1_Mb_2_MiB { + get { + return ResourceManager.GetString("Device_size_in_28_bit_LBA_mode_0_bytes_1_Mb_2_MiB", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device size in 28-bit LBA mode: {0} bytes, {1} Tb, {2} TiB. + /// + internal static string Device_size_in_28_bit_LBA_mode_0_bytes_1_Tb_2_TiB { + get { + return ResourceManager.GetString("Device_size_in_28_bit_LBA_mode_0_bytes_1_Tb_2_TiB", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device size in 48-bit LBA mode: {0} bytes, {1} Gb, {2} GiB. + /// + internal static string Device_size_in_48_bit_LBA_mode_0_bytes_1_Gb_2_GiB { + get { + return ResourceManager.GetString("Device_size_in_48_bit_LBA_mode_0_bytes_1_Gb_2_GiB", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device size in 48-bit LBA mode: {0} bytes, {1} Mb, {2} MiB. + /// + internal static string Device_size_in_48_bit_LBA_mode_0_bytes_1_Mb_2_MiB { + get { + return ResourceManager.GetString("Device_size_in_48_bit_LBA_mode_0_bytes_1_Mb_2_MiB", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device size in 48-bit LBA mode: {0} bytes, {1} Tb, {2} TiB. + /// + internal static string Device_size_in_48_bit_LBA_mode_0_bytes_1_Tb_2_TiB { + get { + return ResourceManager.GetString("Device_size_in_48_bit_LBA_mode_0_bytes_1_Tb_2_TiB", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device size in CHS mode: {0} bytes, {1} Mb, {2} MiB. + /// + internal static string Device_size_in_CHS_mode_0_bytes_1_Mb_2_MiB { + get { + return ResourceManager.GetString("Device_size_in_CHS_mode_0_bytes_1_Mb_2_MiB", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device smallest write protect group is made of {0} erase groups. + /// + internal static string Device_smallest_write_protect_group_is_made_of_0_erase_groups { + get { + return ResourceManager.GetString("Device_smallest_write_protect_group_is_made_of_0_erase_groups", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device support command classes {0}. + /// + internal static string Device_support_command_classes_0 { + get { + return ResourceManager.GetString("Device_support_command_classes_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports 1-bit data bus. + /// + internal static string Device_supports_1_bit_data_bus { + get { + return ResourceManager.GetString("Device_supports_1_bit_data_bus", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports 16-bit wide data transfers. + /// + internal static string Device_supports_16_bit_wide_data_transfers { + get { + return ResourceManager.GetString("Device_supports_16_bit_wide_data_transfers", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports 16-bit wide SCSI addresses. + /// + internal static string Device_supports_16_bit_wide_SCSI_addresses { + get { + return ResourceManager.GetString("Device_supports_16_bit_wide_SCSI_addresses", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports 26 Mhz mode. + /// + internal static string Device_supports_26_Mhz_mode { + get { + return ResourceManager.GetString("Device_supports_26_Mhz_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports 32-bit wide data transfers. + /// + internal static string Device_supports_32_bit_wide_data_transfers { + get { + return ResourceManager.GetString("Device_supports_32_bit_wide_data_transfers", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports 32-bit wide SCSI addresses. + /// + internal static string Device_supports_32_bit_wide_SCSI_addresses { + get { + return ResourceManager.GetString("Device_supports_32_bit_wide_SCSI_addresses", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports 4-bit data bus. + /// + internal static string Device_supports_4_bit_data_bus { + get { + return ResourceManager.GetString("Device_supports_4_bit_data_bus", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports 52 Mhz mode. + /// + internal static string Device_supports_52_Mhz_mode { + get { + return ResourceManager.GetString("Device_supports_52_Mhz_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports a maximum of {0} bytes for sense data. + /// + internal static string Device_supports_a_maximum_of_0_bytes_for_sense_data { + get { + return ResourceManager.GetString("Device_supports_a_maximum_of_0_bytes_for_sense_data", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports a maximum of {0} packed reads and {1} packed writes. + /// + internal static string Device_supports_a_maximum_of_0_packed_reads_and_1_packed_writes { + get { + return ResourceManager.GetString("Device_supports_a_maximum_of_0_packed_reads_and_1_packed_writes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports alternative boot method. + /// + internal static string Device_supports_alternative_boot_method { + get { + return ResourceManager.GetString("Device_supports_alternative_boot_method", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports Asynchronous Event Reporting Capability. + /// + internal static string Device_supports_Asynchronous_Event_Reporting_Capability { + get { + return ResourceManager.GetString("Device_supports_Asynchronous_Event_Reporting_Capability", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports automatic erase on retired defective blocks. + /// + internal static string Device_supports_automatic_erase_on_retired_defective_blocks { + get { + return ResourceManager.GetString("Device_supports_automatic_erase_on_retired_defective_blocks", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports background operations. + /// + internal static string Device_supports_background_operations { + get { + return ResourceManager.GetString("Device_supports_background_operations", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports basic queueing. + /// + internal static string Device_supports_basic_queueing { + get { + return ResourceManager.GetString("Device_supports_basic_queueing", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports capability-based command security. + /// + internal static string Device_supports_capability_based_command_security { + get { + return ResourceManager.GetString("Device_supports_capability_based_command_security", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports command queuing with a depth of {0}. + /// + internal static string Device_supports_command_queuing_with_a_depth_of_0 { + get { + return ResourceManager.GetString("Device_supports_command_queuing_with_a_depth_of_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports content protection. + /// + internal static string Device_supports_content_protection { + get { + return ResourceManager.GetString("Device_supports_content_protection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports CONTINUE TASK and TARGET TRANSFER DISABLE commands. + /// + internal static string Device_supports_CONTINUE_TASK_and_TARGET_TRANSFER_DISABLE_commands { + get { + return ResourceManager.GetString("Device_supports_CONTINUE_TASK_and_TARGET_TRANSFER_DISABLE_commands", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports Data Tag. + /// + internal static string Device_supports_Data_Tag { + get { + return ResourceManager.GetString("Device_supports_Data_Tag", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports DDR 52 Mhz mode 1.2V. + /// + internal static string Device_supports_DDR_52_Mhz_mode_1_2V { + get { + return ResourceManager.GetString("Device_supports_DDR_52_Mhz_mode_1_2V", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports DDR 52 Mhz mode at 1.8V or 3V. + /// + internal static string Device_supports_DDR_52_Mhz_mode_at_1_8V_or_3V { + get { + return ResourceManager.GetString("Device_supports_DDR_52_Mhz_mode_at_1_8V_or_3V", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports disabling correction with WRITE LONG. + /// + internal static string Device_supports_disabling_correction_with_WRITE_LONG { + get { + return ResourceManager.GetString("Device_supports_disabling_correction_with_WRITE_LONG", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports doubleword I/O. + /// + internal static string Device_supports_doubleword_IO { + get { + return ResourceManager.GetString("Device_supports_doubleword_IO", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports dual data rate on boot. + /// + internal static string Device_supports_dual_data_rate_on_boot { + get { + return ResourceManager.GetString("Device_supports_dual_data_rate_on_boot", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports enhanced strobe mode. + /// + internal static string Device_supports_enhanced_strobe_mode { + get { + return ResourceManager.GetString("Device_supports_enhanced_strobe_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports extended security. + /// + internal static string Device_supports_extended_security { + get { + return ResourceManager.GetString("Device_supports_extended_security", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports extension register multi-block commands. + /// + internal static string Device_supports_extension_register_multi_block_commands { + get { + return ResourceManager.GetString("Device_supports_extension_register_multi_block_commands", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports extension register single-block commands. + /// + internal static string Device_supports_extension_register_single_block_commands { + get { + return ResourceManager.GetString("Device_supports_extension_register_single_block_commands", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports FFU. + /// + internal static string Device_supports_FFU { + get { + return ResourceManager.GetString("Device_supports_FFU", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports grouping. + /// + internal static string Device_supports_grouping { + get { + return ResourceManager.GetString("Device_supports_grouping", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports hard reset activation for new microcode. + /// + internal static string Device_supports_hard_reset_activation_for_new_microcode { + get { + return ResourceManager.GetString("Device_supports_hard_reset_activation_for_new_microcode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports head of queue. + /// + internal static string Device_supports_head_of_queue { + get { + return ResourceManager.GetString("Device_supports_head_of_queue", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports high speed timing on boot. + /// + internal static string Device_supports_high_speed_timing_on_boot { + get { + return ResourceManager.GetString("Device_supports_high_speed_timing_on_boot", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports HS-200 mode (SDR 200Mhz) at 1.2V. + /// + internal static string Device_supports_HS_200_mode_SDR_200Mhz_at_1_2V { + get { + return ResourceManager.GetString("Device_supports_HS_200_mode_SDR_200Mhz_at_1_2V", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports HS-200 mode (SDR 200Mhz) at 1.8V. + /// + internal static string Device_supports_HS_200_mode_SDR_200Mhz_at_1_8V { + get { + return ResourceManager.GetString("Device_supports_HS_200_mode_SDR_200Mhz_at_1_8V", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports HS-400 mode (DDR 200Mhz) at 1.2V. + /// + internal static string Device_supports_HS_400_mode_DDR_200Mhz_at_1_2V { + get { + return ResourceManager.GetString("Device_supports_HS_400_mode_DDR_200Mhz_at_1_2V", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports HS-400 mode (DDR 200Mhz) at 1.8V. + /// + internal static string Device_supports_HS_400_mode_DDR_200Mhz_at_1_8V { + get { + return ResourceManager.GetString("Device_supports_HS_400_mode_DDR_200Mhz_at_1_8V", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports implicit and explicit asymmetrical access. + /// + internal static string Device_supports_implicit_and_explicit_asymmetrical_access { + get { + return ResourceManager.GetString("Device_supports_implicit_and_explicit_asymmetrical_access", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports information unit transfers. + /// + internal static string Device_supports_information_unit_transfers { + get { + return ResourceManager.GetString("Device_supports_information_unit_transfers", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports I/O driver strength type 4.. + /// + internal static string Device_supports_IO_driver_strength_type_four { + get { + return ResourceManager.GetString("Device_supports_IO_driver_strength_type_four", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports I/O driver strength type 1.. + /// + internal static string Device_supports_IO_driver_strength_type_one { + get { + return ResourceManager.GetString("Device_supports_IO_driver_strength_type_one", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports I/O driver strength type 3.. + /// + internal static string Device_supports_IO_driver_strength_type_three { + get { + return ResourceManager.GetString("Device_supports_IO_driver_strength_type_three", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports I/O driver strength type 2.. + /// + internal static string Device_supports_IO_driver_strength_type_two { + get { + return ResourceManager.GetString("Device_supports_IO_driver_strength_type_two", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports I/O driver strength type 0.. + /// + internal static string Device_supports_IO_driver_strength_type_zero { + get { + return ResourceManager.GetString("Device_supports_IO_driver_strength_type_zero", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports linked commands. + /// + internal static string Device_supports_linked_commands { + get { + return ResourceManager.GetString("Device_supports_linked_commands", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports Long Physical Sector Alignment Error Reporting Control. + /// + internal static string Device_supports_Long_Physical_Sector_Alignment_Error_Reporting_Control { + get { + return ResourceManager.GetString("Device_supports_Long_Physical_Sector_Alignment_Error_Reporting_Control", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports LUN hierarchical addressing. + /// + internal static string Device_supports_LUN_hierarchical_addressing { + get { + return ResourceManager.GetString("Device_supports_LUN_hierarchical_addressing", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports marking a block as uncorrectable with WRITE LONG. + /// + internal static string Device_supports_marking_a_block_as_uncorrectable_with_WRITE_LONG { + get { + return ResourceManager.GetString("Device_supports_marking_a_block_as_uncorrectable_with_WRITE_LONG", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports non-persistent extended partitions. + /// + internal static string Device_supports_non_persistent_extended_partitions { + get { + return ResourceManager.GetString("Device_supports_non_persistent_extended_partitions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports only DT clocking. + /// + internal static string Device_supports_only_DT_clocking { + get { + return ResourceManager.GetString("Device_supports_only_DT_clocking", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports only ST clocking. + /// + internal static string Device_supports_only_ST_clocking { + get { + return ResourceManager.GetString("Device_supports_only_ST_clocking", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports partitioning features. + /// + internal static string Device_supports_partitioning_features { + get { + return ResourceManager.GetString("Device_supports_partitioning_features", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports power-on activation for new microcode. + /// + internal static string Device_supports_power_on_activation_for_new_microcode { + get { + return ResourceManager.GetString("Device_supports_power_on_activation_for_new_microcode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports priority. + /// + internal static string Device_supports_priority { + get { + return ResourceManager.GetString("Device_supports_priority", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports protection information. + /// + internal static string Device_supports_protection_information { + get { + return ResourceManager.GetString("Device_supports_protection_information", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports protection information intervals. + /// + internal static string Device_supports_protection_information_intervals { + get { + return ResourceManager.GetString("Device_supports_protection_information_intervals", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports Quick Arbitration and Selection. + /// + internal static string Device_supports_Quick_Arbitration_and_Selection { + get { + return ResourceManager.GetString("Device_supports_Quick_Arbitration_and_Selection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports referrals. + /// + internal static string Device_supports_referrals { + get { + return ResourceManager.GetString("Device_supports_referrals", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports relative addressing. + /// + internal static string Device_supports_relative_addressing { + get { + return ResourceManager.GetString("Device_supports_relative_addressing", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports request and acknowledge handshakes. + /// + internal static string Device_supports_request_and_acknowledge_handshakes { + get { + return ResourceManager.GetString("Device_supports_request_and_acknowledge_handshakes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports secure purge operations. + /// + internal static string Device_supports_secure_purge_operations { + get { + return ResourceManager.GetString("Device_supports_secure_purge_operations", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports secure write protection. + /// + internal static string Device_supports_secure_write_protection { + get { + return ResourceManager.GetString("Device_supports_secure_write_protection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports set block count command. + /// + internal static string Device_supports_set_block_count_command { + get { + return ResourceManager.GetString("Device_supports_set_block_count_command", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports setting a maximum of {0} sectors. + /// + internal static string Device_supports_setting_a_maximum_of_0_sectors { + get { + return ResourceManager.GetString("Device_supports_setting_a_maximum_of_0_sectors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports setting Normal ACA. + /// + internal static string Device_supports_setting_Normal_ACA { + get { + return ResourceManager.GetString("Device_supports_setting_Normal_ACA", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports speed class control command. + /// + internal static string Device_supports_speed_class_control_command { + get { + return ResourceManager.GetString("Device_supports_speed_class_control_command", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports ST and DT clocking. + /// + internal static string Device_supports_ST_and_DT_clocking { + get { + return ResourceManager.GetString("Device_supports_ST_and_DT_clocking", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports standard MMC command set. + /// + internal static string Device_supports_standard_MMC_command_set { + get { + return ResourceManager.GetString("Device_supports_standard_MMC_command_set", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports supports the secure and insecure trim operations. + /// + internal static string Device_supports_supports_the_secure_and_insecure_trim_operations { + get { + return ResourceManager.GetString("Device_supports_supports_the_secure_and_insecure_trim_operations", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports synchronous data transfer. + /// + internal static string Device_supports_synchronous_data_transfer { + get { + return ResourceManager.GetString("Device_supports_synchronous_data_transfer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports system code extended partitions. + /// + internal static string Device_supports_system_code_extended_partitions { + get { + return ResourceManager.GetString("Device_supports_system_code_extended_partitions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports Tape Disaster Recovery. + /// + internal static string Device_supports_Tape_Disaster_Recovery { + get { + return ResourceManager.GetString("Device_supports_Tape_Disaster_Recovery", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports Tape Stream Mirroring. + /// + internal static string Device_supports_Tape_Stream_Mirroring { + get { + return ResourceManager.GetString("Device_supports_Tape_Stream_Mirroring", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports TCQ queue. + /// + internal static string Device_supports_TCQ_queue { + get { + return ResourceManager.GetString("Device_supports_TCQ_queue", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports TERMINATE TASK command. + /// + internal static string Device_supports_TERMINATE_TASK_command { + get { + return ResourceManager.GetString("Device_supports_TERMINATE_TASK_command", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports the barrier command. + /// + internal static string Device_supports_the_barrier_command { + get { + return ResourceManager.GetString("Device_supports_the_barrier_command", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports the ORDERED task attribute. + /// + internal static string Device_supports_the_ORDERED_task_attribute { + get { + return ResourceManager.GetString("Device_supports_the_ORDERED_task_attribute", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports the sanitize operation. + /// + internal static string Device_supports_the_sanitize_operation { + get { + return ResourceManager.GetString("Device_supports_the_sanitize_operation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports the SIMPLE task attribute. + /// + internal static string Device_supports_the_SIMPLE_task_attribute { + get { + return ResourceManager.GetString("Device_supports_the_SIMPLE_task_attribute", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports third-party copy commands. + /// + internal static string Device_supports_third_party_copy_commands { + get { + return ResourceManager.GetString("Device_supports_third_party_copy_commands", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports unit attention condition sense key specific data. + /// + internal static string Device_supports_unit_attention_condition_sense_key_specific_data { + get { + return ResourceManager.GetString("Device_supports_unit_attention_condition_sense_key_specific_data", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports unknown command sets 0x{0:X2}. + /// + internal static string Device_supports_unknown_command_sets_0 { + get { + return ResourceManager.GetString("Device_supports_unknown_command_sets_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports vendor specific activation for new microcode. + /// + internal static string Device_supports_vendor_specific_activation_for_new_microcode { + get { + return ResourceManager.GetString("Device_supports_vendor_specific_activation_for_new_microcode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports Vendor Specific Mode. + /// + internal static string Device_supports_Vendor_Specific_Mode { + get { + return ResourceManager.GetString("Device_supports_Vendor_Specific_Mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports WORM media. + /// + internal static string Device_supports_WORM_media { + get { + return ResourceManager.GetString("Device_supports_WORM_media", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device supports WORM version {0}. + /// + internal static string Device_supports_WORM_version_0 { + get { + return ResourceManager.GetString("Device_supports_WORM_version_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device takes a maximum of {0} by default to power off from a SWITCH command notification. + /// + internal static string Device_takes_a_maximum_of_0_by_default_to_power_off_from_a_SWITCH_command_notification { + get { + return ResourceManager.GetString("Device_takes_a_maximum_of_0_by_default_to_power_off_from_a_SWITCH_command_notific" + + "ation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device takes a maximum of {0} ms by default for a SWITCH command. + /// + internal static string Device_takes_a_maximum_of_0_ms_by_default_for_a_SWITCH_command { + get { + return ResourceManager.GetString("Device_takes_a_maximum_of_0_ms_by_default_for_a_SWITCH_command", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device takes a maximum of {0} ms for erasing a single erase group. + /// + internal static string Device_takes_a_maximum_of_0_ms_for_erasing_a_single_erase_group { + get { + return ResourceManager.GetString("Device_takes_a_maximum_of_0_ms_for_erasing_a_single_erase_group", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device takes a maximum of {0} ms for initialization after partition. + /// + internal static string Device_takes_a_maximum_of_0_ms_for_initialization_after_partition { + get { + return ResourceManager.GetString("Device_takes_a_maximum_of_0_ms_for_initialization_after_partition", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device takes a maximum of {0} ms for securely erasing a single erase group. + /// + internal static string Device_takes_a_maximum_of_0_ms_for_securely_erasing_a_single_erase_group { + get { + return ResourceManager.GetString("Device_takes_a_maximum_of_0_ms_for_securely_erasing_a_single_erase_group", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device takes a maximum of {0} ms for securely trimming a single erase group. + /// + internal static string Device_takes_a_maximum_of_0_ms_for_securely_trimming_a_single_erase_group { + get { + return ResourceManager.GetString("Device_takes_a_maximum_of_0_ms_for_securely_trimming_a_single_erase_group", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device takes a maximum of {0} ms for trimming a single erase group. + /// + internal static string Device_takes_a_maximum_of_0_ms_for_trimming_a_single_erase_group { + get { + return ResourceManager.GetString("Device_takes_a_maximum_of_0_ms_for_trimming_a_single_erase_group", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device takes a maximum of {0} ms to move to sleep state. + /// + internal static string Device_takes_a_maximum_of_0_ms_to_move_to_sleep_state { + get { + return ResourceManager.GetString("Device_takes_a_maximum_of_0_ms_to_move_to_sleep_state", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device takes a maximum of {0} ms to switch production state awareness. + /// + internal static string Device_takes_a_maximum_of_0_ms_to_switch_production_state_awareness { + get { + return ResourceManager.GetString("Device_takes_a_maximum_of_0_ms_to_switch_production_state_awareness", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device takes a maximum of {0} ms to transition between sleep and standby states. + /// + internal static string Device_takes_a_maximum_of_0_ms_to_transition_between_sleep_and_standby_states { + get { + return ResourceManager.GetString("Device_takes_a_maximum_of_0_ms_to_transition_between_sleep_and_standby_states", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device takes a maximum of {0} ns to transition between sleep and standby states. + /// + internal static string Device_takes_a_maximum_of_0_ns_to_transition_between_sleep_and_standby_states { + get { + return ResourceManager.GetString("Device_takes_a_maximum_of_0_ns_to_transition_between_sleep_and_standby_states", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device takes a maximum of {0} s to move to sleep state. + /// + internal static string Device_takes_a_maximum_of_0_s_to_move_to_sleep_state { + get { + return ResourceManager.GetString("Device_takes_a_maximum_of_0_s_to_move_to_sleep_state", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device takes a maximum of {0} s to switch production state awareness. + /// + internal static string Device_takes_a_maximum_of_0_s_to_switch_production_state_awareness { + get { + return ResourceManager.GetString("Device_takes_a_maximum_of_0_s_to_switch_production_state_awareness", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device takes a maximum of {0} μs to move to sleep state. + /// + internal static string Device_takes_a_maximum_of_0_μs_to_move_to_sleep_state { + get { + return ResourceManager.GetString("Device_takes_a_maximum_of_0_μs_to_move_to_sleep_state", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device takes a maximum of {0} μs to switch production state awareness. + /// + internal static string Device_takes_a_maximum_of_0_μs_to_switch_production_state_awareness { + get { + return ResourceManager.GetString("Device_takes_a_maximum_of_0_μs_to_switch_production_state_awareness", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device takes a maximum of {0} μs to transition between sleep and standby states. + /// + internal static string Device_takes_a_maximum_of_0_μs_to_transition_between_sleep_and_standby_states { + get { + return ResourceManager.GetString("Device_takes_a_maximum_of_0_μs_to_transition_between_sleep_and_standby_states", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device transfer rate is > 5 Mb/s but <= 10 Mb/s. + /// + internal static string Device_transfer_rate_is_more_5_Mbs_less_10_Mbs { + get { + return ResourceManager.GetString("Device_transfer_rate_is_more_5_Mbs_less_10_Mbs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device transfer rate is <= 5 Mb/s. + /// + internal static string Device_transfer_rate_less_than_5_Mbs { + get { + return ResourceManager.GetString("Device_transfer_rate_less_than_5_Mbs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device transfer rate is > 10 Mb/s. + /// + internal static string Device_transfer_rate_more_than_10_Mbs { + get { + return ResourceManager.GetString("Device_transfer_rate_more_than_10_Mbs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device's transfer speed: {0}{1}. + /// + internal static string Device_transfer_speed_0_1 { + get { + return ResourceManager.GetString("Device_transfer_speed_0_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device used between 10% and 20% of its estimated life time. + /// + internal static string Device_used_between_10_and_20_of_its_estimated_life_time { + get { + return ResourceManager.GetString("Device_used_between_10_and_20_of_its_estimated_life_time", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device used between 20% and 30% of its estimated life time. + /// + internal static string Device_used_between_20_and_30_of_its_estimated_life_time { + get { + return ResourceManager.GetString("Device_used_between_20_and_30_of_its_estimated_life_time", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device used between 30% and 40% of its estimated life time. + /// + internal static string Device_used_between_30_and_40_of_its_estimated_life_time { + get { + return ResourceManager.GetString("Device_used_between_30_and_40_of_its_estimated_life_time", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device used between 40% and 50% of its estimated life time. + /// + internal static string Device_used_between_40_and_50_of_its_estimated_life_time { + get { + return ResourceManager.GetString("Device_used_between_40_and_50_of_its_estimated_life_time", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device used between 50% and 60% of its estimated life time. + /// + internal static string Device_used_between_50_and_60_of_its_estimated_life_time { + get { + return ResourceManager.GetString("Device_used_between_50_and_60_of_its_estimated_life_time", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device used between 60% and 70% of its estimated life time. + /// + internal static string Device_used_between_60_and_70_of_its_estimated_life_time { + get { + return ResourceManager.GetString("Device_used_between_60_and_70_of_its_estimated_life_time", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device used between 70% and 80% of its estimated life time. + /// + internal static string Device_used_between_70_and_80_of_its_estimated_life_time { + get { + return ResourceManager.GetString("Device_used_between_70_and_80_of_its_estimated_life_time", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device used between 80% and 90% of its estimated life time. + /// + internal static string Device_used_between_80_and_90_of_its_estimated_life_time { + get { + return ResourceManager.GetString("Device_used_between_80_and_90_of_its_estimated_life_time", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device used between 90% and 100% of its estimated life time. + /// + internal static string Device_used_between_90_and_100_of_its_estimated_life_time { + get { + return ResourceManager.GetString("Device_used_between_90_and_100_of_its_estimated_life_time", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device used between 0% and 10% of its estimated life time. + /// + internal static string Device_used_between_zero_and_10_of_its_estimated_life_time { + get { + return ResourceManager.GetString("Device_used_between_zero_and_10_of_its_estimated_life_time", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device user area is enable for boot. + /// + internal static string Device_user_area_is_enable_for_boot { + get { + return ResourceManager.GetString("Device_user_area_is_enable_for_boot", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses {0} mA on Vcc when sleeping. + /// + internal static string Device_uses_0_mA_on_Vcc_when_sleeping { + get { + return ResourceManager.GetString("Device_uses_0_mA_on_Vcc_when_sleeping", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses {0} mA on Vccq when sleeping. + /// + internal static string Device_uses_0_mA_on_Vccq_when_sleeping { + get { + return ResourceManager.GetString("Device_uses_0_mA_on_Vccq_when_sleeping", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses {0} μA on Vcc when sleeping. + /// + internal static string Device_uses_0_μA_on_Vcc_when_sleeping { + get { + return ResourceManager.GetString("Device_uses_0_μA_on_Vcc_when_sleeping", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses {0} μA on Vccq when sleeping. + /// + internal static string Device_uses_0_μA_on_Vccq_when_sleeping { + get { + return ResourceManager.GetString("Device_uses_0_μA_on_Vccq_when_sleeping", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a FIFO policy for cache flushing. + /// + internal static string Device_uses_a_FIFO_policy_for_cache_flushing { + get { + return ResourceManager.GetString("Device_uses_a_FIFO_policy_for_cache_flushing", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a maximum of 0.5mA for reading at minimum voltage. + /// + internal static string Device_uses_a_maximum_of_0_5mA_for_reading_at_minimum_voltage { + get { + return ResourceManager.GetString("Device_uses_a_maximum_of_0_5mA_for_reading_at_minimum_voltage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a maximum of 0.5mA for writing at minimum voltage. + /// + internal static string Device_uses_a_maximum_of_0_5mA_for_writing_at_minimum_voltage { + get { + return ResourceManager.GetString("Device_uses_a_maximum_of_0_5mA_for_writing_at_minimum_voltage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a maximum of 100mA for reading at minimum voltage. + /// + internal static string Device_uses_a_maximum_of_100mA_for_reading_at_minimum_voltage { + get { + return ResourceManager.GetString("Device_uses_a_maximum_of_100mA_for_reading_at_minimum_voltage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a maximum of 100mA for writing at minimum voltage. + /// + internal static string Device_uses_a_maximum_of_100mA_for_writing_at_minimum_voltage { + get { + return ResourceManager.GetString("Device_uses_a_maximum_of_100mA_for_writing_at_minimum_voltage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a maximum of 10mA for reading at maximum voltage. + /// + internal static string Device_uses_a_maximum_of_10mA_for_reading_at_maximum_voltage { + get { + return ResourceManager.GetString("Device_uses_a_maximum_of_10mA_for_reading_at_maximum_voltage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a maximum of 10mA for reading at minimum voltage. + /// + internal static string Device_uses_a_maximum_of_10mA_for_reading_at_minimum_voltage { + get { + return ResourceManager.GetString("Device_uses_a_maximum_of_10mA_for_reading_at_minimum_voltage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a maximum of 10mA for writing at maximum voltage. + /// + internal static string Device_uses_a_maximum_of_10mA_for_writing_at_maximum_voltage { + get { + return ResourceManager.GetString("Device_uses_a_maximum_of_10mA_for_writing_at_maximum_voltage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a maximum of 10mA for writing at minimum voltage. + /// + internal static string Device_uses_a_maximum_of_10mA_for_writing_at_minimum_voltage { + get { + return ResourceManager.GetString("Device_uses_a_maximum_of_10mA_for_writing_at_minimum_voltage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a maximum of 1mA for reading at maximum voltage. + /// + internal static string Device_uses_a_maximum_of_1mA_for_reading_at_maximum_voltage { + get { + return ResourceManager.GetString("Device_uses_a_maximum_of_1mA_for_reading_at_maximum_voltage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a maximum of 1mA for reading at minimum voltage. + /// + internal static string Device_uses_a_maximum_of_1mA_for_reading_at_minimum_voltage { + get { + return ResourceManager.GetString("Device_uses_a_maximum_of_1mA_for_reading_at_minimum_voltage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a maximum of 1mA for writing at maximum voltage. + /// + internal static string Device_uses_a_maximum_of_1mA_for_writing_at_maximum_voltage { + get { + return ResourceManager.GetString("Device_uses_a_maximum_of_1mA_for_writing_at_maximum_voltage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a maximum of 1mA for writing at minimum voltage. + /// + internal static string Device_uses_a_maximum_of_1mA_for_writing_at_minimum_voltage { + get { + return ResourceManager.GetString("Device_uses_a_maximum_of_1mA_for_writing_at_minimum_voltage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a maximum of 200mA for reading at maximum voltage. + /// + internal static string Device_uses_a_maximum_of_200mA_for_reading_at_maximum_voltage { + get { + return ResourceManager.GetString("Device_uses_a_maximum_of_200mA_for_reading_at_maximum_voltage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a maximum of 200mA for writing at maximum voltage. + /// + internal static string Device_uses_a_maximum_of_200mA_for_writing_at_maximum_voltage { + get { + return ResourceManager.GetString("Device_uses_a_maximum_of_200mA_for_writing_at_maximum_voltage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a maximum of 25mA for reading at maximum voltage. + /// + internal static string Device_uses_a_maximum_of_25mA_for_reading_at_maximum_voltage { + get { + return ResourceManager.GetString("Device_uses_a_maximum_of_25mA_for_reading_at_maximum_voltage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a maximum of 25mA for reading at minimum voltage. + /// + internal static string Device_uses_a_maximum_of_25mA_for_reading_at_minimum_voltage { + get { + return ResourceManager.GetString("Device_uses_a_maximum_of_25mA_for_reading_at_minimum_voltage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a maximum of 25mA for writing at maximum voltage. + /// + internal static string Device_uses_a_maximum_of_25mA_for_writing_at_maximum_voltage { + get { + return ResourceManager.GetString("Device_uses_a_maximum_of_25mA_for_writing_at_maximum_voltage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a maximum of 25mA for writing at minimum voltage. + /// + internal static string Device_uses_a_maximum_of_25mA_for_writing_at_minimum_voltage { + get { + return ResourceManager.GetString("Device_uses_a_maximum_of_25mA_for_writing_at_minimum_voltage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a maximum of 35mA for reading at maximum voltage. + /// + internal static string Device_uses_a_maximum_of_35mA_for_reading_at_maximum_voltage { + get { + return ResourceManager.GetString("Device_uses_a_maximum_of_35mA_for_reading_at_maximum_voltage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a maximum of 35mA for reading at minimum voltage. + /// + internal static string Device_uses_a_maximum_of_35mA_for_reading_at_minimum_voltage { + get { + return ResourceManager.GetString("Device_uses_a_maximum_of_35mA_for_reading_at_minimum_voltage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a maximum of 35mA for writing at maximum voltage. + /// + internal static string Device_uses_a_maximum_of_35mA_for_writing_at_maximum_voltage { + get { + return ResourceManager.GetString("Device_uses_a_maximum_of_35mA_for_writing_at_maximum_voltage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a maximum of 35mA for writing at minimum voltage. + /// + internal static string Device_uses_a_maximum_of_35mA_for_writing_at_minimum_voltage { + get { + return ResourceManager.GetString("Device_uses_a_maximum_of_35mA_for_writing_at_minimum_voltage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a maximum of 45mA for reading at maximum voltage. + /// + internal static string Device_uses_a_maximum_of_45mA_for_reading_at_maximum_voltage { + get { + return ResourceManager.GetString("Device_uses_a_maximum_of_45mA_for_reading_at_maximum_voltage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a maximum of 45mA for writing at maximum voltage. + /// + internal static string Device_uses_a_maximum_of_45mA_for_writing_at_maximum_voltage { + get { + return ResourceManager.GetString("Device_uses_a_maximum_of_45mA_for_writing_at_maximum_voltage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a maximum of 5mA for reading at maximum voltage. + /// + internal static string Device_uses_a_maximum_of_5mA_for_reading_at_maximum_voltage { + get { + return ResourceManager.GetString("Device_uses_a_maximum_of_5mA_for_reading_at_maximum_voltage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a maximum of 5mA for reading at minimum voltage. + /// + internal static string Device_uses_a_maximum_of_5mA_for_reading_at_minimum_voltage { + get { + return ResourceManager.GetString("Device_uses_a_maximum_of_5mA_for_reading_at_minimum_voltage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a maximum of 5mA for writing at maximum voltage. + /// + internal static string Device_uses_a_maximum_of_5mA_for_writing_at_maximum_voltage { + get { + return ResourceManager.GetString("Device_uses_a_maximum_of_5mA_for_writing_at_maximum_voltage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a maximum of 5mA for writing at minimum voltage. + /// + internal static string Device_uses_a_maximum_of_5mA_for_writing_at_minimum_voltage { + get { + return ResourceManager.GetString("Device_uses_a_maximum_of_5mA_for_writing_at_minimum_voltage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a maximum of 60mA for reading at minimum voltage. + /// + internal static string Device_uses_a_maximum_of_60mA_for_reading_at_minimum_voltage { + get { + return ResourceManager.GetString("Device_uses_a_maximum_of_60mA_for_reading_at_minimum_voltage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a maximum of 60mA for writing at minimum voltage. + /// + internal static string Device_uses_a_maximum_of_60mA_for_writing_at_minimum_voltage { + get { + return ResourceManager.GetString("Device_uses_a_maximum_of_60mA_for_writing_at_minimum_voltage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a maximum of 80mA for reading at maximum voltage. + /// + internal static string Device_uses_a_maximum_of_80mA_for_reading_at_maximum_voltage { + get { + return ResourceManager.GetString("Device_uses_a_maximum_of_80mA_for_reading_at_maximum_voltage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a maximum of 80mA for writing at maximum voltage. + /// + internal static string Device_uses_a_maximum_of_80mA_for_writing_at_maximum_voltage { + get { + return ResourceManager.GetString("Device_uses_a_maximum_of_80mA_for_writing_at_maximum_voltage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a print cache. + /// + internal static string Device_uses_a_print_cache { + get { + return ResourceManager.GetString("Device_uses_a_print_cache", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a write cache. + /// + internal static string Device_uses_a_write_cache { + get { + return ResourceManager.GetString("Device_uses_a_write_cache", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses a write cache but doesn't return until cache is flushed. + /// + internal static string Device_uses_a_write_cache_but_doesn_t_return_until_cache_is_flushed { + get { + return ResourceManager.GetString("Device_uses_a_write_cache_but_doesn_t_return_until_cache_is_flushed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses BCH(542, 512) ECC by default. + /// + internal static string Device_uses_BCH_542_512_ECC_by_default { + get { + return ResourceManager.GetString("Device_uses_BCH_542_512_ECC_by_default", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses CPRM according to specification version 1.01. + /// + internal static string Device_uses_CPRM_according_to_specification_version_1_01 { + get { + return ResourceManager.GetString("Device_uses_CPRM_according_to_specification_version_1_01", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses CPRM according to specification version 2.00. + /// + internal static string Device_uses_CPRM_according_to_specification_version_2_00 { + get { + return ResourceManager.GetString("Device_uses_CPRM_according_to_specification_version_2_00", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses CPRM according to specification version 3.xx. + /// + internal static string Device_uses_CPRM_according_to_specification_version_3_xx { + get { + return ResourceManager.GetString("Device_uses_CPRM_according_to_specification_version_3_xx", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses default speed. + /// + internal static string Device_uses_default_speed { + get { + return ResourceManager.GetString("Device_uses_default_speed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses no ECC by default. + /// + internal static string Device_uses_no_ECC_by_default { + get { + return ResourceManager.GetString("Device_uses_no_ECC_by_default", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses non-magnetic media. + /// + internal static string Device_uses_non_magnetic_media { + get { + return ResourceManager.GetString("Device_uses_non_magnetic_media", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses Parallel ATA.. + /// + internal static string Device_uses_Parallel_ATA { + get { + return ResourceManager.GetString("Device_uses_Parallel_ATA", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses Serial ATA.. + /// + internal static string Device_uses_Serial_ATA { + get { + return ResourceManager.GetString("Device_uses_Serial_ATA", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses speed {0}. + /// + internal static string Device_uses_speed_0 { + get { + return ResourceManager.GetString("Device_uses_speed_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses strobe during Data Out and CRC responses. + /// + internal static string Device_uses_strobe_during_Data_Out_and_CRC_responses { + get { + return ResourceManager.GetString("Device_uses_strobe_during_Data_Out_and_CRC_responses", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses strobe during Data Out, CRC and CMD responses. + /// + internal static string Device_uses_strobe_during_Data_Out_CRC_and_CMD_responses { + get { + return ResourceManager.GetString("Device_uses_strobe_during_Data_Out_CRC_and_CMD_responses", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses Universal File Format. + /// + internal static string Device_uses_Universal_File_Format { + get { + return ResourceManager.GetString("Device_uses_Universal_File_Format", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses unknown CPRM specification with code {0}. + /// + internal static string Device_uses_unknown_CPRM_specification_with_code_0 { + get { + return ResourceManager.GetString("Device_uses_unknown_CPRM_specification_with_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses unknown ECC code {0} by default. + /// + internal static string Device_uses_unknown_ECC_code_0_by_default { + get { + return ResourceManager.GetString("Device_uses_unknown_ECC_code_0_by_default", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses unknown file format code {0}. + /// + internal static string Device_uses_unknown_file_format_code_0 { + get { + return ResourceManager.GetString("Device_uses_unknown_file_format_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses unknown file format code {0} and file format group 1. + /// + internal static string Device_uses_unknown_file_format_code_0_and_file_format_group_1 { + get { + return ResourceManager.GetString("Device_uses_unknown_file_format_code_0_and_file_format_group_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device uses unknown transport with code {0}. + /// + internal static string Device_uses_unknown_transport_with_code_0 { + get { + return ResourceManager.GetString("Device_uses_unknown_transport_with_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device vendor: {0}. + /// + internal static string Device_vendor_0 { + get { + return ResourceManager.GetString("Device_vendor_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device version: {0}. + /// + internal static string Device_version_0 { + get { + return ResourceManager.GetString("Device_version_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device width: {0} bits. + /// + internal static string Device_width_0_bits { + get { + return ResourceManager.GetString("Device_width_0_bits", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device will boot up in x1 SDR or x4 DDR bus width.. + /// + internal static string Device_will_boot_up_in_x1_SDR_or_x4_DDR_bus_width { + get { + return ResourceManager.GetString("Device_will_boot_up_in_x1_SDR_or_x4_DDR_bus_width", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device will boot up in x4 SDR or DDR bus width.. + /// + internal static string Device_will_boot_up_in_x4_SDR_or_DDR_bus_width { + get { + return ResourceManager.GetString("Device_will_boot_up_in_x4_SDR_or_DDR_bus_width", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device will boot up in x8 SDR or DDR bus width.. + /// + internal static string Device_will_boot_up_in_x8_SDR_or_DDR_bus_width { + get { + return ResourceManager.GetString("Device_will_boot_up_in_x8_SDR_or_DDR_bus_width", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device will not degrade performance to extend its life. + /// + internal static string Device_will_not_degrade_performance_to_extend_its_life { + get { + return ResourceManager.GetString("Device_will_not_degrade_performance_to_extend_its_life", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device will reset boot conditions to compatibility mode after boot operation.. + /// + internal static string Device_will_reset_boot_conditions_to_compatibility_mode_after_boot_operation { + get { + return ResourceManager.GetString("Device_will_reset_boot_conditions_to_compatibility_mode_after_boot_operation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device will retain boot conditions after boot operation.. + /// + internal static string Device_will_retain_boot_conditions_after_boot_operation { + get { + return ResourceManager.GetString("Device_will_retain_boot_conditions_after_boot_operation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device will use dual data rate in boot operation.. + /// + internal static string Device_will_use_dual_data_rate_in_boot_operation { + get { + return ResourceManager.GetString("Device_will_use_dual_data_rate_in_boot_operation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device will use high capacity erase unit size, timeout and write protect group size definitions.. + /// + internal static string Device_will_use_high_capacity_erase_unit_size__timeout_and_write_protect_group_size_definitions { + get { + return ResourceManager.GetString("Device_will_use_high_capacity_erase_unit_size__timeout_and_write_protect_group_si" + + "ze_definitions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device will use single data rate with compatible timings in boot operation.. + /// + internal static string Device_will_use_single_data_rate_with_compatible_timings_in_boot_operation { + get { + return ResourceManager.GetString("Device_will_use_single_data_rate_with_compatible_timings_in_boot_operation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device will use single data rate with high speed timings in boot operation.. + /// + internal static string Device_will_use_single_data_rate_with_high_speed_timings_in_boot_operation { + get { + return ResourceManager.GetString("Device_will_use_single_data_rate_with_high_speed_timings_in_boot_operation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device will use unknown boot mode with code 3.. + /// + internal static string Device_will_use_unknown_boot_mode_with_code_three { + get { + return ResourceManager.GetString("Device_will_use_unknown_boot_mode_with_code_three", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device writes directly to media. + /// + internal static string Device_writes_directly_to_media { + get { + return ResourceManager.GetString("Device_writes_directly_to_media", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device's cache is enabled. + /// + internal static string Devices_cache_is_enabled { + get { + return ResourceManager.GetString("Devices_cache_is_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DI Unit Format: 0x{0:X2}. + /// + internal static string DI_Unit_Format_0 { + get { + return ResourceManager.GetString("DI_Unit_Format_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DI Unit is {0} bytes. + /// + internal static string DI_Unit_is_0_bytes { + get { + return ResourceManager.GetString("DI_Unit_is_0_bytes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DI Unit Sequence: {0}. + /// + internal static string DI_Unit_Sequence_0 { + get { + return ResourceManager.GetString("DI_Unit_Sequence_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Digital copy of track is permitted. + /// + internal static string Digital_copy_of_track_is_permitted { + get { + return ResourceManager.GetString("Digital_copy_of_track_is_permitted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Digital copy of track is prohibited. + /// + internal static string Digital_copy_of_track_is_prohibited { + get { + return ResourceManager.GetString("Digital_copy_of_track_is_prohibited", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Direct-access device. + /// + internal static string Direct_access_device { + get { + return ResourceManager.GetString("Direct_access_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc application code: {0}. + /// + internal static string Disc_application_code_0 { + get { + return ResourceManager.GetString("Disc_application_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc barcode: {0:X16}. + /// + internal static string Disc_barcode_0 { + get { + return ResourceManager.GetString("Disc_barcode_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc book type is {0}. + /// + internal static string Disc_book_type_is_0 { + get { + return ResourceManager.GetString("Disc_book_type_is_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc boots natively.. + /// + internal static string Disc_boots_natively { + get { + return ResourceManager.GetString("Disc_boots_natively", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc boots using unknown loader: {0}.. + /// + internal static string Disc_boots_using_unknown_loader_0 { + get { + return ResourceManager.GetString("Disc_boots_using_unknown_loader_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc boots using Windows CE.. + /// + internal static string Disc_boots_using_Windows_CE { + get { + return ResourceManager.GetString("Disc_boots_using_Windows_CE", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc can be played in any region.. + /// + internal static string Disc_can_be_played_in_any_region { + get { + return ResourceManager.GetString("Disc_can_be_played_in_any_region", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc can be played in the following regions:. + /// + internal static string Disc_can_be_played_in_the_following_regions { + get { + return ResourceManager.GetString("Disc_can_be_played_in_the_following_regions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc can be recorded with or without a case. + /// + internal static string Disc_can_be_recorded_with_or_without_a_case { + get { + return ResourceManager.GetString("Disc_can_be_recorded_with_or_without_a_case", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc cannot be played in any region at all.. + /// + internal static string Disc_cannot_be_played_in_any_region_at_all { + get { + return ResourceManager.GetString("Disc_cannot_be_played_in_any_region_at_all", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc claims conformation to ECMA-267. + /// + internal static string Disc_claims_conformation_to_ECMA_267 { + get { + return ResourceManager.GetString("Disc_claims_conformation_to_ECMA_267", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc claims conformation to ECMA-268. + /// + internal static string Disc_claims_conformation_to_ECMA_268 { + get { + return ResourceManager.GetString("Disc_claims_conformation_to_ECMA_268", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc claims conformation to ECMA-272. + /// + internal static string Disc_claims_conformation_to_ECMA_272 { + get { + return ResourceManager.GetString("Disc_claims_conformation_to_ECMA_272", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc claims conformation to ECMA-274. + /// + internal static string Disc_claims_conformation_to_ECMA_274 { + get { + return ResourceManager.GetString("Disc_claims_conformation_to_ECMA_274", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc claims conformation to ECMA-279. + /// + internal static string Disc_claims_conformation_to_ECMA_279 { + get { + return ResourceManager.GetString("Disc_claims_conformation_to_ECMA_279", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc claims conformation to ECMA-330. + /// + internal static string Disc_claims_conformation_to_ECMA_330 { + get { + return ResourceManager.GetString("Disc_claims_conformation_to_ECMA_330", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc claims conformation to ECMA-337. + /// + internal static string Disc_claims_conformation_to_ECMA_337 { + get { + return ResourceManager.GetString("Disc_claims_conformation_to_ECMA_337", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc claims conformation to ECMA-338. + /// + internal static string Disc_claims_conformation_to_ECMA_338 { + get { + return ResourceManager.GetString("Disc_claims_conformation_to_ECMA_338", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc claims conformation to ECMA-349. + /// + internal static string Disc_claims_conformation_to_ECMA_349 { + get { + return ResourceManager.GetString("Disc_claims_conformation_to_ECMA_349", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc claims conformation to ECMA-359. + /// + internal static string Disc_claims_conformation_to_ECMA_359 { + get { + return ResourceManager.GetString("Disc_claims_conformation_to_ECMA_359", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc claims conformation to ECMA-364. + /// + internal static string Disc_claims_conformation_to_ECMA_364 { + get { + return ResourceManager.GetString("Disc_claims_conformation_to_ECMA_364", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc claims conformation to ECMA-365. + /// + internal static string Disc_claims_conformation_to_ECMA_365 { + get { + return ResourceManager.GetString("Disc_claims_conformation_to_ECMA_365", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc claims conformation to ECMA-371. + /// + internal static string Disc_claims_conformation_to_ECMA_371 { + get { + return ResourceManager.GetString("Disc_claims_conformation_to_ECMA_371", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc claims conformation to ECMA-374. + /// + internal static string Disc_claims_conformation_to_ECMA_374 { + get { + return ResourceManager.GetString("Disc_claims_conformation_to_ECMA_374", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc claims conformation to ECMA-382. + /// + internal static string Disc_claims_conformation_to_ECMA_382 { + get { + return ResourceManager.GetString("Disc_claims_conformation_to_ECMA_382", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc claims conformation to ECMA-384. + /// + internal static string Disc_claims_conformation_to_ECMA_384 { + get { + return ResourceManager.GetString("Disc_claims_conformation_to_ECMA_384", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc class: {0}. + /// + internal static string Disc_class_0 { + get { + return ResourceManager.GetString("Disc_class_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc comes in a cartridge. + /// + internal static string Disc_comes_in_a_cartridge { + get { + return ResourceManager.GetString("Disc_comes_in_a_cartridge", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc contains extended information for VCPS. + /// + internal static string Disc_contains_extended_information_for_VCPS { + get { + return ResourceManager.GetString("Disc_contains_extended_information_for_VCPS", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc does not specify a maximum transfer rate.. + /// + internal static string Disc_does_not_specify_a_maximum_transfer_rate { + get { + return ResourceManager.GetString("Disc_does_not_specify_a_maximum_transfer_rate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc doesn't have a BCA.. + /// + internal static string Disc_doesn_t_have_a_BCA { + get { + return ResourceManager.GetString("Disc_doesn_t_have_a_BCA", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc for restricted use.. + /// + internal static string Disc_for_restricted_use { + get { + return ResourceManager.GetString("Disc_for_restricted_use", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc for unrestricted use.. + /// + internal static string Disc_for_unrestricted_use { + get { + return ResourceManager.GetString("Disc_for_unrestricted_use", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc for use in special drives according with purpose value {0}. + /// + internal static string Disc_for_use_in_special_drives_according_with_purpose_value_0 { + get { + return ResourceManager.GetString("Disc_for_use_in_special_drives_according_with_purpose_value_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc has {0} layers. + /// + internal static string Disc_has_0_layers { + get { + return ResourceManager.GetString("Disc_has_0_layers", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc has {0} sessions. + /// + internal static string Disc_has_0_sessions { + get { + return ResourceManager.GetString("Disc_has_0_sessions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc has {0} zones. + /// + internal static string Disc_has_0_zones { + get { + return ResourceManager.GetString("Disc_has_0_zones", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc has 120mm diameter. + /// + internal static string Disc_has_120mm_diameter { + get { + return ResourceManager.GetString("Disc_has_120mm_diameter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc has 80mm diameter. + /// + internal static string Disc_has_80mm_diameter { + get { + return ResourceManager.GetString("Disc_has_80mm_diameter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc has a BCA.. + /// + internal static string Disc_has_a_BCA { + get { + return ResourceManager.GetString("Disc_has_a_BCA", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc has a maximum transfer rate of {0} Mbit/sec.. + /// + internal static string Disc_has_a_maximum_transfer_rate_of_0_Mbit_sec { + get { + return ResourceManager.GetString("Disc_has_a_maximum_transfer_rate_of_0_Mbit_sec", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc has been certified by a manufacturer. + /// + internal static string Disc_has_been_certified_by_a_manufacturer { + get { + return ResourceManager.GetString("Disc_has_been_certified_by_a_manufacturer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc has been certified by a user. + /// + internal static string Disc_has_been_certified_by_a_user { + get { + return ResourceManager.GetString("Disc_has_been_certified_by_a_user", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc has been extracted from the cartridge. + /// + internal static string Disc_has_been_extracted_from_the_cartridge { + get { + return ResourceManager.GetString("Disc_has_been_extracted_from_the_cartridge", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc has no encryption.. + /// + internal static string Disc_has_no_encryption { + get { + return ResourceManager.GetString("Disc_has_no_encryption", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc has unknown reason {0} for write inhibition. + /// + internal static string Disc_has_unknown_reason_0_for_write_inhibition { + get { + return ResourceManager.GetString("Disc_has_unknown_reason_0_for_write_inhibition", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc ID: {0:X6}. + /// + internal static string Disc_ID_0_X6 { + get { + return ResourceManager.GetString("Disc_ID_0_X6", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is a {0} {1} version {2}. + /// + internal static string Disc_is_a_0_1_version_2 { + get { + return ResourceManager.GetString("Disc_is_a_0_1_version_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is a Nintendo Gamecube Optical Disc (GOD). + /// + internal static string Disc_is_a_Nintendo_Gamecube_Optical_Disc_GOD { + get { + return ResourceManager.GetString("Disc_is_a_Nintendo_Gamecube_Optical_Disc_GOD", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is a Nintendo Wii Optical Disc (WOD). + /// + internal static string Disc_is_a_Nintendo_Wii_Optical_Disc_WOD { + get { + return ResourceManager.GetString("Disc_is_a_Nintendo_Wii_Optical_Disc_WOD", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is CD-R. + /// + internal static string Disc_is_CD_R { + get { + return ResourceManager.GetString("Disc_is_CD_R", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is CD-RW. + /// + internal static string Disc_is_CD_RW { + get { + return ResourceManager.GetString("Disc_is_CD_RW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is DDCD-R. + /// + internal static string Disc_is_DDCD_R { + get { + return ResourceManager.GetString("Disc_is_DDCD_R", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is DDCD-RW. + /// + internal static string Disc_is_DDCD_RW { + get { + return ResourceManager.GetString("Disc_is_DDCD_RW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is defined for restricted use. + /// + internal static string Disc_is_defined_for_restricted_use { + get { + return ResourceManager.GetString("Disc_is_defined_for_restricted_use", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is defined for unrestricted use. + /// + internal static string Disc_is_defined_for_unrestricted_use { + get { + return ResourceManager.GetString("Disc_is_defined_for_unrestricted_use", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is empty. + /// + internal static string Disc_is_empty { + get { + return ResourceManager.GetString("Disc_is_empty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is encrypted using AACS.. + /// + internal static string Disc_is_encrypted_using_AACS { + get { + return ResourceManager.GetString("Disc_is_encrypted_using_AACS", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is encrypted using CPRM.. + /// + internal static string Disc_is_encrypted_using_CPRM { + get { + return ResourceManager.GetString("Disc_is_encrypted_using_CPRM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is encrypted using CSS or CPPM.. + /// + internal static string Disc_is_encrypted_using_CSS_or_CPPM { + get { + return ResourceManager.GetString("Disc_is_encrypted_using_CSS_or_CPPM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is encrypted using unknown algorithm with ID {0}.. + /// + internal static string Disc_is_encrypted_using_unknown_algorithm_with_ID_0 { + get { + return ResourceManager.GetString("Disc_is_encrypted_using_unknown_algorithm_with_ID_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is erasable. + /// + internal static string Disc_is_erasable { + get { + return ResourceManager.GetString("Disc_is_erasable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is finalized. + /// + internal static string Disc_is_finalized { + get { + return ResourceManager.GetString("Disc_is_finalized", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is high speed (CAV) CD-R. + /// + internal static string Disc_is_high_speed_CAV_CD_R { + get { + return ResourceManager.GetString("Disc_is_high_speed_CAV_CD_R", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is High-Speed CD-RW. + /// + internal static string Disc_is_High_Speed_CD_RW { + get { + return ResourceManager.GetString("Disc_is_High_Speed_CD_RW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is incomplete. + /// + internal static string Disc_is_incomplete { + get { + return ResourceManager.GetString("Disc_is_incomplete", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is medium type A, high beta category (A+) CD-R. + /// + internal static string Disc_is_medium_type_A_high_beta_category_CD_R { + get { + return ResourceManager.GetString("Disc_is_medium_type_A_high_beta_category_CD_R", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is medium type A, low beta category (A-) CD-R. + /// + internal static string Disc_is_medium_type_A_low_beta_category_CD_R { + get { + return ResourceManager.GetString("Disc_is_medium_type_A_low_beta_category_CD_R", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is medium type B, high beta category (B+) CD-R. + /// + internal static string Disc_is_medium_type_B_high_beta_category__CD_R { + get { + return ResourceManager.GetString("Disc_is_medium_type_B_high_beta_category__CD_R", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is medium type B, high beta category (B+) CD-RW. + /// + internal static string Disc_is_medium_type_B_high_beta_category_CD_RW { + get { + return ResourceManager.GetString("Disc_is_medium_type_B_high_beta_category_CD_RW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is medium type B, low beta category (B-) CD-R. + /// + internal static string Disc_is_medium_type_B_low_beta_category_CD_R { + get { + return ResourceManager.GetString("Disc_is_medium_type_B_low_beta_category_CD_R", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is medium type B, low beta category (B-) CD-RW. + /// + internal static string Disc_is_medium_type_B_low_beta_category_CD_RW { + get { + return ResourceManager.GetString("Disc_is_medium_type_B_low_beta_category_CD_RW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is medium type C, high beta category (C+) CD-R. + /// + internal static string Disc_is_medium_type_C_high_beta_category__CD_R { + get { + return ResourceManager.GetString("Disc_is_medium_type_C_high_beta_category__CD_R", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is medium type C, high beta category (C+) CD-RW. + /// + internal static string Disc_is_medium_type_C_high_beta_category_CD_RW { + get { + return ResourceManager.GetString("Disc_is_medium_type_C_high_beta_category_CD_RW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is medium type C, low beta category (C-) CD-R. + /// + internal static string Disc_is_medium_type_C_low_beta_category__CD_R { + get { + return ResourceManager.GetString("Disc_is_medium_type_C_low_beta_category__CD_R", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is medium type C, low beta category (C-) CD-RW. + /// + internal static string Disc_is_medium_type_C_low_beta_category_CD_RW { + get { + return ResourceManager.GetString("Disc_is_medium_type_C_low_beta_category_CD_RW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is normal speed (CLV) CD-R. + /// + internal static string Disc_is_normal_speed_CLV_CD_R { + get { + return ResourceManager.GetString("Disc_is_normal_speed_CLV_CD_R", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is R (recordable). + /// + internal static string Disc_is_R_recordable { + get { + return ResourceManager.GetString("Disc_is_R_recordable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is RW (rewritable). + /// + internal static string Disc_is_RW_rewritable { + get { + return ResourceManager.GetString("Disc_is_RW_rewritable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is Ultra-Speed CD-RW. + /// + internal static string Disc_is_Ultra_Speed_CD_RW { + get { + return ResourceManager.GetString("Disc_is_Ultra_Speed_CD_RW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is Ultra-Speed+ CD-RW. + /// + internal static string Disc_is_Ultra_Speed_Plus_CD_RW { + get { + return ResourceManager.GetString("Disc_is_Ultra_Speed_Plus_CD_RW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is write inhibited because it has been extracted from the cartridge. + /// + internal static string Disc_is_write_inhibited_because_it_has_been_extracted_from_the_cartridge { + get { + return ResourceManager.GetString("Disc_is_write_inhibited_because_it_has_been_extracted_from_the_cartridge", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc is write inhibited for an unspecified reason. + /// + internal static string Disc_is_write_inhibited_for_an_unspecified_reason { + get { + return ResourceManager.GetString("Disc_is_write_inhibited_for_an_unspecified_reason", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc manufactured by: {0}. + /// + internal static string Disc_manufactured_by_0 { + get { + return ResourceManager.GetString("Disc_manufactured_by_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc manufacturer ID: "{0}". + /// + internal static string Disc_manufacturer_ID_0 { + get { + return ResourceManager.GetString("Disc_manufacturer_ID_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc manufacturer is {0}. + /// + internal static string Disc_manufacturer_is_0 { + get { + return ResourceManager.GetString("Disc_manufacturer_is_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc manufacturer supplementary information is {0}. + /// + internal static string Disc_manufacturer_supplementary_information_is_0 { + get { + return ResourceManager.GetString("Disc_manufacturer_supplementary_information_is_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc maximum transfer rate is 10.08 Mbit/sec.. + /// + internal static string Disc_maximum_transfer_rate_is_10_08_Mbit_sec { + get { + return ResourceManager.GetString("Disc_maximum_transfer_rate_is_10_08_Mbit_sec", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc maximum transfer rate is 2.52 Mbit/sec.. + /// + internal static string Disc_maximum_transfer_rate_is_2_52_Mbit_sec { + get { + return ResourceManager.GetString("Disc_maximum_transfer_rate_is_2_52_Mbit_sec", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc maximum transfer rate is 20.16 Mbit/sec.. + /// + internal static string Disc_maximum_transfer_rate_is_20_16_Mbit_sec { + get { + return ResourceManager.GetString("Disc_maximum_transfer_rate_is_20_16_Mbit_sec", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc maximum transfer rate is 30.24 Mbit/sec.. + /// + internal static string Disc_maximum_transfer_rate_is_30_24_Mbit_sec { + get { + return ResourceManager.GetString("Disc_maximum_transfer_rate_is_30_24_Mbit_sec", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc maximum transfer rate is 5.04 Mbit/sec.. + /// + internal static string Disc_maximum_transfer_rate_is_5_04_Mbit_sec { + get { + return ResourceManager.GetString("Disc_maximum_transfer_rate_is_5_04_Mbit_sec", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc maximum transfer rate is specified by unknown key {0}. + /// + internal static string Disc_maximum_transfer_rate_is_specified_by_unknown_key_0 { + get { + return ResourceManager.GetString("Disc_maximum_transfer_rate_is_specified_by_unknown_key_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc maximum transfer rate is unspecified.. + /// + internal static string Disc_maximum_transfer_rate_is_unspecified { + get { + return ResourceManager.GetString("Disc_maximum_transfer_rate_is_unspecified", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc may be written without a cartridge. + /// + internal static string Disc_may_be_written_without_a_cartridge { + get { + return ResourceManager.GetString("Disc_may_be_written_without_a_cartridge", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc media: {0}. + /// + internal static string Disc_media_0 { + get { + return ResourceManager.GetString("Disc_media_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc media type ID: "{0}". + /// + internal static string Disc_media_type_ID_0 { + get { + return ResourceManager.GetString("Disc_media_type_ID_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc media type is {0}. + /// + internal static string Disc_media_type_is_0 { + get { + return ResourceManager.GetString("Disc_media_type_is_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc number {0} of {1}. + /// + internal static string Disc_number_0_of_1 { + get { + return ResourceManager.GetString("Disc_number_0_of_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc product revision is {0}. + /// + internal static string Disc_product_revision_is_0 { + get { + return ResourceManager.GetString("Disc_product_revision_is_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc product revision number: {0}. + /// + internal static string Disc_product_revision_number_0 { + get { + return ResourceManager.GetString("Disc_product_revision_number_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc reflectivity is between 18% and 30%. + /// + internal static string Disc_reflectivity_is_between_18_and_30 { + get { + return ResourceManager.GetString("Disc_reflectivity_is_between_18_and_30", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc reflectivity is between 45% and 85%. + /// + internal static string Disc_reflectivity_is_between_45_and_85 { + get { + return ResourceManager.GetString("Disc_reflectivity_is_between_45_and_85", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc shall be recorded with a case. + /// + internal static string Disc_shall_be_recorded_with_a_case { + get { + return ResourceManager.GetString("Disc_shall_be_recorded_with_a_case", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc shall not be written without a cartridge. + /// + internal static string Disc_shall_not_be_written_without_a_cartridge { + get { + return ResourceManager.GetString("Disc_shall_not_be_written_without_a_cartridge", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc size: 120mm. + /// + internal static string Disc_size_120mm { + get { + return ResourceManager.GetString("Disc_size_120mm", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc size: 80mm. + /// + internal static string Disc_size_80mm { + get { + return ResourceManager.GetString("Disc_size_80mm", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc size: Unknown code {0}. + /// + internal static string Disc_size_Unknown_code_0 { + get { + return ResourceManager.GetString("Disc_size_Unknown_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc surface is set to write protected status. + /// + internal static string Disc_surface_is_set_to_write_protected_status { + get { + return ResourceManager.GetString("Disc_surface_is_set_to_write_protected_status", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc timestamp: 0x{0:X2}. + /// + internal static string Disc_timestamp_0 { + get { + return ResourceManager.GetString("Disc_timestamp_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc track pitch is 0.74 μm. + /// + internal static string Disc_track_pitch_is_0_74_μm { + get { + return ResourceManager.GetString("Disc_track_pitch_is_0_74_μm", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc type: {0}. + /// + internal static string Disc_type_0 { + get { + return ResourceManager.GetString("Disc_type_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc type declared as CD-DA or CD-ROM. + /// + internal static string Disc_type_declared_as_CD_DA_or_CD_ROM { + get { + return ResourceManager.GetString("Disc_type_declared_as_CD_DA_or_CD_ROM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc type declared as CD-i. + /// + internal static string Disc_type_declared_as_CD_i { + get { + return ResourceManager.GetString("Disc_type_declared_as_CD_i", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc type declared as CD-ROM XA. + /// + internal static string Disc_type_declared_as_CD_ROM_XA { + get { + return ResourceManager.GetString("Disc_type_declared_as_CD_ROM_XA", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc type identifier: "{0}". + /// + internal static string Disc_type_identifier_0 { + get { + return ResourceManager.GetString("Disc_type_identifier_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc type is undefined. + /// + internal static string Disc_type_is_undefined { + get { + return ResourceManager.GetString("Disc_type_is_undefined", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc Type Specific Field 1: 0x{0:X2}. + /// + internal static string Disc_Type_Specific_Field_1_0 { + get { + return ResourceManager.GetString("Disc_Type_Specific_Field_1_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc Type Specific Field 2: 0x{0:X8}. + /// + internal static string Disc_Type_Specific_Field_2_0 { + get { + return ResourceManager.GetString("Disc_Type_Specific_Field_2_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc use is restricted. + /// + internal static string Disc_use_is_restricted { + get { + return ResourceManager.GetString("Disc_use_is_restricted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc use is unrestricted. + /// + internal static string Disc_use_is_unrestricted { + get { + return ResourceManager.GetString("Disc_use_is_unrestricted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc uses a 69.0nm channel giving 27 Gb per layer.. + /// + internal static string Disc_uses_a_69_0nm_channel_giving_27_Gb_per_layer { + get { + return ResourceManager.GetString("Disc_uses_a_69_0nm_channel_giving_27_Gb_per_layer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc uses a 74.5nm channel giving 25 Gb per layer.. + /// + internal static string Disc_uses_a_74_5nm_channel_giving_25_Gb_per_layer { + get { + return ResourceManager.GetString("Disc_uses_a_74_5nm_channel_giving_25_Gb_per_layer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc uses long strategy type dye (Cyanine, AZO, etc...). + /// + internal static string Disc_uses_long_strategy_type_dye_Cyanine_AZO_etc { + get { + return ResourceManager.GetString("Disc_uses_long_strategy_type_dye_Cyanine_AZO_etc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc uses negative polarity.. + /// + internal static string Disc_uses_negative_polarity { + get { + return ResourceManager.GetString("Disc_uses_negative_polarity", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc uses phase change. + /// + internal static string Disc_uses_phase_change { + get { + return ResourceManager.GetString("Disc_uses_phase_change", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc uses positive polarity.. + /// + internal static string Disc_uses_positive_polarity { + get { + return ResourceManager.GetString("Disc_uses_positive_polarity", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc uses short strategy type dye (Phthalocyanine, etc...). + /// + internal static string Disc_uses_short_strategy_type_dye_Phthalocyanine_etc { + get { + return ResourceManager.GetString("Disc_uses_short_strategy_type_dye_Phthalocyanine_etc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc uses unknown BCA code {0}. + /// + internal static string Disc_uses_unknown_BCA_code_0 { + get { + return ResourceManager.GetString("Disc_uses_unknown_BCA_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc uses unknown channel length with code {0}. + /// + internal static string Disc_uses_unknown_channel_length_with_code_0 { + get { + return ResourceManager.GetString("Disc_uses_unknown_channel_length_with_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc uses unknown polarity with code {0}. + /// + internal static string Disc_uses_unknown_polarity_with_code_0 { + get { + return ResourceManager.GetString("Disc_uses_unknown_polarity_with_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc uses unknown recorded reflectivity polarity with code {0}. + /// + internal static string Disc_uses_unknown_recorded_reflectivity_polarity_with_code_0 { + get { + return ResourceManager.GetString("Disc_uses_unknown_recorded_reflectivity_polarity_with_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disc version: {0}. + /// + internal static string Disc_version_0 { + get { + return ResourceManager.GetString("Disc_version_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DLTtape III at 42500 bpi. + /// + internal static string DLT3_42k { + get { + return ResourceManager.GetString("DLT3_42k", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DLTtape III with 56 tracks. + /// + internal static string DLT3_56t { + get { + return ResourceManager.GetString("DLT3_56t", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DLTtape III at 62500 bpi. + /// + internal static string DLT3_62k { + get { + return ResourceManager.GetString("DLT3_62k", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DLTtape IIIxt. + /// + internal static string DLT3_XT { + get { + return ResourceManager.GetString("DLT3_XT", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DLTtape IIIxt compressed. + /// + internal static string DLT3_XT_compressed { + get { + return ResourceManager.GetString("DLT3_XT_compressed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DLTtape III compressed. + /// + internal static string DLT3c { + get { + return ResourceManager.GetString("DLT3c", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DLTtape IV. + /// + internal static string DLT4 { + get { + return ResourceManager.GetString("DLT4", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DLTtape IV at 123090 bpi. + /// + internal static string DLT4_123k { + get { + return ResourceManager.GetString("DLT4_123k", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DLTtape IV at 85937 bpi. + /// + internal static string DLT4_85k { + get { + return ResourceManager.GetString("DLT4_85k", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DLTtape IV at 98250 bpi. + /// + internal static string DLT4_98k { + get { + return ResourceManager.GetString("DLT4_98k", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DLTtape IV compressed. + /// + internal static string DLT4c { + get { + return ResourceManager.GetString("DLT4c", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DLTtape IV at 123090 bpi compressed. + /// + internal static string DLT4c_123k { + get { + return ResourceManager.GetString("DLT4c_123k", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DLTtape IV at 85937 bpi compressed. + /// + internal static string DLT4c_85k { + get { + return ResourceManager.GetString("DLT4c_85k", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DLTtape IV at 98250 bpi compressed. + /// + internal static string DLT4c_98k { + get { + return ResourceManager.GetString("DLT4c_98k", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DMA is supported. + /// + internal static string DMA_is_supported { + get { + return ResourceManager.GetString("DMA_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DMA Setup auto-activation is supported. + /// + internal static string DMA_Setup_auto_activation_is_supported { + get { + return ResourceManager.GetString("DMA_Setup_auto_activation_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DMA Setup auto-activation is supported and enabled. + /// + internal static string DMA_Setup_auto_activation_is_supported_and_enabled { + get { + return ResourceManager.GetString("DMA_Setup_auto_activation_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DMA timing mode: {0}. + /// + internal static string DMA_timing_mode_0 { + get { + return ResourceManager.GetString("DMA_timing_mode_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Domestic title: {0}. + /// + internal static string Domestic_title_0 { + get { + return ResourceManager.GetString("Domestic_title_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Double Byte Character Code is used. + /// + internal static string Double_Byte_Character_Code_is_used { + get { + return ResourceManager.GetString("Double_Byte_Character_Code_is_used", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DOWNLOAD MICROCODE DMA is supported. + /// + internal static string DOWNLOAD_MICROCODE_DMA_is_supported { + get { + return ResourceManager.GetString("DOWNLOAD_MICROCODE_DMA_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DOWNLOAD MICROCODE is supported. + /// + internal static string DOWNLOAD_MICROCODE_is_supported { + get { + return ResourceManager.GetString("DOWNLOAD_MICROCODE_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DOWNLOAD MICROCODE is supported and enabled. + /// + internal static string DOWNLOAD_MICROCODE_is_supported_and_enabled { + get { + return ResourceManager.GetString("DOWNLOAD_MICROCODE_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive accepts a maximum of {0} blocks in a READ command during rebuild. + /// + internal static string Drive_accepts_a_maximum_of_0_blocks_in_a_READ_command_during_rebuild { + get { + return ResourceManager.GetString("Drive_accepts_a_maximum_of_0_blocks_in_a_READ_command_during_rebuild", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive accepts a maximum of {0} blocks in a REGENERATE command. + /// + internal static string Drive_accepts_a_maximum_of_0_blocks_in_a_REGENERATE_command { + get { + return ResourceManager.GetString("Drive_accepts_a_maximum_of_0_blocks_in_a_REGENERATE_command", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive accepts a maximum of {0} blocks in a single XOR WRITE command. + /// + internal static string Drive_accepts_a_maximum_of_0_blocks_in_a_single_XOR_WRITE_command { + get { + return ResourceManager.GetString("Drive_accepts_a_maximum_of_0_blocks_in_a_single_XOR_WRITE_command", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive accepts Packed R-W subchannel data. + /// + internal static string Drive_accepts_Packed_R_W_subchannel_data { + get { + return ResourceManager.GetString("Drive_accepts_Packed_R_W_subchannel_data", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive accepts RAW R-W subchannel data. + /// + internal static string Drive_accepts_RAW_R_W_subchannel_data { + get { + return ResourceManager.GetString("Drive_accepts_RAW_R_W_subchannel_data", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive allows a tape header to be overwritten. + /// + internal static string Drive_allows_a_tape_header_to_be_overwritten { + get { + return ResourceManager.GetString("Drive_allows_a_tape_header_to_be_overwritten", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive allows all format labels to be overwritten. + /// + internal static string Drive_allows_all_format_labels_to_be_overwritten { + get { + return ResourceManager.GetString("Drive_allows_all_format_labels_to_be_overwritten", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read raw R-W subchannel from the Lead-In. + /// + internal static string Drive_an_read_raw_R_W_subchannel_from_the_Lead_In { + get { + return ResourceManager.GetString("Drive_an_read_raw_R_W_subchannel_from_the_Lead_In", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive and currently inserted media support SecurDisc. + /// + internal static string Drive_and_currently_inserted_media_support_SecurDisc { + get { + return ResourceManager.GetString("Drive_and_currently_inserted_media_support_SecurDisc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive and currently inserted media support VCPS. + /// + internal static string Drive_and_currently_inserted_media_support_VCPS { + get { + return ResourceManager.GetString("Drive_and_currently_inserted_media_support_VCPS", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive and read DVD+MRW and read and write CD-MRW. + /// + internal static string Drive_and_read_DVD_MRW_and_read_and_write_CD_MRW { + get { + return ResourceManager.GetString("Drive_and_read_DVD_MRW_and_read_and_write_CD_MRW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive cache segments should be {0} blocks long. + /// + internal static string Drive_cache_segments_should_be_0_blocks_long { + get { + return ResourceManager.GetString("Drive_cache_segments_should_be_0_blocks_long", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive cache segments should be {0} bytes long. + /// + internal static string Drive_cache_segments_should_be_0_bytes_long { + get { + return ResourceManager.GetString("Drive_cache_segments_should_be_0_bytes_long", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can be used as a system floppy device. + /// + internal static string Drive_can_be_used_as_a_system_floppy_device { + get { + return ResourceManager.GetString("Drive_can_be_used_as_a_system_floppy_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can change disc side. + /// + internal static string Drive_can_change_disc_side { + get { + return ResourceManager.GetString("Drive_can_change_disc_side", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can continue from streaming loss. + /// + internal static string Drive_can_continue_from_streaming_loss { + get { + return ResourceManager.GetString("Drive_can_continue_from_streaming_loss", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can deliver a composite audio and video data stream. + /// + internal static string Drive_can_deliver_a_composite_audio_and_video_data_stream { + get { + return ResourceManager.GetString("Drive_can_deliver_a_composite_audio_and_video_data_stream", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can do a quick start formatting. + /// + internal static string Drive_can_do_a_quick_start_formatting { + get { + return ResourceManager.GetString("Drive_can_do_a_quick_start_formatting", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can do a test writing. + /// + internal static string Drive_can_do_a_test_writing { + get { + return ResourceManager.GetString("Drive_can_do_a_test_writing", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can eject media. + /// + internal static string Drive_can_eject_media { + get { + return ResourceManager.GetString("Drive_can_eject_media", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can expand the spare area on a formatted BD-RE disc. + /// + internal static string Drive_can_expand_the_spare_area_on_a_formatted_BD_RE_disc { + get { + return ResourceManager.GetString("Drive_can_expand_the_spare_area_on_a_formatted_BD_RE_disc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can fast re-format BD-RE discs. + /// + internal static string Drive_can_fast_re_format_BD_RE_discs { + get { + return ResourceManager.GetString("Drive_can_fast_re_format_BD_RE_discs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can format BD-R discs with RRM format. + /// + internal static string Drive_can_format_BD_R_discs_with_RRM_format { + get { + return ResourceManager.GetString("Drive_can_format_BD_R_discs_with_RRM_format", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can format BD-RE discs with full certification. + /// + internal static string Drive_can_format_BD_RE_discs_with_full_certification { + get { + return ResourceManager.GetString("Drive_can_format_BD_RE_discs_with_full_certification", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can format BD-RE discs with quick certification. + /// + internal static string Drive_can_format_BD_RE_discs_with_quick_certification { + get { + return ResourceManager.GetString("Drive_can_format_BD_RE_discs_with_quick_certification", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can format BD-RE with no spares allocated. + /// + internal static string Drive_can_format_BD_RE_with_no_spares_allocated { + get { + return ResourceManager.GetString("Drive_can_format_BD_RE_with_no_spares_allocated", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can format media into logical blocks. + /// + internal static string Drive_can_format_media_into_logical_blocks { + get { + return ResourceManager.GetString("Drive_can_format_media_into_logical_blocks", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can generate Defect Status data during formatting. + /// + internal static string Drive_can_generate_Defect_Status_data_during_formatting { + get { + return ResourceManager.GetString("Drive_can_generate_Defect_Status_data_during_formatting", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can lock media. + /// + internal static string Drive_can_lock_media { + get { + return ResourceManager.GetString("Drive_can_lock_media", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can overwrite a TAO track with another in CD-RWs. + /// + internal static string Drive_can_overwrite_a_TAO_track_with_another_in_CD_RWs { + get { + return ResourceManager.GetString("Drive_can_overwrite_a_TAO_track_with_another_in_CD_RWs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can play audio. + /// + internal static string Drive_can_play_audio { + get { + return ResourceManager.GetString("Drive_can_play_audio", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read, deinterleave and correct R-W subchannels. + /// + internal static string Drive_can_read__deinterleave_and_correct_R_W_subchannels { + get { + return ResourceManager.GetString("Drive_can_read__deinterleave_and_correct_R_W_subchannels", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read and write CD-MRW. + /// + internal static string Drive_can_read_and_write_CD_MRW { + get { + return ResourceManager.GetString("Drive_can_read_and_write_CD_MRW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read and write CD-MRW and DVD+MRW. + /// + internal static string Drive_can_read_and_write_CD_MRW_and_DVD_MRW { + get { + return ResourceManager.GetString("Drive_can_read_and_write_CD_MRW_and_DVD_MRW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read and write CD-R. + /// + internal static string Drive_can_read_and_write_CD_R { + get { + return ResourceManager.GetString("Drive_can_read_and_write_CD_R", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read and write CD-RW. + /// + internal static string Drive_can_read_and_write_CD_RW { + get { + return ResourceManager.GetString("Drive_can_read_and_write_CD_RW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read and write DVD+MRW. + /// + internal static string Drive_can_read_and_write_DVD_MRW { + get { + return ResourceManager.GetString("Drive_can_read_and_write_DVD_MRW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read and write DVD+R. + /// + internal static string Drive_can_read_and_write_DVD_Plus_R { + get { + return ResourceManager.GetString("Drive_can_read_and_write_DVD_Plus_R", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read and write DVD+R DL. + /// + internal static string Drive_can_read_and_write_DVD_Plus_R_DL { + get { + return ResourceManager.GetString("Drive_can_read_and_write_DVD_Plus_R_DL", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read and write DVD+RW DL. + /// + internal static string Drive_can_read_and_write_DVD_Plus_RW_DL { + get { + return ResourceManager.GetString("Drive_can_read_and_write_DVD_Plus_RW_DL", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read and write DVD-R. + /// + internal static string Drive_can_read_and_write_DVD_R { + get { + return ResourceManager.GetString("Drive_can_read_and_write_DVD_R", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read and write DVD-RAM. + /// + internal static string Drive_can_read_and_write_DVD_RAM { + get { + return ResourceManager.GetString("Drive_can_read_and_write_DVD_RAM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read and write DVD+RW. + /// + internal static string Drive_can_read_and_write_DVD_RW { + get { + return ResourceManager.GetString("Drive_can_read_and_write_DVD_RW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read barcode. + /// + internal static string Drive_can_read_barcode { + get { + return ResourceManager.GetString("Drive_can_read_barcode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read BD-R pre-1.0. + /// + internal static string Drive_can_read_BD_R_pre_1_0 { + get { + return ResourceManager.GetString("Drive_can_read_BD_R_pre_1_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read BD-R Ver.1. + /// + internal static string Drive_can_read_BD_R_Ver_1 { + get { + return ResourceManager.GetString("Drive_can_read_BD_R_Ver_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read BD-RE pre-1.0. + /// + internal static string Drive_can_read_BD_RE_pre_1_0 { + get { + return ResourceManager.GetString("Drive_can_read_BD_RE_pre_1_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read BD-RE Ver.1. + /// + internal static string Drive_can_read_BD_RE_Ver_1 { + get { + return ResourceManager.GetString("Drive_can_read_BD_RE_Ver_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read BD-RE Ver.2. + /// + internal static string Drive_can_read_BD_RE_Ver_2 { + get { + return ResourceManager.GetString("Drive_can_read_BD_RE_Ver_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read BD-ROM pre-1.0. + /// + internal static string Drive_can_read_BD_ROM_pre_1_0 { + get { + return ResourceManager.GetString("Drive_can_read_BD_ROM_pre_1_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read BD-ROM Ver.1. + /// + internal static string Drive_can_read_BD_ROM_Ver_1 { + get { + return ResourceManager.GetString("Drive_can_read_BD_ROM_Ver_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read BD's Burst Cutting Area. + /// + internal static string Drive_can_read_BDs_Burst_Cutting_Area { + get { + return ResourceManager.GetString("Drive_can_read_BDs_Burst_Cutting_Area", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read both sides of a disc. + /// + internal static string Drive_can_read_both_sides_of_a_disc { + get { + return ResourceManager.GetString("Drive_can_read_both_sides_of_a_disc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read CD-MRW. + /// + internal static string Drive_can_read_CD_MRW { + get { + return ResourceManager.GetString("Drive_can_read_CD_MRW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read CD-MRW and DVD+MRW. + /// + internal static string Drive_can_read_CD_MRW_and_DVD_MRW { + get { + return ResourceManager.GetString("Drive_can_read_CD_MRW_and_DVD_MRW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read CD-R. + /// + internal static string Drive_can_read_CD_R { + get { + return ResourceManager.GetString("Drive_can_read_CD_R", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read CD-RW. + /// + internal static string Drive_can_read_CD_RW { + get { + return ResourceManager.GetString("Drive_can_read_CD_RW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read DDCDs. + /// + internal static string Drive_can_read_DDCDs { + get { + return ResourceManager.GetString("Drive_can_read_DDCDs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read Defect Status data recorded on the medium. + /// + internal static string Drive_can_read_Defect_Status_data_recorded_on_the_medium { + get { + return ResourceManager.GetString("Drive_can_read_Defect_Status_data_recorded_on_the_medium", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read digital audio. + /// + internal static string Drive_can_read_digital_audio { + get { + return ResourceManager.GetString("Drive_can_read_digital_audio", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read DVD media. + /// + internal static string Drive_can_read_DVD_media { + get { + return ResourceManager.GetString("Drive_can_read_DVD_media", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read DVD+R. + /// + internal static string Drive_can_read_DVD_Plus_R { + get { + return ResourceManager.GetString("Drive_can_read_DVD_Plus_R", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read DVD+RW. + /// + internal static string Drive_can_read_DVD_Plus_RW { + get { + return ResourceManager.GetString("Drive_can_read_DVD_Plus_RW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read DVD+RW DL. + /// + internal static string Drive_can_read_DVD_Plus_RW_DL { + get { + return ResourceManager.GetString("Drive_can_read_DVD_Plus_RW_DL", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read DVD-R. + /// + internal static string Drive_can_read_DVD_R { + get { + return ResourceManager.GetString("Drive_can_read_DVD_R", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read DVD-R DL from all recording modes. + /// + internal static string Drive_can_read_DVD_R_DL_from_all_recording_modes { + get { + return ResourceManager.GetString("Drive_can_read_DVD_R_DL_from_all_recording_modes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read DVD-RAM. + /// + internal static string Drive_can_read_DVD_RAM { + get { + return ResourceManager.GetString("Drive_can_read_DVD_RAM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read DVD-ROM. + /// + internal static string Drive_can_read_DVD_ROM { + get { + return ResourceManager.GetString("Drive_can_read_DVD_ROM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read DVD-RW DL from all recording modes. + /// + internal static string Drive_can_read_DVD_RW_DL_from_all_recording_modes { + get { + return ResourceManager.GetString("Drive_can_read_DVD_RW_DL_from_all_recording_modes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read HD DVD-ROM and HD DVD-RW. + /// + internal static string Drive_can_read_HD_DVD_ROM_and_HD_DVD_RW { + get { + return ResourceManager.GetString("Drive_can_read_HD_DVD_ROM_and_HD_DVD_RW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read HD DVD-ROM, HD DVD-RW and HD DVD-R. + /// + internal static string Drive_can_read_HD_DVD_ROM_HD_DVD_RW_and_HD_DVD_R { + get { + return ResourceManager.GetString("Drive_can_read_HD_DVD_ROM_HD_DVD_RW_and_HD_DVD_R", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read HD DVD-ROM, HD DVD-RW and HD DVD-RAM. + /// + internal static string Drive_can_read_HD_DVD_ROM_HD_DVD_RW_and_HD_DVD_RAM { + get { + return ResourceManager.GetString("Drive_can_read_HD_DVD_ROM_HD_DVD_RW_and_HD_DVD_RAM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read HD DVD-ROM, HD DVD-RW, HD DVD-R and HD DVD-RAM. + /// + internal static string Drive_can_read_HD_DVD_ROM_HD_DVD_RW_HD_DVD_R_and_HD_DVD_RAM { + get { + return ResourceManager.GetString("Drive_can_read_HD_DVD_ROM_HD_DVD_RW_HD_DVD_R_and_HD_DVD_RAM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read ISRC. + /// + internal static string Drive_can_read_ISRC { + get { + return ResourceManager.GetString("Drive_can_read_ISRC", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read Media Catalogue Number. + /// + internal static string Drive_can_read_Media_Catalogue_Number { + get { + return ResourceManager.GetString("Drive_can_read_Media_Catalogue_Number", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read sectors in Mode 2 Form 1 format. + /// + internal static string Drive_can_read_sectors_in_Mode_2_Form_1_format { + get { + return ResourceManager.GetString("Drive_can_read_sectors_in_Mode_2_Form_1_format", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read sectors in Mode 2 Form 2 format. + /// + internal static string Drive_can_read_sectors_in_Mode_2_Form_2_format { + get { + return ResourceManager.GetString("Drive_can_read_sectors_in_Mode_2_Form_2_format", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read uncorrected and interleaved R-W subchannels. + /// + internal static string Drive_can_read_uncorrected_and_interleaved_R_W_subchannels { + get { + return ResourceManager.GetString("Drive_can_read_uncorrected_and_interleaved_R_W_subchannels", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can return CD-Text from Lead-In. + /// + internal static string Drive_can_return_CD_Text_from_Lead_In { + get { + return ResourceManager.GetString("Drive_can_return_CD_Text_from_Lead_In", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can return Spare Area Information. + /// + internal static string Drive_can_return_Spare_Area_Information { + get { + return ResourceManager.GetString("Drive_can_return_Spare_Area_Information", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can stop a long immediate operation. + /// + internal static string Drive_can_stop_a_long_immediate_operation { + get { + return ResourceManager.GetString("Drive_can_stop_a_long_immediate_operation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can store {0} LBA Extents. + /// + internal static string Drive_can_store_0_LBA_Extents { + get { + return ResourceManager.GetString("Drive_can_store_0_LBA_Extents", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can store 256 LBA Extents. + /// + internal static string Drive_can_store_256_LBA_Extents { + get { + return ResourceManager.GetString("Drive_can_store_256_LBA_Extents", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can write BD-R on Pseudo-OVerwrite SRM mode. + /// + internal static string Drive_can_write_BD_R_on_Pseudo_OVerwrite_SRM_mode { + get { + return ResourceManager.GetString("Drive_can_write_BD_R_on_Pseudo_OVerwrite_SRM_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can write BD-R pre-1.0. + /// + internal static string Drive_can_write_BD_R_pre_1_0 { + get { + return ResourceManager.GetString("Drive_can_write_BD_R_pre_1_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can write BD-R Ver.1. + /// + internal static string Drive_can_write_BD_R_Ver_1 { + get { + return ResourceManager.GetString("Drive_can_write_BD_R_Ver_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can write BD-RE pre-1.0. + /// + internal static string Drive_can_write_BD_RE_pre_1_0 { + get { + return ResourceManager.GetString("Drive_can_write_BD_RE_pre_1_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can write BD-RE Ver.1. + /// + internal static string Drive_can_write_BD_RE_Ver_1 { + get { + return ResourceManager.GetString("Drive_can_write_BD_RE_Ver_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can write BD-RE Ver.2. + /// + internal static string Drive_can_write_BD_RE_Ver_2 { + get { + return ResourceManager.GetString("Drive_can_write_BD_RE_Ver_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can write CD-RW. + /// + internal static string Drive_can_write_CD_RW { + get { + return ResourceManager.GetString("Drive_can_write_CD_RW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can write CDs in raw Mode:. + /// + internal static string Drive_can_write_CDs_in_raw_Mode { + get { + return ResourceManager.GetString("Drive_can_write_CDs_in_raw_Mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can write CDs in Session at Once and in Raw Modes:. + /// + internal static string Drive_can_write_CDs_in_Session_at_Once_and_in_Raw_Modes { + get { + return ResourceManager.GetString("Drive_can_write_CDs_in_Session_at_Once_and_in_Raw_Modes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can write CDs in Session at Once Mode:. + /// + internal static string Drive_can_write_CDs_in_Session_at_Once_Mode { + get { + return ResourceManager.GetString("Drive_can_write_CDs_in_Session_at_Once_Mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can write CDs in Track at Once Mode:. + /// + internal static string Drive_can_write_CDs_in_Track_at_Once_Mode { + get { + return ResourceManager.GetString("Drive_can_write_CDs_in_Track_at_Once_Mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can write HD DVD-RW. + /// + internal static string Drive_can_write_HD_DVD_RW { + get { + return ResourceManager.GetString("Drive_can_write_HD_DVD_RW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can write HD DVD-RW and HD DVD-R. + /// + internal static string Drive_can_write_HD_DVD_RW_and_HD_DVD_R { + get { + return ResourceManager.GetString("Drive_can_write_HD_DVD_RW_and_HD_DVD_R", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can write HD DVD-RW and HD DVD-RAM. + /// + internal static string Drive_can_write_HD_DVD_RW_and_HD_DVD_RAM { + get { + return ResourceManager.GetString("Drive_can_write_HD_DVD_RW_and_HD_DVD_RAM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can write HD DVD-RW, HD DVD-R and HD DVD-RAM. + /// + internal static string Drive_can_write_HD_DVD_RW_HD_DVD_R_and_HD_DVD_RAM { + get { + return ResourceManager.GetString("Drive_can_write_HD_DVD_RW_HD_DVD_R_and_HD_DVD_RAM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can write High-Speed CD-RW. + /// + internal static string Drive_can_write_High_Speed_CD_RW { + get { + return ResourceManager.GetString("Drive_can_write_High_Speed_CD_RW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can write multi-session CDs in raw mode. + /// + internal static string Drive_can_write_multi_session_CDs_in_raw_mode { + get { + return ResourceManager.GetString("Drive_can_write_multi_session_CDs_in_raw_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can write this density. + /// + internal static string Drive_can_write_this_density { + get { + return ResourceManager.GetString("Drive_can_write_this_density", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can write user provided data in the R-W subchannels. + /// + internal static string Drive_can_write_user_provided_data_in_the_R_W_subchannels { + get { + return ResourceManager.GetString("Drive_can_write_user_provided_data_in_the_R_W_subchannels", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive cannot store LBA Extents. + /// + internal static string Drive_cannot_store_LBA_Extents { + get { + return ResourceManager.GetString("Drive_cannot_store_LBA_Extents", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive claims capability to read all CD formats according to OSTA Multi-Read Specification + ///. + /// + internal static string Drive_claims_capability_to_read_all_CD_formats_according_to_OSTA_Multi_Read_Specification { + get { + return ResourceManager.GetString("Drive_claims_capability_to_read_all_CD_formats_according_to_OSTA_Multi_Read_Speci" + + "fication", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive claims support to report Track Resources Information. + /// + internal static string Drive_claims_support_to_report_Track_Resources_Information { + get { + return ResourceManager.GetString("Drive_claims_support_to_report_Track_Resources_Information", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive conforms to DVD Multi Drive Read-only Specifications. + /// + internal static string Drive_conforms_to_DVD_Multi_Drive_Read_only_Specifications { + get { + return ResourceManager.GetString("Drive_conforms_to_DVD_Multi_Drive_Read_only_Specifications", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive contains a changer that can report the exact contents of the slots. + /// + internal static string Drive_contains_a_changer_that_can_report_the_exact_contents_of_the_slots { + get { + return ResourceManager.GetString("Drive_contains_a_changer_that_can_report_the_exact_contents_of_the_slots", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive copyright: {0}. + /// + internal static string Drive_copyright_0 { + get { + return ResourceManager.GetString("Drive_copyright_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive's current reading speed is {0} Kbyte/sec.. + /// + internal static string Drive_current_reading_speed_is_0_Kbyte_sec { + get { + return ResourceManager.GetString("Drive_current_reading_speed_is_0_Kbyte_sec", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive's current writing speed is {0} Kbyte/sec.. + /// + internal static string Drive_current_writing_speed_is_0_Kbyte_sec { + get { + return ResourceManager.GetString("Drive_current_writing_speed_is_0_Kbyte_sec", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive's current writing speed is {0} Kbyte/sec. in CLV mode. + /// + internal static string Drive_current_writing_speed_is_0_Kbyte_sec_in_CLV_mode { + get { + return ResourceManager.GetString("Drive_current_writing_speed_is_0_Kbyte_sec_in_CLV_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive's current writing speed is {0} Kbyte/sec. in pure CAV mode. + /// + internal static string Drive_current_writing_speed_is_0_Kbyte_sec_in_pure_CAV_mode { + get { + return ResourceManager.GetString("Drive_current_writing_speed_is_0_Kbyte_sec_in_pure_CAV_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive's date/time is: {0}. + /// + internal static string Drive_date_time_is_0 { + get { + return ResourceManager.GetString("Drive_date_time_is_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive does not allow any logical blocks to be overwritten. + /// + internal static string Drive_does_not_allow_any_logical_blocks_to_be_overwritten { + get { + return ResourceManager.GetString("Drive_does_not_allow_any_logical_blocks_to_be_overwritten", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive does not distinguish between cached read data. + /// + internal static string Drive_does_not_distinguish_between_cached_read_data { + get { + return ResourceManager.GetString("Drive_does_not_distinguish_between_cached_read_data", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive does not distinguish between cached write data. + /// + internal static string Drive_does_not_distinguish_between_cached_write_data { + get { + return ResourceManager.GetString("Drive_does_not_distinguish_between_cached_write_data", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive does not support data compression. + /// + internal static string Drive_does_not_support_data_compression { + get { + return ResourceManager.GetString("Drive_does_not_support_data_compression", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive does not use compression. + /// + internal static string Drive_does_not_use_compression { + get { + return ResourceManager.GetString("Drive_does_not_use_compression", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive EEPROM version: {0}. + /// + internal static string Drive_EEPROM_version_0 { + get { + return ResourceManager.GetString("Drive_EEPROM_version_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive firmware is dated {0}. + /// + internal static string Drive_firmware_is_dated_0 { + get { + return ResourceManager.GetString("Drive_firmware_is_dated_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive generates end-of-data. + /// + internal static string Drive_generates_end_of_data { + get { + return ResourceManager.GetString("Drive_generates_end_of_data", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive hardware version: {0}. + /// + internal static string Drive_hardware_version_0 { + get { + return ResourceManager.GetString("Drive_hardware_version_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive has {0} DBI cache zones. + /// + internal static string Drive_has_0_DBI_cache_zones { + get { + return ResourceManager.GetString("Drive_has_0_DBI_cache_zones", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive has {0} DBI entries. + /// + internal static string Drive_has_0_DBI_entries { + get { + return ResourceManager.GetString("Drive_has_0_DBI_entries", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive has {0} increase of Group 3 time unit. + /// + internal static string Drive_has_0_increase_of_Group_3_time_unit { + get { + return ResourceManager.GetString("Drive_has_0_increase_of_Group_3_time_unit", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive has {0} Kbyte of buffer. + /// + internal static string Drive_has_0_Kbyte_of_buffer { + get { + return ResourceManager.GetString("Drive_has_0_Kbyte_of_buffer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive has {0} slots. + /// + internal static string Drive_has_0_slots { + get { + return ResourceManager.GetString("Drive_has_0_slots", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive has {0} user controlled changes available.. + /// + internal static string Drive_has_0_user_controlled_changes_available { + get { + return ResourceManager.GetString("Drive_has_0_user_controlled_changes_available", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive has {0} vendor resets available.. + /// + internal static string Drive_has_0_vendor_resets_available { + get { + return ResourceManager.GetString("Drive_has_0_vendor_resets_available", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive has {0} volume levels. + /// + internal static string Drive_has_0_volume_levels { + get { + return ResourceManager.GetString("Drive_has_0_volume_levels", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive has an analogue audio output. + /// + internal static string Drive_has_an_analogue_audio_output { + get { + return ResourceManager.GetString("Drive_has_an_analogue_audio_output", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive has been operating {0}. + /// + internal static string Drive_has_been_operating_0 { + get { + return ResourceManager.GetString("Drive_has_been_operating_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive has been powered up {0} times. + /// + internal static string Drive_has_been_powered_up_0_times { + get { + return ResourceManager.GetString("Drive_has_been_powered_up_0_times", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive has been powered up a total of {0} seconds. + /// + internal static string Drive_has_been_powered_up_a_total_of_0_seconds { + get { + return ResourceManager.GetString("Drive_has_been_powered_up_a_total_of_0_seconds", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive has been powered up since {0} seconds ago this time. + /// + internal static string Drive_has_been_powered_up_since_0_seconds_ago_this_time { + get { + return ResourceManager.GetString("Drive_has_been_powered_up_since_0_seconds_ago_this_time", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive has encryption enabled. + /// + internal static string Drive_has_encryption_enabled { + get { + return ResourceManager.GetString("Drive_has_encryption_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive has no region set.. + /// + internal static string Drive_has_no_region_set { + get { + return ResourceManager.GetString("Drive_has_no_region_set", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive has the following regions set:. + /// + internal static string Drive_has_the_following_regions_set { + get { + return ResourceManager.GetString("Drive_has_the_following_regions_set", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive has two LUNs with rewritable being . + /// + internal static string Drive_has_two_LUNs_with_rewritable_being { + get { + return ResourceManager.GetString("Drive_has_two_LUNs_with_rewritable_being", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive informs of unknown profile 0x{0:X4}. + /// + internal static string Drive_informs_of_unknown_profile_0 { + get { + return ResourceManager.GetString("Drive_informs_of_unknown_profile_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive is a changer using cartridges. + /// + internal static string Drive_is_a_changer_using_cartridges { + get { + return ResourceManager.GetString("Drive_is_a_changer_using_cartridges", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive is a changer with individually changeable discs. + /// + internal static string Drive_is_a_changer_with_individually_changeable_discs { + get { + return ResourceManager.GetString("Drive_is_a_changer_with_individually_changeable_discs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive is a Non-CD Optical Device. + /// + internal static string Drive_is_a_Non_CD_Optical_Device { + get { + return ResourceManager.GetString("Drive_is_a_Non_CD_Optical_Device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive is able to access Hybrid discs. + /// + internal static string Drive_is_able_to_access_Hybrid_discs { + get { + return ResourceManager.GetString("Drive_is_able_to_access_Hybrid_discs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive is able to maintain the online format layer through reset and power cycling. + /// + internal static string Drive_is_able_to_maintain_the_online_format_layer_through_reset_and_power_cycling { + get { + return ResourceManager.GetString("Drive_is_able_to_maintain_the_online_format_layer_through_reset_and_power_cycling" + + "", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive is able to mute channels separately. + /// + internal static string Drive_is_able_to_mute_channels_separately { + get { + return ResourceManager.GetString("Drive_is_able_to_mute_channels_separately", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive is able to perform host and drive directed power management. + /// + internal static string Drive_is_able_to_perform_host_and_drive_directed_power_management { + get { + return ResourceManager.GetString("Drive_is_able_to_perform_host_and_drive_directed_power_management", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive is able to read media serial number. + /// + internal static string Drive_is_able_to_read_media_serial_number { + get { + return ResourceManager.GetString("Drive_is_able_to_read_media_serial_number", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive is able to report slots contents after a reset or change. + /// + internal static string Drive_is_able_to_report_slots_contents_after_a_reset_or_change { + get { + return ResourceManager.GetString("Drive_is_able_to_report_slots_contents_after_a_reset_or_change", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive is capable of zero loss linking. + /// + internal static string Drive_is_capable_of_zero_loss_linking { + get { + return ResourceManager.GetString("Drive_is_capable_of_zero_loss_linking", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive is disabled until power is cycled. + /// + internal static string Drive_is_disabled_until_power_is_cycled { + get { + return ResourceManager.GetString("Drive_is_disabled_until_power_is_cycled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive is emulating a CD-ROM drive. + /// + internal static string Drive_is_emulating_a_CD_ROM_drive { + get { + return ResourceManager.GetString("Drive_is_emulating_a_CD_ROM_drive", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive is flashed with Kreon firmware {0}.. + /// + internal static string Drive_is_flashed_with_Kreon_firmware_0 { + get { + return ResourceManager.GetString("Drive_is_flashed_with_Kreon_firmware_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive is locked, media cannot be ejected, but if empty, can be inserted. + /// + internal static string Drive_is_locked__media_cannot_be_ejected__but_if_empty__can_be_inserted { + get { + return ResourceManager.GetString("Drive_is_locked__media_cannot_be_ejected__but_if_empty__can_be_inserted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive is locked, media cannot be ejected or inserted. + /// + internal static string Drive_is_locked__media_cannot_be_ejected_or_inserted { + get { + return ResourceManager.GetString("Drive_is_locked__media_cannot_be_ejected_or_inserted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive is not conforming to any profile. + /// + internal static string Drive_is_not_conforming_to_any_profile { + get { + return ResourceManager.GetString("Drive_is_not_conforming_to_any_profile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive is not emulating a CD-ROM drive. + /// + internal static string Drive_is_not_emulating_a_CD_ROM_drive { + get { + return ResourceManager.GetString("Drive_is_not_emulating_a_CD_ROM_drive", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive is not locked, media can be ejected and inserted. + /// + internal static string Drive_is_not_locked__media_can_be_ejected_and_inserted { + get { + return ResourceManager.GetString("Drive_is_not_locked__media_can_be_ejected_and_inserted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive is operating in WORM mode. + /// + internal static string Drive_is_operating_in_WORM_mode { + get { + return ResourceManager.GetString("Drive_is_operating_in_WORM_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive is pop-up. + /// + internal static string Drive_is_pop_up { + get { + return ResourceManager.GetString("Drive_is_pop_up", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive is region free.. + /// + internal static string Drive_is_region_free { + get { + return ResourceManager.GetString("Drive_is_region_free", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive is software write-protected until powered down. + /// + internal static string Drive_is_software_write_protected_until_powered_down { + get { + return ResourceManager.GetString("Drive_is_software_write_protected_until_powered_down", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive jumpers choose SCSI ID {0}. + /// + internal static string Drive_jumpers_choose_SCSI_ID_0 { + get { + return ResourceManager.GetString("Drive_jumpers_choose_SCSI_ID_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive's maximum reading speed is {0} Kbyte/sec.. + /// + internal static string Drive_maximum_reading_speed_is_0_Kbyte_sec { + get { + return ResourceManager.GetString("Drive_maximum_reading_speed_is_0_Kbyte_sec", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive's maximum writing speed is {0} Kbyte/sec.. + /// + internal static string Drive_maximum_writing_speed_is_0_Kbyte_sec { + get { + return ResourceManager.GetString("Drive_maximum_writing_speed_is_0_Kbyte_sec", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive media is removable. + /// + internal static string Drive_media_is_removable { + get { + return ResourceManager.GetString("Drive_media_is_removable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive needs a minimum of {0} ms between READ commands during rebuild. + /// + internal static string Drive_needs_a_minimum_of_0_ms_between_READ_commands_during_rebuild { + get { + return ResourceManager.GetString("Drive_needs_a_minimum_of_0_ms_between_READ_commands_during_rebuild", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive needs to do {0} step pulses per cylinder. + /// + internal static string Drive_needs_to_do_0_step_pulses_per_cylinder { + get { + return ResourceManager.GetString("Drive_needs_to_do_0_step_pulses_per_cylinder", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive operates using explicit address mode. + /// + internal static string Drive_operates_using_explicit_address_mode { + get { + return ResourceManager.GetString("Drive_operates_using_explicit_address_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive operates using implicit address mode. + /// + internal static string Drive_operates_using_implicit_address_mode { + get { + return ResourceManager.GetString("Drive_operates_using_implicit_address_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive power ups locked. + /// + internal static string Drive_power_ups_locked { + get { + return ResourceManager.GetString("Drive_power_ups_locked", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive region has been set permanently, but may be reset by the vendor if necessary.. + /// + internal static string Drive_region_has_been_set_permanently_but_may_be_reset_by_the_vendor_if_necessary { + get { + return ResourceManager.GetString("Drive_region_has_been_set_permanently_but_may_be_reset_by_the_vendor_if_necessary" + + "", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive region is set.. + /// + internal static string Drive_region_is_set { + get { + return ResourceManager.GetString("Drive_region_is_set", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive region is set, with additional restrictions required to make a change.. + /// + internal static string Drive_region_is_set_with_additional_restrictions_required_to_make_a_change { + get { + return ResourceManager.GetString("Drive_region_is_set_with_additional_restrictions_required_to_make_a_change", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive reported a reserved profile number. + /// + internal static string Drive_reported_a_reserved_profile_number { + get { + return ResourceManager.GetString("Drive_reported_a_reserved_profile_number", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive reports early warnings. + /// + internal static string Drive_reports_early_warnings { + get { + return ResourceManager.GetString("Drive_reports_early_warnings", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive reports setmarks. + /// + internal static string Drive_reports_setmarks { + get { + return ResourceManager.GetString("Drive_reports_setmarks", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive responds to SCSI ID {0}. + /// + internal static string Drive_responds_to_SCSI_ID_0 { + get { + return ResourceManager.GetString("Drive_responds_to_SCSI_ID_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive servo part number: {0}. + /// + internal static string Drive_servo_part_number_0 { + get { + return ResourceManager.GetString("Drive_servo_part_number_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive shall allocate {0} bytes to buffer even when all cached data cannot be evicted. + /// + internal static string Drive_shall_allocate_0_bytes_to_buffer_even_when_all_cached_data_cannot_be_evicted { + get { + return ResourceManager.GetString("Drive_shall_allocate_0_bytes_to_buffer_even_when_all_cached_data_cannot_be_evicte" + + "d", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive shall be able to provide a defect-free contiguous address space. + /// + internal static string Drive_shall_be_able_to_provide_a_defect_free_contiguous_address_space { + get { + return ResourceManager.GetString("Drive_shall_be_able_to_provide_a_defect_free_contiguous_address_space", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive shall have the ability to overwrite logical blocks only in fixed sets at a time. + /// + internal static string Drive_shall_have_the_ability_to_overwrite_logical_blocks_only_in_fixed_sets_at_a_time { + get { + return ResourceManager.GetString("Drive_shall_have_the_ability_to_overwrite_logical_blocks_only_in_fixed_sets_at_a_" + + "time", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive shall log informational exception conditions. + /// + internal static string Drive_shall_log_informational_exception_conditions { + get { + return ResourceManager.GetString("Drive_shall_log_informational_exception_conditions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive shall maintain its position on reset. + /// + internal static string Drive_shall_maintain_its_position_on_reset { + get { + return ResourceManager.GetString("Drive_shall_maintain_its_position_on_reset", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive shall position to beginning of default data partition on reset. + /// + internal static string Drive_shall_position_to_beginning_of_default_data_partition_on_reset { + get { + return ResourceManager.GetString("Drive_shall_position_to_beginning_of_default_data_partition_on_reset", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive shall report Read/Write Error Recovery mode page. + /// + internal static string Drive_shall_report_Read_Write_Error_Recovery_mode_page { + get { + return ResourceManager.GetString("Drive_shall_report_Read_Write_Error_Recovery_mode_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive shall report recovered errors. + /// + internal static string Drive_shall_report_recovered_errors { + get { + return ResourceManager.GetString("Drive_shall_report_recovered_errors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive should have {0} cache segments. + /// + internal static string Drive_should_have_0_cache_segments { + get { + return ResourceManager.GetString("Drive_should_have_0_cache_segments", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive should not reorder the sequence of write commands to be faster. + /// + internal static string Drive_should_not_reorder_the_sequence_of_write_commands_to_be_faster { + get { + return ResourceManager.GetString("Drive_should_not_reorder_the_sequence_of_write_commands_to_be_faster", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive steps in {0} ns. + /// + internal static string Drive_steps_in_0_ns { + get { + return ResourceManager.GetString("Drive_steps_in_0_ns", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive steps in {0} μs. + /// + internal static string Drive_steps_in_0_μs { + get { + return ResourceManager.GetString("Drive_steps_in_0_μs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports {0} AGIDs concurrently. + /// + internal static string Drive_supports_0_AGIDs_concurrently { + get { + return ResourceManager.GetString("Drive_supports_0_AGIDs_concurrently", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports {0} LUNs. + /// + internal static string Drive_supports_0_LUNs { + get { + return ResourceManager.GetString("Drive_supports_0_LUNs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports {0} volume levels. + /// + internal static string Drive_supports_0_volume_levels { + get { + return ResourceManager.GetString("Drive_supports_0_volume_levels", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports a maximum of {0} bytes in a single cue sheet. + /// + internal static string Drive_supports_a_maximum_of_0_bytes_in_a_single_cue_sheet { + get { + return ResourceManager.GetString("Drive_supports_a_maximum_of_0_bytes_in_a_single_cue_sheet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports AACS version {0}. + /// + internal static string Drive_supports_AACS_version_0 { + get { + return ResourceManager.GetString("Drive_supports_AACS_version_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports AACS version {0} and current disc is encrypted. + /// + internal static string Drive_supports_AACS_version_0_and_current_disc_is_encrypted { + get { + return ResourceManager.GetString("Drive_supports_AACS_version_0_and_current_disc_is_encrypted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports address mode reservation on the RESERVE TRACK command. + /// + internal static string Drive_supports_address_mode_reservation_on_the_RESERVE_TRACK_command { + get { + return ResourceManager.GetString("Drive_supports_address_mode_reservation_on_the_RESERVE_TRACK_command", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports Advanced Storage - Magneto-Optical. + /// + internal static string Drive_supports_Advanced_Storage_Magneto_Optical { + get { + return ResourceManager.GetString("Drive_supports_Advanced_Storage_Magneto_Optical", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports BD-R RRM. + /// + internal static string Drive_supports_BD_R_RRM { + get { + return ResourceManager.GetString("Drive_supports_BD_R_RRM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports BD-R SRM. + /// + internal static string Drive_supports_BD_R_SRM { + get { + return ResourceManager.GetString("Drive_supports_BD_R_SRM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports BD-RE. + /// + internal static string Drive_supports_BD_RE { + get { + return ResourceManager.GetString("Drive_supports_BD_RE", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports BD-ROM. + /// + internal static string Drive_supports_BD_ROM { + get { + return ResourceManager.GetString("Drive_supports_BD_ROM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports both forms of background format stopping. + /// + internal static string Drive_supports_both_forms_of_background_format_stopping { + get { + return ResourceManager.GetString("Drive_supports_both_forms_of_background_format_stopping", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports buffer under-run free recording. + /// + internal static string Drive_supports_buffer_under_run_free_recording { + get { + return ResourceManager.GetString("Drive_supports_buffer_under_run_free_recording", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports bus encryption. + /// + internal static string Drive_supports_bus_encryption { + get { + return ResourceManager.GetString("Drive_supports_bus_encryption", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports C2 Error Pointers. + /// + internal static string Drive_supports_C2_Error_Pointers { + get { + return ResourceManager.GetString("Drive_supports_C2_Error_Pointers", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports C2 pointers. + /// + internal static string Drive_supports_C2_pointers { + get { + return ResourceManager.GetString("Drive_supports_C2_pointers", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports CD-R. + /// + internal static string Drive_supports_CD_R { + get { + return ResourceManager.GetString("Drive_supports_CD_R", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports CD-ROM. + /// + internal static string Drive_supports_CD_ROM { + get { + return ResourceManager.GetString("Drive_supports_CD_ROM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports CD-RW. + /// + internal static string Drive_supports_CD_RW { + get { + return ResourceManager.GetString("Drive_supports_CD_RW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports CD-RW subtypes. + /// + internal static string Drive_supports_CD_RW_subtypes { + get { + return ResourceManager.GetString("Drive_supports_CD_RW_subtypes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports data block types:. + /// + internal static string Drive_supports_data_block_types { + get { + return ResourceManager.GetString("Drive_supports_data_block_types", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports data compression. + /// + internal static string Drive_supports_data_compression { + get { + return ResourceManager.GetString("Drive_supports_data_compression", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports DCB {0:X8}h. + /// + internal static string Drive_supports_DCB_0 { + get { + return ResourceManager.GetString("Drive_supports_DCB_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports DDCD-R. + /// + internal static string Drive_supports_DDCD_R { + get { + return ResourceManager.GetString("Drive_supports_DDCD_R", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports DDCD-ROM. + /// + internal static string Drive_supports_DDCD_ROM { + get { + return ResourceManager.GetString("Drive_supports_DDCD_ROM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports DDCD-RW. + /// + internal static string Drive_supports_DDCD_RW { + get { + return ResourceManager.GetString("Drive_supports_DDCD_RW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports Device Busy events. + /// + internal static string Drive_supports_Device_Busy_events { + get { + return ResourceManager.GetString("Drive_supports_Device_Busy_events", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports DPO and FUA bits. + /// + internal static string Drive_supports_DPO_and_FUA_bits { + get { + return ResourceManager.GetString("Drive_supports_DPO_and_FUA_bits", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports DRT-DM mode. + /// + internal static string Drive_supports_DRT_DM_mode { + get { + return ResourceManager.GetString("Drive_supports_DRT_DM_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports DVD CPRM version {0}. + /// + internal static string Drive_supports_DVD_CPRM_version_0 { + get { + return ResourceManager.GetString("Drive_supports_DVD_CPRM_version_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports DVD CPRM version {0} and current disc is or can be encrypted. + /// + internal static string Drive_supports_DVD_CPRM_version_0_and_current_disc_is_or_can_be_encrypted { + get { + return ResourceManager.GetString("Drive_supports_DVD_CPRM_version_0_and_current_disc_is_or_can_be_encrypted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports DVD CSS and/or DVD CPPM. + /// + internal static string Drive_supports_DVD_CSS_and_or_DVD_CPPM { + get { + return ResourceManager.GetString("Drive_supports_DVD_CSS_and_or_DVD_CPPM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports DVD CSS/CPPM version {0}. + /// + internal static string Drive_supports_DVD_CSS_CPPM_version_0 { + get { + return ResourceManager.GetString("Drive_supports_DVD_CSS_CPPM_version_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports DVD CSS/CPPM version {0} and current disc is encrypted. + /// + internal static string Drive_supports_DVD_CSS_CPPM_version_0_and_current_disc_is_encrypted { + get { + return ResourceManager.GetString("Drive_supports_DVD_CSS_CPPM_version_0_and_current_disc_is_encrypted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports DVD-Download. + /// + internal static string Drive_supports_DVD_Download { + get { + return ResourceManager.GetString("Drive_supports_DVD_Download", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports DVD+R. + /// + internal static string Drive_supports_DVD_Plus_R { + get { + return ResourceManager.GetString("Drive_supports_DVD_Plus_R", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports DVD+R DL. + /// + internal static string Drive_supports_DVD_Plus_R_DL { + get { + return ResourceManager.GetString("Drive_supports_DVD_Plus_R_DL", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports DVD+RW. + /// + internal static string Drive_supports_DVD_Plus_RW { + get { + return ResourceManager.GetString("Drive_supports_DVD_Plus_RW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports DVD+RW DL. + /// + internal static string Drive_supports_DVD_Plus_RW_DL { + get { + return ResourceManager.GetString("Drive_supports_DVD_Plus_RW_DL", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports DVD-R. + /// + internal static string Drive_supports_DVD_R { + get { + return ResourceManager.GetString("Drive_supports_DVD_R", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports DVD-RAM. + /// + internal static string Drive_supports_DVD_RAM { + get { + return ResourceManager.GetString("Drive_supports_DVD_RAM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports DVD-ROM. + /// + internal static string Drive_supports_DVD_ROM { + get { + return ResourceManager.GetString("Drive_supports_DVD_ROM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports DVD-RW DL. + /// + internal static string Drive_supports_DVD_RW_DL { + get { + return ResourceManager.GetString("Drive_supports_DVD_RW_DL", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports encryption. + /// + internal static string Drive_supports_encryption { + get { + return ResourceManager.GetString("Drive_supports_encryption", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports EVPD, Page Code and 16-bit Allocation Length as described in SPC-3. + /// + internal static string Drive_supports_EVPD_Page_Code_and_16_bit_Allocation_Length_as_described_in_SPC_3 { + get { + return ResourceManager.GetString("Drive_supports_EVPD_Page_Code_and_16_bit_Allocation_Length_as_described_in_SPC_3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports generating the binding nonce. + /// + internal static string Drive_supports_generating_the_binding_nonce { + get { + return ResourceManager.GetString("Drive_supports_generating_the_binding_nonce", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports hard-sectoring format. + /// + internal static string Drive_supports_hard_sectoring_format { + get { + return ResourceManager.GetString("Drive_supports_hard_sectoring_format", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports HD DVD-R. + /// + internal static string Drive_supports_HD_DVD_R { + get { + return ResourceManager.GetString("Drive_supports_HD_DVD_R", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports HD DVD-R DL. + /// + internal static string Drive_supports_HD_DVD_R_DL { + get { + return ResourceManager.GetString("Drive_supports_HD_DVD_R_DL", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports HD DVD-RAM. + /// + internal static string Drive_supports_HD_DVD_RAM { + get { + return ResourceManager.GetString("Drive_supports_HD_DVD_RAM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports HD DVD-ROM. + /// + internal static string Drive_supports_HD_DVD_ROM { + get { + return ResourceManager.GetString("Drive_supports_HD_DVD_ROM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports HD DVD-RW. + /// + internal static string Drive_supports_HD_DVD_RW { + get { + return ResourceManager.GetString("Drive_supports_HD_DVD_RW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports HD DVD-RW DL. + /// + internal static string Drive_supports_HD_DVD_RW_DL { + get { + return ResourceManager.GetString("Drive_supports_HD_DVD_RW_DL", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports HDBurn CD-R. + /// + internal static string Drive_supports_HDBurn_CD_R { + get { + return ResourceManager.GetString("Drive_supports_HDBurn_CD_R", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports HDBurn CD-ROM. + /// + internal static string Drive_supports_HDBurn_CD_ROM { + get { + return ResourceManager.GetString("Drive_supports_HDBurn_CD_ROM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports HDBurn CD-RW. + /// + internal static string Drive_supports_HDBurn_CD_RW { + get { + return ResourceManager.GetString("Drive_supports_HDBurn_CD_RW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports IEC-958 digital output on port 1. + /// + internal static string Drive_supports_IEC_958_digital_output_on_port_1 { + get { + return ResourceManager.GetString("Drive_supports_IEC_958_digital_output_on_port_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports IEC-958 digital output on port 2. + /// + internal static string Drive_supports_IEC_958_digital_output_on_port_2 { + get { + return ResourceManager.GetString("Drive_supports_IEC_958_digital_output_on_port_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports layer jump recorded DVD-R DL. + /// + internal static string Drive_supports_layer_jump_recorded_DVD_R_DL { + get { + return ResourceManager.GetString("Drive_supports_layer_jump_recorded_DVD_R_DL", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports linked OSPBs. + /// + internal static string Drive_supports_linked_OSPBs { + get { + return ResourceManager.GetString("Drive_supports_linked_OSPBs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports Magneto-Optical media. + /// + internal static string Drive_supports_Magneto_Optical_media { + get { + return ResourceManager.GetString("Drive_supports_Magneto_Optical_media", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports media that require erasing before writing. + /// + internal static string Drive_supports_media_that_require_erasing_before_writing { + get { + return ResourceManager.GetString("Drive_supports_media_that_require_erasing_before_writing", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports Microcode Upgrade. + /// + internal static string Drive_supports_Microcode_Upgrade { + get { + return ResourceManager.GetString("Drive_supports_Microcode_Upgrade", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports multi-session discs and/or Photo-CD. + /// + internal static string Drive_supports_multi_session_discs_and_or_Photo_CD { + get { + return ResourceManager.GetString("Drive_supports_multi_session_discs_and_or_Photo_CD", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports non-removable changeable media. + /// + internal static string Drive_supports_non_removable_changeable_media { + get { + return ResourceManager.GetString("Drive_supports_non_removable_changeable_media", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports only polling GET EVENT STATUS NOTIFICATION. + /// + internal static string Drive_supports_only_polling_GET_EVENT_STATUS_NOTIFICATION { + get { + return ResourceManager.GetString("Drive_supports_only_polling_GET_EVENT_STATUS_NOTIFICATION", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports only the read compatibility stop. + /// + internal static string Drive_supports_only_the_read_compatibility_stop { + get { + return ResourceManager.GetString("Drive_supports_only_the_read_compatibility_stop", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports operational change request / notification class events. + /// + internal static string Drive_supports_operational_change_request_notification_class_events { + get { + return ResourceManager.GetString("Drive_supports_operational_change_request_notification_class_events", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports optical write-once media. + /// + internal static string Drive_supports_optical_write_once_media { + get { + return ResourceManager.GetString("Drive_supports_optical_write_once_media", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports Persistent-DM mode. + /// + internal static string Drive_supports_Persistent_DM_mode { + get { + return ResourceManager.GetString("Drive_supports_Persistent_DM_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports polling and asynchronous GET EVENT STATUS NOTIFICATION. + /// + internal static string Drive_supports_polling_and_asynchronous_GET_EVENT_STATUS_NOTIFICATION { + get { + return ResourceManager.GetString("Drive_supports_polling_and_asynchronous_GET_EVENT_STATUS_NOTIFICATION", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports PSA updates on write-once media. + /// + internal static string Drive_supports_PSA_updates_on_write_once_media { + get { + return ResourceManager.GetString("Drive_supports_PSA_updates_on_write_once_media", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports quick formatting. + /// + internal static string Drive_supports_quick_formatting { + get { + return ResourceManager.GetString("Drive_supports_quick_formatting", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports reading CD-R packet media. + /// + internal static string Drive_supports_reading_CD_R_packet_media { + get { + return ResourceManager.GetString("Drive_supports_reading_CD_R_packet_media", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports reading Media Key Block of CPRM. + /// + internal static string Drive_supports_reading_Media_Key_Block_of_CPRM { + get { + return ResourceManager.GetString("Drive_supports_reading_Media_Key_Block_of_CPRM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports reading the Drive Certificate. + /// + internal static string Drive_supports_reading_the_Drive_Certificate { + get { + return ResourceManager.GetString("Drive_supports_reading_the_Drive_Certificate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports reading/writing the Disc Write Protect PAC on BD-R/-RE media. + /// + internal static string Drive_supports_reading_writing_the_Disc_Write_Protect_PAC_on_BD_R_RE_media { + get { + return ResourceManager.GetString("Drive_supports_reading_writing_the_Disc_Write_Protect_PAC_on_BD_R_RE_media", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports recovering data from buffer. + /// + internal static string Drive_supports_recovering_data_from_buffer { + get { + return ResourceManager.GetString("Drive_supports_recovering_data_from_buffer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports reporting progress of format. + /// + internal static string Drive_supports_reporting_progress_of_format { + get { + return ResourceManager.GetString("Drive_supports_reporting_progress_of_format", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports restricted overwrite DVD-RW. + /// + internal static string Drive_supports_restricted_overwrite_DVD_RW { + get { + return ResourceManager.GetString("Drive_supports_restricted_overwrite_DVD_RW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports rewritable and removable media. + /// + internal static string Drive_supports_rewritable_and_removable_media { + get { + return ResourceManager.GetString("Drive_supports_rewritable_and_removable_media", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports SecurDisc. + /// + internal static string Drive_supports_SecurDisc { + get { + return ResourceManager.GetString("Drive_supports_SecurDisc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports separate volume per channel. + /// + internal static string Drive_supports_separate_volume_per_channel { + get { + return ResourceManager.GetString("Drive_supports_separate_volume_per_channel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports sequentially recorded DVD-R DL. + /// + internal static string Drive_supports_sequentially_recorded_DVD_R_DL { + get { + return ResourceManager.GetString("Drive_supports_sequentially_recorded_DVD_R_DL", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports sequentially recorded DVD-RW. + /// + internal static string Drive_supports_sequentially_recorded_DVD_RW { + get { + return ResourceManager.GetString("Drive_supports_sequentially_recorded_DVD_RW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports Set Minimum Performance with the SET STREAMING command. + /// + internal static string Drive_supports_Set_Minimum_Performance_with_the_SET_STREAMING_command { + get { + return ResourceManager.GetString("Drive_supports_Set_Minimum_Performance_with_the_SET_STREAMING_command", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports set/release of PWP status. + /// + internal static string Drive_supports_set_release_of_PWP_status { + get { + return ResourceManager.GetString("Drive_supports_set_release_of_PWP_status", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports S.M.A.R.T.. + /// + internal static string Drive_supports_SMART { + get { + return ResourceManager.GetString("Drive_supports_SMART", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports soft-sectoring format. + /// + internal static string Drive_supports_soft_sectoring_format { + get { + return ResourceManager.GetString("Drive_supports_soft_sectoring_format", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports stream recording. + /// + internal static string Drive_supports_stream_recording { + get { + return ResourceManager.GetString("Drive_supports_stream_recording", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports test writing. + /// + internal static string Drive_supports_test_writing { + get { + return ResourceManager.GetString("Drive_supports_test_writing", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports the BLANK command. + /// + internal static string Drive_supports_the_BLANK_command { + get { + return ResourceManager.GetString("Drive_supports_the_BLANK_command", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports the block bit in the READ BUFFER CAPACITY command. + /// + internal static string Drive_supports_the_block_bit_in_the_READ_BUFFER_CAPACITY_command { + get { + return ResourceManager.GetString("Drive_supports_the_block_bit_in_the_READ_BUFFER_CAPACITY_command", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports the DAP bit in the READ CD and READ CD MSF commands. + /// + internal static string Drive_supports_the_DAP_bit_in_the_READ_CD_and_READ_CD_MSF_commands { + get { + return ResourceManager.GetString("Drive_supports_the_DAP_bit_in_the_READ_CD_and_READ_CD_MSF_commands", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports the Group3 in Timeout & Protect mode page 1Dh. + /// + internal static string Drive_supports_the_Group3_in_Timeout_Protect_mode_page_1Dh { + get { + return ResourceManager.GetString("Drive_supports_the_Group3_in_Timeout_Protect_mode_page_1Dh", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports the Informational Exceptions Control mode page 1Ch. + /// + internal static string Drive_supports_the_Informational_Exceptions_Control_mode_page_1Ch { + get { + return ResourceManager.GetString("Drive_supports_the_Informational_Exceptions_Control_mode_page_1Ch", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports the SCAN command. + /// + internal static string Drive_supports_the_SCAN_command { + get { + return ResourceManager.GetString("Drive_supports_the_SCAN_command", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports the SET CD SPEED command. + /// + internal static string Drive_supports_the_SET_CD_SPEED_command { + get { + return ResourceManager.GetString("Drive_supports_the_SET_CD_SPEED_command", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports the SWPP bit of the Timeout and Protect mode page. + /// + internal static string Drive_supports_the_SWPP_bit_of_the_Timeout_and_Protect_mode_page { + get { + return ResourceManager.GetString("Drive_supports_the_SWPP_bit_of_the_Timeout_and_Protect_mode_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports the Trusted Computing Group Optical Security Subsystem Class. + /// + internal static string Drive_supports_the_Trusted_Computing_Group_Optical_Security_Subsystem_Class { + get { + return ResourceManager.GetString("Drive_supports_the_Trusted_Computing_Group_Optical_Security_Subsystem_Class", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports the Write Speed data of GET PERFORMANCE and the WRC field of SET STREAMING. + /// + internal static string Drive_supports_the_Write_Speed_data_of_GET_PERFORMANCE_and_the_WRC_field_of_SET_STREAMING { + get { + return ResourceManager.GetString("Drive_supports_the_Write_Speed_data_of_GET_PERFORMANCE_and_the_WRC_field_of_SET_S" + + "TREAMING", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports the Write Speed Performance Descriptor Blocks in the MMC mode page 2Ah. + /// + internal static string Drive_supports_the_Write_Speed_Performance_Descriptor_Blocks_in_the_MMC_mode_page_2Ah { + get { + return ResourceManager.GetString("Drive_supports_the_Write_Speed_Performance_Descriptor_Blocks_in_the_MMC_mode_page" + + "_2Ah", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports Timeout & Protect mode page 1Dh. + /// + internal static string Drive_supports_Timeout_Protect_mode_page_1Dh { + get { + return ResourceManager.GetString("Drive_supports_Timeout_Protect_mode_page_1Dh", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports validating the 5-bit Mode of the READ BUFFER and WRITE BUFFER commands. + /// + internal static string Drive_supports_validating_the_5_bit_Mode_of_the_READ_BUFFER_and_WRITE_BUFFER_commands { + get { + return ResourceManager.GetString("Drive_supports_validating_the_5_bit_Mode_of_the_READ_BUFFER_and_WRITE_BUFFER_comm" + + "ands", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports VCPS. + /// + internal static string Drive_supports_VCPS { + get { + return ResourceManager.GetString("Drive_supports_VCPS", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports write without verify requirement. + /// + internal static string Drive_supports_write_without_verify_requirement { + get { + return ResourceManager.GetString("Drive_supports_write_without_verify_requirement", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports writing at {0} Kbyte/sec. in CLV mode. + /// + internal static string Drive_supports_writing_at_0_Kbyte_sec_in_CLV_mode { + get { + return ResourceManager.GetString("Drive_supports_writing_at_0_Kbyte_sec_in_CLV_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports writing at {0} Kbyte/sec. in pure CAV mode. + /// + internal static string Drive_supports_writing_at_is_0_Kbyte_sec_in_pure_CAV_mode { + get { + return ResourceManager.GetString("Drive_supports_writing_at_is_0_Kbyte_sec_in_pure_CAV_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports writing DDCD-R. + /// + internal static string Drive_supports_writing_DDCD_R { + get { + return ResourceManager.GetString("Drive_supports_writing_DDCD_R", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports writing DDCD-RW. + /// + internal static string Drive_supports_writing_DDCD_RW { + get { + return ResourceManager.GetString("Drive_supports_writing_DDCD_RW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports writing DVD-R. + /// + internal static string Drive_supports_writing_DVD_R { + get { + return ResourceManager.GetString("Drive_supports_writing_DVD_R", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports writing DVD-R and DVD-R DL. + /// + internal static string Drive_supports_writing_DVD_R_and_DVD_R_DL { + get { + return ResourceManager.GetString("Drive_supports_writing_DVD_R_and_DVD_R_DL", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports writing DVD-R and DVD-RW. + /// + internal static string Drive_supports_writing_DVD_R_and_DVD_RW { + get { + return ResourceManager.GetString("Drive_supports_writing_DVD_R_and_DVD_RW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports writing DVD-R, DVD-RW and DVD-R DL. + /// + internal static string Drive_supports_writing_DVD_R_DVD_RW_and_DVD_R_DL { + get { + return ResourceManager.GetString("Drive_supports_writing_DVD_R_DVD_RW_and_DVD_R_DL", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports writing on an intermediate state session and quick formatting. + /// + internal static string Drive_supports_writing_on_an_intermediate_state_session_and_quick_formatting { + get { + return ResourceManager.GetString("Drive_supports_writing_on_an_intermediate_state_session_and_quick_formatting", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports writing the Write Inhibit DCB on DVD+RW media. + /// + internal static string Drive_supports_writing_the_Write_Inhibit_DCB_on_DVD_RW_media { + get { + return ResourceManager.GetString("Drive_supports_writing_the_Write_Inhibit_DCB_on_DVD_RW_media", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports writing with bus encryption. + /// + internal static string Drive_supports_writing_with_bus_encryption { + get { + return ResourceManager.GetString("Drive_supports_writing_with_bus_encryption", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive supports zero loss linking. + /// + internal static string Drive_supports_zero_loss_linking { + get { + return ResourceManager.GetString("Drive_supports_zero_loss_linking", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive's time is synchronized with a NTP source. + /// + internal static string Drive_time_is_synchronized_with_a_NTP_source { + get { + return ResourceManager.GetString("Drive_time_is_synchronized_with_a_NTP_source", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive's time is UTC. + /// + internal static string Drive_time_is_UTC { + get { + return ResourceManager.GetString("Drive_time_is_UTC", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive uses a Fibre Channel interface. + /// + internal static string Drive_uses_a_Fibre_Channel_interface { + get { + return ResourceManager.GetString("Drive_uses_a_Fibre_Channel_interface", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive uses a SCSI interface. + /// + internal static string Drive_uses_a_SCSI_interface { + get { + return ResourceManager.GetString("Drive_uses_a_SCSI_interface", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive uses a Serial ATAPI interface. + /// + internal static string Drive_uses_a_Serial_ATAPI_interface { + get { + return ResourceManager.GetString("Drive_uses_a_Serial_ATAPI_interface", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive uses a tray. + /// + internal static string Drive_uses_a_tray { + get { + return ResourceManager.GetString("Drive_uses_a_tray", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive uses a vendor unique interface. + /// + internal static string Drive_uses_a_vendor_unique_interface { + get { + return ResourceManager.GetString("Drive_uses_a_vendor_unique_interface", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive uses an ATAPI interface. + /// + internal static string Drive_uses_an_ATAPI_interface { + get { + return ResourceManager.GetString("Drive_uses_an_ATAPI_interface", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive uses an IEEE-1394 interface. + /// + internal static string Drive_uses_an_IEEE_1394_interface { + get { + return ResourceManager.GetString("Drive_uses_an_IEEE_1394_interface", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive uses an IEEE-1394A interface. + /// + internal static string Drive_uses_an_IEEE_1394A_interface { + get { + return ResourceManager.GetString("Drive_uses_an_IEEE_1394A_interface", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive uses an IEEE-1394B interface. + /// + internal static string Drive_uses_an_IEEE_1394B_interface { + get { + return ResourceManager.GetString("Drive_uses_an_IEEE_1394B_interface", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive uses an unknown interface with code {0}. + /// + internal static string Drive_uses_an_unknown_interface_with_code_0 { + get { + return ResourceManager.GetString("Drive_uses_an_unknown_interface_with_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive uses an unspecified physical interface. + /// + internal static string Drive_uses_an_unspecified_physical_interface { + get { + return ResourceManager.GetString("Drive_uses_an_unspecified_physical_interface", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive uses an USB interface. + /// + internal static string Drive_uses_an_USB_interface { + get { + return ResourceManager.GetString("Drive_uses_an_USB_interface", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive uses default compression. + /// + internal static string Drive_uses_default_compression { + get { + return ResourceManager.GetString("Drive_uses_default_compression", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive uses media caddy. + /// + internal static string Drive_uses_media_caddy { + get { + return ResourceManager.GetString("Drive_uses_media_caddy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive uses unknown compression {0}. + /// + internal static string Drive_uses_unknown_compression_0 { + get { + return ResourceManager.GetString("Drive_uses_unknown_compression_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive uses unknown loading mechanism type {0}. + /// + internal static string Drive_uses_unknown_loading_mechanism_type__0_ { + get { + return ResourceManager.GetString("Drive_uses_unknown_loading_mechanism_type__0_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will abort when a writing error is detected. + /// + internal static string Drive_will_abort_when_a_writing_error_is_detected { + get { + return ResourceManager.GetString("Drive_will_abort_when_a_writing_error_is_detected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will delay {0} ms before buffered data is forcefully written to the medium even before buffer is full. + /// + internal static string Drive_will_delay_0_ms_before_buffered_data_is_forcefully_written_to_the_medium_even_before_buffer_is_full { + get { + return ResourceManager.GetString("Drive_will_delay_0_ms_before_buffered_data_is_forcefully_written_to_the_medium_ev" + + "en_before_buffer_is_full", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will do nothing on WORM tampered medium. + /// + internal static string Drive_will_do_nothing_on_WORM_tampered_medium { + get { + return ResourceManager.GetString("Drive_will_do_nothing_on_WORM_tampered_medium", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will eject cleaning cartridges on error. + /// + internal static string Drive_will_eject_cleaning_cartridges_on_error { + get { + return ResourceManager.GetString("Drive_will_eject_cleaning_cartridges_on_error", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will eject data cartridges on error. + /// + internal static string Drive_will_eject_data_cartridges_on_error { + get { + return ResourceManager.GetString("Drive_will_eject_data_cartridges_on_error", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will eject firmware cartridges on error. + /// + internal static string Drive_will_eject_firmware_cartridges_on_error { + get { + return ResourceManager.GetString("Drive_will_eject_firmware_cartridges_on_error", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will employ a maximum of {0} ms to recover data. + /// + internal static string Drive_will_employ_a_maximum_of_0_ms_to_recover_data { + get { + return ResourceManager.GetString("Drive_will_employ_a_maximum_of_0_ms_to_recover_data", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will flush and position itself on a LUN or target reset. + /// + internal static string Drive_will_flush_and_position_itself_on_a_LUN_or_target_reset { + get { + return ResourceManager.GetString("Drive_will_flush_and_position_itself_on_a_LUN_or_target_reset", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will maintain position on a LUN or target reset. + /// + internal static string Drive_will_maintain_position_on_a_LUN_or_target_reset { + get { + return ResourceManager.GetString("Drive_will_maintain_position_on_a_LUN_or_target_reset", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will not accept downlevel firmware via an FMR tape. + /// + internal static string Drive_will_not_accept_downlevel_firmware_via_an_FMR_tape { + get { + return ResourceManager.GetString("Drive_will_not_accept_downlevel_firmware_via_an_FMR_tape", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will not exit emulation automatically. + /// + internal static string Drive_will_not_exit_emulation_automatically { + get { + return ResourceManager.GetString("Drive_will_not_exit_emulation_automatically", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will only record on the OSSC Disc Format. + /// + internal static string Drive_will_only_record_on_the_OSSC_Disc_Format { + get { + return ResourceManager.GetString("Drive_will_only_record_on_the_OSSC_Disc_Format", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will only respond to commands if it has received a reservation. + /// + internal static string Drive_will_only_respond_to_commands_if_it_has_received_a_reservation { + get { + return ResourceManager.GetString("Drive_will_only_respond_to_commands_if_it_has_received_a_reservation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will periodically request cleaning. + /// + internal static string Drive_will_periodically_request_cleaning { + get { + return ResourceManager.GetString("Drive_will_periodically_request_cleaning", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will pre-read until buffer is full. + /// + internal static string Drive_will_pre_read_until_buffer_is_full { + get { + return ResourceManager.GetString("Drive_will_pre_read_until_buffer_is_full", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will pre-read until one filemark is detected. + /// + internal static string Drive_will_pre_read_until_one_filemark_is_detected { + get { + return ResourceManager.GetString("Drive_will_pre_read_until_one_filemark_is_detected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will pre-read until three filemark is detected. + /// + internal static string Drive_will_pre_read_until_three_filemark_is_detected { + get { + return ResourceManager.GetString("Drive_will_pre_read_until_three_filemark_is_detected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will pre-read until two filemark is detected. + /// + internal static string Drive_will_pre_read_until_two_filemark_is_detected { + get { + return ResourceManager.GetString("Drive_will_pre_read_until_two_filemark_is_detected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will remain in same status 1 minute after a seek, read or write operation. + /// + internal static string Drive_will_remain_in_same_status_1_minute_after_a_seek_read_or_write_operation { + get { + return ResourceManager.GetString("Drive_will_remain_in_same_status_1_minute_after_a_seek_read_or_write_operation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will remain in same status 1 second after a seek, read or write operation. + /// + internal static string Drive_will_remain_in_same_status_1_second_after_a_seek_read_or_write_operation { + get { + return ResourceManager.GetString("Drive_will_remain_in_same_status_1_second_after_a_seek_read_or_write_operation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will remain in same status 125 ms after a seek, read or write operation. + /// + internal static string Drive_will_remain_in_same_status_125_ms_after_a_seek_read_or_write_operation { + get { + return ResourceManager.GetString("Drive_will_remain_in_same_status_125_ms_after_a_seek_read_or_write_operation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will remain in same status 16 minutes after a seek, read or write operation. + /// + internal static string Drive_will_remain_in_same_status_16_minutes_after_a_seek_read_or_write_operation { + get { + return ResourceManager.GetString("Drive_will_remain_in_same_status_16_minutes_after_a_seek_read_or_write_operation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will remain in same status 16 seconds after a seek, read or write operation. + /// + internal static string Drive_will_remain_in_same_status_16_seconds_after_a_seek_read_or_write_operation { + get { + return ResourceManager.GetString("Drive_will_remain_in_same_status_16_seconds_after_a_seek_read_or_write_operation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will remain in same status 2 minutes after a seek, read or write operation. + /// + internal static string Drive_will_remain_in_same_status_2_minutes_after_a_seek_read_or_write_operation { + get { + return ResourceManager.GetString("Drive_will_remain_in_same_status_2_minutes_after_a_seek_read_or_write_operation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will remain in same status 2 seconds after a seek, read or write operation. + /// + internal static string Drive_will_remain_in_same_status_2_seconds_after_a_seek_read_or_write_operation { + get { + return ResourceManager.GetString("Drive_will_remain_in_same_status_2_seconds_after_a_seek_read_or_write_operation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will remain in same status 250 ms after a seek, read or write operation. + /// + internal static string Drive_will_remain_in_same_status_250_ms_after_a_seek_read_or_write_operation { + get { + return ResourceManager.GetString("Drive_will_remain_in_same_status_250_ms_after_a_seek_read_or_write_operation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will remain in same status 32 minutes after a seek, read or write operation. + /// + internal static string Drive_will_remain_in_same_status_32_minutes_after_a_seek_read_or_write_operation { + get { + return ResourceManager.GetString("Drive_will_remain_in_same_status_32_minutes_after_a_seek_read_or_write_operation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will remain in same status 32 seconds after a seek, read or write operation. + /// + internal static string Drive_will_remain_in_same_status_32_seconds_after_a_seek_read_or_write_operation { + get { + return ResourceManager.GetString("Drive_will_remain_in_same_status_32_seconds_after_a_seek_read_or_write_operation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will remain in same status 4 minutes after a seek, read or write operation. + /// + internal static string Drive_will_remain_in_same_status_4_minutes_after_a_seek_read_or_write_operation { + get { + return ResourceManager.GetString("Drive_will_remain_in_same_status_4_minutes_after_a_seek_read_or_write_operation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will remain in same status 4 seconds after a seek, read or write operation. + /// + internal static string Drive_will_remain_in_same_status_4_seconds_after_a_seek_read_or_write_operation { + get { + return ResourceManager.GetString("Drive_will_remain_in_same_status_4_seconds_after_a_seek_read_or_write_operation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will remain in same status 500 ms after a seek, read or write operation. + /// + internal static string Drive_will_remain_in_same_status_500_ms_after_a_seek_read_or_write_operation { + get { + return ResourceManager.GetString("Drive_will_remain_in_same_status_500_ms_after_a_seek_read_or_write_operation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will remain in same status 8 minutes after a seek, read or write operation. + /// + internal static string Drive_will_remain_in_same_status_8_minutes_after_a_seek_read_or_write_operation { + get { + return ResourceManager.GetString("Drive_will_remain_in_same_status_8_minutes_after_a_seek_read_or_write_operation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will remain in same status 8 seconds after a seek, read or write operation. + /// + internal static string Drive_will_remain_in_same_status_8_seconds_after_a_seek_read_or_write_operation { + get { + return ResourceManager.GetString("Drive_will_remain_in_same_status_8_seconds_after_a_seek_read_or_write_operation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will remain in same status a vendor-specified time after a seek, read or write operation. + /// + internal static string Drive_will_remain_in_same_status_a_vendor_specified_time_after_a_seek_read_or_write_operation { + get { + return ResourceManager.GetString("Drive_will_remain_in_same_status_a_vendor_specified_time_after_a_seek_read_or_wri" + + "te_operation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will remain in track hold state 1 minute after a seek or read. + /// + internal static string Drive_will_remain_in_track_hold_state_1_minute_after_a_seek_or_read { + get { + return ResourceManager.GetString("Drive_will_remain_in_track_hold_state_1_minute_after_a_seek_or_read", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will remain in track hold state 1 second after a seek or read. + /// + internal static string Drive_will_remain_in_track_hold_state_1_second_after_a_seek_or_read { + get { + return ResourceManager.GetString("Drive_will_remain_in_track_hold_state_1_second_after_a_seek_or_read", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will remain in track hold state 125 ms after a seek or read. + /// + internal static string Drive_will_remain_in_track_hold_state_125_ms_after_a_seek_or_read { + get { + return ResourceManager.GetString("Drive_will_remain_in_track_hold_state_125_ms_after_a_seek_or_read", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will remain in track hold state 16 minutes after a seek or read. + /// + internal static string Drive_will_remain_in_track_hold_state_16_minutes_after_a_seek_or_read { + get { + return ResourceManager.GetString("Drive_will_remain_in_track_hold_state_16_minutes_after_a_seek_or_read", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will remain in track hold state 16 seconds after a seek or read. + /// + internal static string Drive_will_remain_in_track_hold_state_16_seconds_after_a_seek_or_read { + get { + return ResourceManager.GetString("Drive_will_remain_in_track_hold_state_16_seconds_after_a_seek_or_read", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will remain in track hold state 2 minutes after a seek or read. + /// + internal static string Drive_will_remain_in_track_hold_state_2_minutes_after_a_seek_or_read { + get { + return ResourceManager.GetString("Drive_will_remain_in_track_hold_state_2_minutes_after_a_seek_or_read", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will remain in track hold state 2 seconds after a seek or read. + /// + internal static string Drive_will_remain_in_track_hold_state_2_seconds_after_a_seek_or_read { + get { + return ResourceManager.GetString("Drive_will_remain_in_track_hold_state_2_seconds_after_a_seek_or_read", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will remain in track hold state 250 ms after a seek or read. + /// + internal static string Drive_will_remain_in_track_hold_state_250_ms_after_a_seek_or_read { + get { + return ResourceManager.GetString("Drive_will_remain_in_track_hold_state_250_ms_after_a_seek_or_read", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will remain in track hold state 32 minutes after a seek or read. + /// + internal static string Drive_will_remain_in_track_hold_state_32_minutes_after_a_seek_or_read { + get { + return ResourceManager.GetString("Drive_will_remain_in_track_hold_state_32_minutes_after_a_seek_or_read", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will remain in track hold state 32 seconds after a seek or read. + /// + internal static string Drive_will_remain_in_track_hold_state_32_seconds_after_a_seek_or_read { + get { + return ResourceManager.GetString("Drive_will_remain_in_track_hold_state_32_seconds_after_a_seek_or_read", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will remain in track hold state 4 minutes after a seek or read. + /// + internal static string Drive_will_remain_in_track_hold_state_4_minutes_after_a_seek_or_read { + get { + return ResourceManager.GetString("Drive_will_remain_in_track_hold_state_4_minutes_after_a_seek_or_read", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will remain in track hold state 4 seconds after a seek or read. + /// + internal static string Drive_will_remain_in_track_hold_state_4_seconds_after_a_seek_or_read { + get { + return ResourceManager.GetString("Drive_will_remain_in_track_hold_state_4_seconds_after_a_seek_or_read", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will remain in track hold state 500 ms after a seek or read. + /// + internal static string Drive_will_remain_in_track_hold_state_500_ms_after_a_seek_or_read { + get { + return ResourceManager.GetString("Drive_will_remain_in_track_hold_state_500_ms_after_a_seek_or_read", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will remain in track hold state 8 minutes after a seek or read. + /// + internal static string Drive_will_remain_in_track_hold_state_8_minutes_after_a_seek_or_read { + get { + return ResourceManager.GetString("Drive_will_remain_in_track_hold_state_8_minutes_after_a_seek_or_read", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will remain in track hold state 8 seconds after a seek or read. + /// + internal static string Drive_will_remain_in_track_hold_state_8_seconds_after_a_seek_or_read { + get { + return ResourceManager.GetString("Drive_will_remain_in_track_hold_state_8_seconds_after_a_seek_or_read", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will remain in track hold state a vendor-specified time after a seek or read. + /// + internal static string Drive_will_remain_in_track_hold_state_a_vendor_specified_time_after_a_seek_or_read { + get { + return ResourceManager.GetString("Drive_will_remain_in_track_hold_state_a_vendor_specified_time_after_a_seek_or_rea" + + "d", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will repeat read operations {0} times. + /// + internal static string Drive_will_repeat_read_operations_0_times { + get { + return ResourceManager.GetString("Drive_will_repeat_read_operations_0_times", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will repeat verify operations {0} times. + /// + internal static string Drive_will_repeat_verify_operations_0_times { + get { + return ResourceManager.GetString("Drive_will_repeat_verify_operations_0_times", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will repeat write operations {0} times. + /// + internal static string Drive_will_repeat_write_operations_0_times { + get { + return ResourceManager.GetString("Drive_will_repeat_write_operations_0_times", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will report background self-test errors. + /// + internal static string Drive_will_report_background_self_test_errors { + get { + return ResourceManager.GetString("Drive_will_report_background_self_test_errors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will respond to SCSI ID {0} on Port A enabling. + /// + internal static string Drive_will_respond_to_SCSI_ID_0_on_Port_A_enabling { + get { + return ResourceManager.GetString("Drive_will_respond_to_SCSI_ID_0_on_Port_A_enabling", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will return CHECK CONDITION on WORM tampered medium. + /// + internal static string Drive_will_return_CHECK_CONDITION_on_WORM_tampered_medium { + get { + return ResourceManager.GetString("Drive_will_return_CHECK_CONDITION_on_WORM_tampered_medium", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will return from playback command immediately. + /// + internal static string Drive_will_return_from_playback_command_immediately { + get { + return ResourceManager.GetString("Drive_will_return_from_playback_command_immediately", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will return from playback command when playback ends. + /// + internal static string Drive_will_return_from_playback_command_when_playback_ends { + get { + return ResourceManager.GetString("Drive_will_return_from_playback_command_when_playback_ends", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will set CHECK CONDITION when cleaning is needed. + /// + internal static string Drive_will_set_Check_Condition_when_cleaning_is_needed { + get { + return ResourceManager.GetString("Drive_will_set_Check_Condition_when_cleaning_is_needed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will set CHECK CONDITION when the criteria for Dead Media is met. + /// + internal static string Drive_will_set_Check_Condition_when_the_criteria_for_Dead_Media_is_met { + get { + return ResourceManager.GetString("Drive_will_set_Check_Condition_when_the_criteria_for_Dead_Media_is_met", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will stop playback on track end. + /// + internal static string Drive_will_stop_playback_on_track_end { + get { + return ResourceManager.GetString("Drive_will_stop_playback_on_track_end", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will synchronize buffer to medium on early warnings. + /// + internal static string Drive_will_synchronize_buffer_to_medium_on_early_warnings { + get { + return ResourceManager.GetString("Drive_will_synchronize_buffer_to_medium_on_early_warnings", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will transfer the entire requested length without delaying to perform error recovery. + /// + internal static string Drive_will_transfer_the_entire_requested_length_without_delaying_to_perform_error_recovery { + get { + return ResourceManager.GetString("Drive_will_transfer_the_entire_requested_length_without_delaying_to_perform_error" + + "_recovery", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive will use the most expedient form of error recovery first. + /// + internal static string Drive_will_use_the_most_expedient_form_of_error_recovery_first { + get { + return ResourceManager.GetString("Drive_will_use_the_most_expedient_form_of_error_recovery_first", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DSN feature set is supported. + /// + internal static string DSN_feature_set_is_supported { + get { + return ResourceManager.GetString("DSN_feature_set_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DSN feature set is supported and enabled. + /// + internal static string DSN_feature_set_is_supported_and_enabled { + get { + return ResourceManager.GetString("DSN_feature_set_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DT1825 is supported. + /// + internal static string DT1825_is_supported { + get { + return ResourceManager.GetString("DT1825_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DT1825 is supported and enabled. + /// + internal static string DT1825_is_supported_and_enabled { + get { + return ResourceManager.GetString("DT1825_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Dye is organic. + /// + internal static string Dye_is_organic { + get { + return ResourceManager.GetString("Dye_is_organic", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Dye is phase change. + /// + internal static string Dye_is_phase_change { + get { + return ResourceManager.GetString("Dye_is_phase_change", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Each channel can be muted independently. + /// + internal static string Each_channel_can_be_muted_independently { + get { + return ResourceManager.GetString("Each_channel_can_be_muted_independently", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Each channel's volume can be controlled independently. + /// + internal static string Each_channel_s_volume_can_be_controlled_independently { + get { + return ResourceManager.GetString("Each_channel_s_volume_can_be_controlled_independently", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Each minute has {0} seconds. + /// + internal static string Each_minute_has_0_seconds { + get { + return ResourceManager.GetString("Each_minute_has_0_seconds", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Each second has {0} frames. + /// + internal static string Each_second_has_0_frames { + get { + return ResourceManager.GetString("Each_second_has_0_frames", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Each step pulse is {0} ms. + /// + internal static string Each_step_pulse_is_0_ms { + get { + return ResourceManager.GetString("Each_step_pulse_is_0_ms", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ECMA TC17: 8 mm Magnetic Tape Cassette, 1789 bpmm, RLL. + /// + internal static string ECMA_TC17 { + get { + return ResourceManager.GetString("ECMA_TC17", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ECMA-46 & ANSI X3.56-1986: 6.30 mm Magnetic Tape Cartridge, Phase Encoding, 63 bpmm. + /// + internal static string ECMA46 { + get { + return ResourceManager.GetString("ECMA46", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ECMA-62 & ANSI X3.22-1983: 12.7 mm 9-Track Magnetic Tape, 32 ftpmm, NRZI, 32 cpmm. + /// + internal static string ECMA62 { + get { + return ResourceManager.GetString("ECMA62", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ECMA-62 & ANSI X3.54-1986: 12.7 mm 9-Track Magnetic Tape, 356 ftpmm, NRZI, 245 cpmm GCR. + /// + internal static string ECMA62_GCR { + get { + return ResourceManager.GetString("ECMA62_GCR", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ECMA-62 & ANSI X3.39-1986: 12.7 mm 9-Track Magnetic Tape, 126 ftpmm, Phase Encoding, 63 cpmm. + /// + internal static string ECMA62_Phase { + get { + return ResourceManager.GetString("ECMA62_Phase", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ECMA-79 & ANSI X3.116-1986: 6.30 mm Magnetic Tape Cartridge, 252 ftpmm, MFM. + /// + internal static string ECMA79 { + get { + return ResourceManager.GetString("ECMA79", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ECMA-98: 6.30 mm Magnetic Tape Cartridge, NRZI, 394 ftpmm. + /// + internal static string ECMA98 { + get { + return ResourceManager.GetString("ECMA98", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to EEPROM format version: {0}.{1}. + /// + internal static string EEPROM_format_version_0_1 { + get { + return ResourceManager.GetString("EEPROM_format_version_0_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enclosure services device. + /// + internal static string Enclosure_services_device { + get { + return ResourceManager.GetString("Enclosure_services_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to End of file.. + /// + internal static string End_of_file { + get { + return ResourceManager.GetString("End_of_file", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to End-of-medium/partition found. + /// + internal static string End_of_medium_partition_found { + get { + return ResourceManager.GetString("End_of_medium_partition_found", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to End of record.. + /// + internal static string End_of_record { + get { + return ResourceManager.GetString("End_of_record", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ending time for interval that should be skipped: {0:D2}:{1:D2}:{2:D2}. + /// + internal static string Ending_time_for_interval_that_should_be_skipped_0_1_2 { + get { + return ResourceManager.GetString("Ending_time_for_interval_that_should_be_skipped_0_1_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Epilogue {0:X2}{1:X2}{2:X2}. + /// + internal static string Epilogue_0_1_2 { + get { + return ResourceManager.GetString("Epilogue_0_1_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Erase block: {0} bytes. + /// + internal static string Erase_block_0_bytes { + get { + return ResourceManager.GetString("Erase_block_0_bytes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Erased memory range shall be '{0}'.. + /// + internal static string Erased_memory_range_shall_be_0 { + get { + return ResourceManager.GetString("Erased_memory_range_shall_be_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Erasing power ratio is not specified. + /// + internal static string Erasing_power_ratio_is_not_specified { + get { + return ResourceManager.GetString("Erasing_power_ratio_is_not_specified", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error class {0} type {1}. + /// + internal static string Error_class_0_type_1 { + get { + return ResourceManager.GetString("Error_class_0_type_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error class {0} type {1} happened on block {2}. + /// + internal static string Error_class_0_type_1_happened_on_block_2 { + get { + return ResourceManager.GetString("Error_class_0_type_1_happened_on_block_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error correction is disabled. + /// + internal static string Error_correction_is_disabled { + get { + return ResourceManager.GetString("Error_correction_is_disabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Europe PAL.. + /// + internal static string Europe_PAL { + get { + return ResourceManager.GetString("Europe_PAL", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to EXB-8200. + /// + internal static string EXB8200 { + get { + return ResourceManager.GetString("EXB8200", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to EXB-8200 compressed. + /// + internal static string EXB8200_compressed { + get { + return ResourceManager.GetString("EXB8200_compressed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to EXB-8500. + /// + internal static string EXB8500 { + get { + return ResourceManager.GetString("EXB8500", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to EXB-8500 compressed. + /// + internal static string EXB8500_compressed { + get { + return ResourceManager.GetString("EXB8500_compressed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Expected CD ATIP size (32 bytes) is not received size ({0} bytes), not decoding. + /// + internal static string Expected_CD_ATIP_size_32_bytes_is_not_received_size_0_bytes_not_decoding { + get { + return ResourceManager.GetString("Expected_CD_ATIP_size_32_bytes_is_not_received_size_0_bytes_not_decoding", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Expected CD PMA size ({0} bytes) is not received size ({1} bytes), not decoding. + /// + internal static string Expected_CD_PMA_size_0_bytes_is_not_received_size_1_bytes_not_decoding { + get { + return ResourceManager.GetString("Expected_CD_PMA_size_0_bytes_is_not_received_size_1_bytes_not_decoding", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Expected CD-TEXT size ({0} bytes) is not received size ({1} bytes), not decoding. + /// + internal static string Expected_CD_TEXT_size_0_bytes_is_not_received_size_1_bytes_not_decoding { + get { + return ResourceManager.GetString("Expected_CD_TEXT_size_0_bytes_is_not_received_size_1_bytes_not_decoding", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Expected CD TOC size ({0} bytes) is not received size ({1} bytes), not decoding. + /// + internal static string Expected_CD_TOC_size_0_bytes_is_not_received_size_1_bytes_not_decoding { + get { + return ResourceManager.GetString("Expected_CD_TOC_size_0_bytes_is_not_received_size_1_bytes_not_decoding", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Expected CDFullTOC size ({0} bytes) is not received size ({1} bytes), not decoding. + /// + internal static string Expected_CDFullTOC_size_0_bytes_is_not_received_size_1_bytes_not_decoding { + get { + return ResourceManager.GetString("Expected_CDFullTOC_size_0_bytes_is_not_received_size_1_bytes_not_decoding", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Expected CDSessionInfo size ({0} bytes) is not received size ({1} bytes), not decoding. + /// + internal static string Expected_CDSessionInfo_size_0_bytes_is_not_received_size_1_bytes_not_decoding { + get { + return ResourceManager.GetString("Expected_CDSessionInfo_size_0_bytes_is_not_received_size_1_bytes_not_decoding", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Extended Contingent Allegiance is enabled. + /// + internal static string Extended_Contingent_Allegiance_is_enabled { + get { + return ResourceManager.GetString("Extended_Contingent_Allegiance_is_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Extended Power Conditions are supported. + /// + internal static string Extended_Power_Conditions_are_supported { + get { + return ResourceManager.GetString("Extended_Power_Conditions_are_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Extended Power Conditions are supported and enabled. + /// + internal static string Extended_Power_Conditions_are_supported_and_enabled { + get { + return ResourceManager.GetString("Extended_Power_Conditions_are_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Extended self-test takes {0} to complete. + /// + internal static string Extended_self_test_takes_0_to_complete { + get { + return ResourceManager.GetString("Extended_self_test_takes_0_to_complete", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Extended Status Reporting is supported. + /// + internal static string Extended_Status_Reporting_is_supported { + get { + return ResourceManager.GetString("Extended_Status_Reporting_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Extended Status Reporting is supported and enabled. + /// + internal static string Extended_Status_Reporting_is_supported_and_enabled { + get { + return ResourceManager.GetString("Extended_Status_Reporting_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Extent starts at PSN {0:X6}h and ends at PSN {1:X6}h. + /// + internal static string Extent_starts_at_PSN_0_and_ends_at_PSN_1 { + get { + return ResourceManager.GetString("Extent_starts_at_PSN_0_and_ends_at_PSN_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Factory test code 1 is disabled. + /// + internal static string Factory_test_code_1_is_disabled { + get { + return ResourceManager.GetString("Factory_test_code_1_is_disabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Factory test code 2 is disabled. + /// + internal static string Factory_test_code_2_is_disabled { + get { + return ResourceManager.GetString("Factory_test_code_2_is_disabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Factory test code is disabled. + /// + internal static string Factory_test_code_is_disabled { + get { + return ResourceManager.GetString("Factory_test_code_is_disabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can eject media. + /// + internal static string Features_Prettify_0003_Drive_can_eject_media { + get { + return ResourceManager.GetString("Features_Prettify_0003_Drive_can_eject_media", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can load media. + /// + internal static string Features_Prettify_0003_Drive_can_load_media { + get { + return ResourceManager.GetString("Features_Prettify_0003_Drive_can_load_media", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can lock media. + /// + internal static string Features_Prettify_0003_Drive_can_lock_media { + get { + return ResourceManager.GetString("Features_Prettify_0003_Drive_can_lock_media", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive is a changer using cartridges. + /// + internal static string Features_Prettify_0003_Drive_is_a_changer_using_cartridges { + get { + return ResourceManager.GetString("Features_Prettify_0003_Drive_is_a_changer_using_cartridges", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive is a changer with individually changeable discs. + /// + internal static string Features_Prettify_0003_Drive_is_a_changer_with_individually_changeable_discs { + get { + return ResourceManager.GetString("Features_Prettify_0003_Drive_is_a_changer_with_individually_changeable_discs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive is pop-up. + /// + internal static string Features_Prettify_0003_Drive_is_pop_up { + get { + return ResourceManager.GetString("Features_Prettify_0003_Drive_is_pop_up", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive power ups locked. + /// + internal static string Features_Prettify_0003_Drive_power_ups_locked { + get { + return ResourceManager.GetString("Features_Prettify_0003_Drive_power_ups_locked", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive reports Device Busy Class events during medium loading/unloading. + /// + internal static string Features_Prettify_0003_Drive_reports_Device_Busy_Class_events_during_medium_loading_unloading { + get { + return ResourceManager.GetString("Features_Prettify_0003_Drive_reports_Device_Busy_Class_events_during_medium_loadi" + + "ng_unloading", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive uses a tray. + /// + internal static string Features_Prettify_0003_Drive_uses_a_tray { + get { + return ResourceManager.GetString("Features_Prettify_0003_Drive_uses_a_tray", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive uses media caddy. + /// + internal static string Features_Prettify_0003_Drive_uses_media_caddy { + get { + return ResourceManager.GetString("Features_Prettify_0003_Drive_uses_media_caddy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive uses unknown loading mechanism type {0}. + /// + internal static string Features_Prettify_0003_Drive_uses_unknown_loading_mechanism_type_0 { + get { + return ResourceManager.GetString("Features_Prettify_0003_Drive_uses_unknown_loading_mechanism_type_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MMC Removable Medium:. + /// + internal static string Features_Prettify_0003_MMC_Removable_Medium { + get { + return ResourceManager.GetString("Features_Prettify_0003_MMC_Removable_Medium", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive can read DVD+R DL. + /// + internal static string Features_Prettify_003B_Drive_can_read_DVD_Plus_R_DL { + get { + return ResourceManager.GetString("Features_Prettify_003B_Drive_can_read_DVD_Plus_R_DL", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Drive is able to detect and report defective writable unit and behave accordingly. + /// + internal static string Features_Prettify_0042_Drive_is_able_to_detect_and_report_defective_writable_unit_and_behave_accordingly { + get { + return ResourceManager.GetString("Features_Prettify_0042_Drive_is_able_to_detect_and_report_defective_writable_unit" + + "_and_behave_accordingly", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Fence behaviour is normal. + /// + internal static string Fence_behaviour_is_normal { + get { + return ResourceManager.GetString("Fence_behaviour_is_normal", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Fibre Channel. + /// + internal static string Fibre_Channel { + get { + return ResourceManager.GetString("Fibre_Channel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to File number: {0}. + /// + internal static string File_number_0 { + get { + return ResourceManager.GetString("File_number_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Filemark or setmark found. + /// + internal static string Filemark_or_setmark_found { + get { + return ResourceManager.GetString("Filemark_or_setmark_found", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Finished sector at {0}. + /// + internal static string Finished_sector_at_0 { + get { + return ResourceManager.GetString("Finished_sector_at_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Firmware cartridge inserted. + /// + internal static string Firmware_cartridge_inserted { + get { + return ResourceManager.GetString("Firmware_cartridge_inserted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Firmware personality: {0}. + /// + internal static string Firmware_personality_0 { + get { + return ResourceManager.GetString("Firmware_personality_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Firmware sub-personality: {0}. + /// + internal static string Firmware_sub_personality_0 { + get { + return ResourceManager.GetString("Firmware_sub_personality_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Firmware updates are permanently disabled. + /// + internal static string Firmware_updates_are_permanently_disabled { + get { + return ResourceManager.GetString("Firmware_updates_are_permanently_disabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Firmware version: {0}. + /// + internal static string Firmware_version_0 { + get { + return ResourceManager.GetString("Firmware_version_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Firmware version: {0}.{1}. + /// + internal static string Firmware_version_0_1 { + get { + return ResourceManager.GetString("Firmware_version_0_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to First address unit number of data zone in this layer: {0}. + /// + internal static string First_address_unit_number_of_data_zone_in_this_layer_0 { + get { + return ResourceManager.GetString("First_address_unit_number_of_data_zone_in_this_layer_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to First complete session number: {0}. + /// + internal static string First_complete_session_number_0 { + get { + return ResourceManager.GetString("First_complete_session_number_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to First PSN of Defect List: 0x{0:X8}. + /// + internal static string First_PSN_of_Defect_List_0 { + get { + return ResourceManager.GetString("First_PSN_of_Defect_List_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to First PSN of Drive Area: 0x{0:X8}. + /// + internal static string First_PSN_of_Drive_Area_0 { + get { + return ResourceManager.GetString("First_PSN_of_Drive_Area_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to First run-in block. + /// + internal static string First_run_in_block { + get { + return ResourceManager.GetString("First_run_in_block", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to First run-out block. + /// + internal static string First_run_out_block { + get { + return ResourceManager.GetString("First_run_out_block", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to First track in last session is track {0}. + /// + internal static string First_track_in_last_session_is_track_0 { + get { + return ResourceManager.GetString("First_track_in_last_session_is_track_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to First track number: {0} (. + /// + internal static string First_track_number_0_open_parenthesis { + get { + return ResourceManager.GetString("First_track_number_0_open_parenthesis", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to First track number in first complete session: {0}. + /// + internal static string First_track_number_in_first_complete_session_0 { + get { + return ResourceManager.GetString("First_track_number_in_first_complete_session_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to First track number in last complete session: {0}. + /// + internal static string First_track_number_in_last_complete_session_0 { + get { + return ResourceManager.GetString("First_track_number_in_last_complete_session_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to First track on disc is track {0}. + /// + internal static string First_track_on_disc_is_track_0 { + get { + return ResourceManager.GetString("First_track_on_disc_is_track_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to First video track number: {0}. + /// + internal static string First_video_track_number_0 { + get { + return ResourceManager.GetString("First_video_track_number_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to FLUSH CACHE EXT is supported. + /// + internal static string FLUSH_CACHE_EXT_is_supported { + get { + return ResourceManager.GetString("FLUSH_CACHE_EXT_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to FLUSH CACHE EXT is supported and enabled. + /// + internal static string FLUSH_CACHE_EXT_is_supported_and_enabled { + get { + return ResourceManager.GetString("FLUSH_CACHE_EXT_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to FLUSH CACHE is supported. + /// + internal static string FLUSH_CACHE_is_supported { + get { + return ResourceManager.GetString("FLUSH_CACHE_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to FLUSH CACHE is supported and enabled. + /// + internal static string FLUSH_CACHE_is_supported_and_enabled { + get { + return ResourceManager.GetString("FLUSH_CACHE_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Form 1.. + /// + internal static string Form_1 { + get { + return ResourceManager.GetString("Form_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Form 2.. + /// + internal static string Form_2 { + get { + return ResourceManager.GetString("Form_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Format progress {0:P}. + /// + internal static string Format_progress_0 { + get { + return ResourceManager.GetString("Format_progress_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Format speed tolerance gap is required. + /// + internal static string Format_speed_tolerance_gap_is_required { + get { + return ResourceManager.GetString("Format_speed_tolerance_gap_is_required", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Formatting in progress.. + /// + internal static string Formatting_in_progress { + get { + return ResourceManager.GetString("Formatting_in_progress", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Formatting is only using partial certification. + /// + internal static string Formatting_is_only_using_partial_certification { + get { + return ResourceManager.GetString("Formatting_is_only_using_partial_certification", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Found incorrect Blu-ray BCA size ({0} bytes). + /// + internal static string Found_incorrect_Blu_ray_BCA_size_0_bytes { + get { + return ResourceManager.GetString("Found_incorrect_Blu_ray_BCA_size_0_bytes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Found incorrect Blu-ray Cartridge Status size ({0} bytes). + /// + internal static string Found_incorrect_Blu_ray_Cartridge_Status_size_0_bytes { + get { + return ResourceManager.GetString("Found_incorrect_Blu_ray_Cartridge_Status_size_0_bytes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Found incorrect Blu-ray Disc Information size ({0} bytes). + /// + internal static string Found_incorrect_Blu_ray_Disc_Information_size_0_bytes { + get { + return ResourceManager.GetString("Found_incorrect_Blu_ray_Disc_Information_size_0_bytes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Found incorrect DDS signature (0x{0:X4}). + /// + internal static string Found_incorrect_DDS_signature_0 { + get { + return ResourceManager.GetString("Found_incorrect_DDS_signature_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Found unknown disc type identifier "{0}". + /// + internal static string Found_unknown_disc_type_identifier_0 { + get { + return ResourceManager.GetString("Found_unknown_disc_type_identifier_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Fourth run-in block. + /// + internal static string Fourth_run_in_block { + get { + return ResourceManager.GetString("Fourth_run_in_block", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Free-fall control feature set is supported. + /// + internal static string Free_fall_control_feature_set_is_supported { + get { + return ResourceManager.GetString("Free_fall_control_feature_set_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Free-fall control feature set is supported and enabled. + /// + internal static string Free_fall_control_feature_set_is_supported_and_enabled { + get { + return ResourceManager.GetString("Free_fall_control_feature_set_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Free-fall sensitivity set to {0}. + /// + internal static string Free_fall_sensitivity_set_to_0 { + get { + return ResourceManager.GetString("Free_fall_sensitivity_set_to_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Fujitsu Verify Control Page:. + /// + internal static string Fujitsu_Verify_Control_Page { + get { + return ResourceManager.GetString("Fujitsu_Verify_Control_Page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game requires A + B + Start buttons and D-Pad.. + /// + internal static string Game_requires_A_B_Start_buttons_and_D_Pad { + get { + return ResourceManager.GetString("Game_requires_A_B_Start_buttons_and_D_Pad", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game requires analog horizontal controller.. + /// + internal static string Game_requires_analog_horizontal_controller { + get { + return ResourceManager.GetString("Game_requires_analog_horizontal_controller", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game requires analog L trigger.. + /// + internal static string Game_requires_analog_L_trigger { + get { + return ResourceManager.GetString("Game_requires_analog_L_trigger", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game requires analog R trigger.. + /// + internal static string Game_requires_analog_R_trigger { + get { + return ResourceManager.GetString("Game_requires_analog_R_trigger", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game requires analog vertical controller.. + /// + internal static string Game_requires_analog_vertical_controller { + get { + return ResourceManager.GetString("Game_requires_analog_vertical_controller", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game requires C button.. + /// + internal static string Game_requires_C_button { + get { + return ResourceManager.GetString("Game_requires_C_button", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game requires D button.. + /// + internal static string Game_requires_D_button { + get { + return ResourceManager.GetString("Game_requires_D_button", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game requires expanded analog horizontal controller.. + /// + internal static string Game_requires_expanded_analog_horizontal_controller { + get { + return ResourceManager.GetString("Game_requires_expanded_analog_horizontal_controller", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game requires expanded analog vertical controller.. + /// + internal static string Game_requires_expanded_analog_vertical_controller { + get { + return ResourceManager.GetString("Game_requires_expanded_analog_vertical_controller", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game requires expanded direction buttons.. + /// + internal static string Game_requires_expanded_direction_buttons { + get { + return ResourceManager.GetString("Game_requires_expanded_direction_buttons", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game requires X button.. + /// + internal static string Game_requires_X_button { + get { + return ResourceManager.GetString("Game_requires_X_button", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game requires Y button.. + /// + internal static string Game_requires_Y_button { + get { + return ResourceManager.GetString("Game_requires_Y_button", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game requires Z button.. + /// + internal static string Game_requires_Z_button { + get { + return ResourceManager.GetString("Game_requires_Z_button", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game supports analog controller.. + /// + internal static string Game_supports_analog_controller { + get { + return ResourceManager.GetString("Game_supports_analog_controller", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game supports analog steering controller.. + /// + internal static string Game_supports_analog_steering_controller { + get { + return ResourceManager.GetString("Game_supports_analog_steering_controller", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game supports Gun.. + /// + internal static string Game_supports_Gun { + get { + return ResourceManager.GetString("Game_supports_Gun", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game supports JoyPad.. + /// + internal static string Game_supports_JoyPad { + get { + return ResourceManager.GetString("Game_supports_JoyPad", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game supports Keyboard.. + /// + internal static string Game_supports_keyboard { + get { + return ResourceManager.GetString("Game_supports_keyboard", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game supports light gun.. + /// + internal static string Game_supports_light_gun { + get { + return ResourceManager.GetString("Game_supports_light_gun", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game supports Master System's JoyPad.. + /// + internal static string Game_supports_Master_System_JoyPad { + get { + return ResourceManager.GetString("Game_supports_Master_System_JoyPad", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game supports Memory Card.. + /// + internal static string Game_supports_Memory_Card { + get { + return ResourceManager.GetString("Game_supports_Memory_Card", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game supports Mike Device.. + /// + internal static string Game_supports_Mike_Device { + get { + return ResourceManager.GetString("Game_supports_Mike_Device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game supports Mouse.. + /// + internal static string Game_supports_mouse { + get { + return ResourceManager.GetString("Game_supports_mouse", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game supports multitap.. + /// + internal static string Game_supports_multitap { + get { + return ResourceManager.GetString("Game_supports_multitap", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game supports other expansion.. + /// + internal static string Game_supports_other_expansion { + get { + return ResourceManager.GetString("Game_supports_other_expansion", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game supports paddle controller.. + /// + internal static string Game_supports_paddle_controller { + get { + return ResourceManager.GetString("Game_supports_paddle_controller", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game supports printer interface.. + /// + internal static string Game_supports_printer_interface { + get { + return ResourceManager.GetString("Game_supports_printer_interface", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game supports Puru Puru pack.. + /// + internal static string Game_supports_Puru_Puru_pack { + get { + return ResourceManager.GetString("Game_supports_Puru_Puru_pack", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game supports serial (RS-232C) interface.. + /// + internal static string Game_supports_serial_RS_232C_interface { + get { + return ResourceManager.GetString("Game_supports_serial_RS_232C_interface", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game supports tablet interface.. + /// + internal static string Game_supports_tablet_interface { + get { + return ResourceManager.GetString("Game_supports_tablet_interface", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game supports the VGA Box.. + /// + internal static string Game_supports_the_VGA_Box { + get { + return ResourceManager.GetString("Game_supports_the_VGA_Box", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game supports trackball.. + /// + internal static string Game_supports_trackball { + get { + return ResourceManager.GetString("Game_supports_trackball", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game supports unknown peripheral {0}.. + /// + internal static string Game_supports_unknown_peripheral_0 { + get { + return ResourceManager.GetString("Game_supports_unknown_peripheral_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game supports unknown peripherals mask {0:X2}. + /// + internal static string Game_supports_unknown_peripherals_mask_0 { + get { + return ResourceManager.GetString("Game_supports_unknown_peripherals_mask_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game supports unknown region {0}.. + /// + internal static string Game_supports_unknown_region_0 { + get { + return ResourceManager.GetString("Game_supports_unknown_region_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Game uses Windows CE.. + /// + internal static string Game_uses_Windows_CE { + get { + return ResourceManager.GetString("Game_uses_Windows_CE", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to General purpose disc for use in general purpose drives. + /// + internal static string General_purpose_disc_for_use_in_general_purpose_drives { + get { + return ResourceManager.GetString("General_purpose_disc_for_use_in_general_purpose_drives", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to General Purpose Logging is supported. + /// + internal static string General_Purpose_Logging_is_supported { + get { + return ResourceManager.GetString("General_Purpose_Logging_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to General Purpose Logging is supported and enabled. + /// + internal static string General_Purpose_Logging_is_supported_and_enabled { + get { + return ResourceManager.GetString("General_Purpose_Logging_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Generate no sense on informational exceptions. + /// + internal static string Generate_no_sense_on_informational_exceptions { + get { + return ResourceManager.GetString("Generate_no_sense_on_informational_exceptions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Generate unit attention on informational exceptions. + /// + internal static string Generate_unit_attention_on_informational_exceptions { + get { + return ResourceManager.GetString("Generate_unit_attention_on_informational_exceptions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Geometry:. + /// + internal static string Geometry { + get { + return ResourceManager.GetString("Geometry", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to a direct-overwrite optical. + /// + internal static string GetMediumTypeDescription_DOW { + get { + return ResourceManager.GetString("GetMediumTypeDescription_DOW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ECMA-100 & ANSI X3.137: 90 mm Flexible Disk Cartridge using MFM Recording at 7859 ftprad on Both Sides; 5.3 Tracks per mm. + /// + internal static string GetMediumTypeDescription_ECMA_100 { + get { + return ResourceManager.GetString("GetMediumTypeDescription_ECMA_100", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ECMA-54: 200 mm Flexible Disk Cartridge using Two-Frequency Recording at 13262 ftprad on One Side. + /// + internal static string GetMediumTypeDescription_ECMA_54 { + get { + return ResourceManager.GetString("GetMediumTypeDescription_ECMA_54", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ECMA-59 & ANSI X3.121-1984: 200 mm Flexible Disk Cartridge using Two-Frequency Recording at 13262 ftprad on Both Sides. + /// + internal static string GetMediumTypeDescription_ECMA_59 { + get { + return ResourceManager.GetString("GetMediumTypeDescription_ECMA_59", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ECMA-66: 130 mm Flexible Disk Cartridge using Two-Frequency Recording at 7958 ftprad on One Side. + /// + internal static string GetMediumTypeDescription_ECMA_66 { + get { + return ResourceManager.GetString("GetMediumTypeDescription_ECMA_66", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ECMA-69: 200 mm Flexible Disk Cartridge using MFM Recording at 13262 ftprad on Both Sides. + /// + internal static string GetMediumTypeDescription_ECMA_69 { + get { + return ResourceManager.GetString("GetMediumTypeDescription_ECMA_69", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ECMA-70 & ANSI X3.125-1985: 130 mm Flexible Disk Cartridge using MFM Recording at 7958 ftprad on Both Sides; 1.9 Tracks per mm. + /// + internal static string GetMediumTypeDescription_ECMA_70 { + get { + return ResourceManager.GetString("GetMediumTypeDescription_ECMA_70", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ECMA-78 & ANSI X3.126-1986: 130 mm Flexible Disk Cartridge using MFM Recording at 7958 ftprad on Both Sides; 3.8 Tracks per mm. + /// + internal static string GetMediumTypeDescription_ECMA_78 { + get { + return ResourceManager.GetString("GetMediumTypeDescription_ECMA_78", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ECMA-99 & ISO 8630-1985: 130 mm Flexible Disk Cartridge using MFM Recording at 13262 ftprad on Both Sides; 3.8 Tracks per mm. + /// + internal static string GetMediumTypeDescription_ECMA_99 { + get { + return ResourceManager.GetString("GetMediumTypeDescription_ECMA_99", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to a Erasable optical. + /// + internal static string GetMediumTypeDescription_Erasable { + get { + return ResourceManager.GetString("GetMediumTypeDescription_Erasable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 3.5-inch, 135 tpi, 15916 bits/radian, double-sided MFM (aka 1.44Mb). + /// + internal static string GetMediumTypeDescription_HDFloppy { + get { + return ResourceManager.GetString("GetMediumTypeDescription_HDFloppy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to a Sony Hi-MD disc. + /// + internal static string GetMediumTypeDescription_HiMD { + get { + return ResourceManager.GetString("GetMediumTypeDescription_HiMD", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to a Read-only optical. + /// + internal static string GetMediumTypeDescription_ReadOnly { + get { + return ResourceManager.GetString("GetMediumTypeDescription_ReadOnly", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to a combination of read-only and write-once optical. + /// + internal static string GetMediumTypeDescription_RO_WORM { + get { + return ResourceManager.GetString("GetMediumTypeDescription_RO_WORM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 3.5-inch, 135 tpi, 12362 bits/radian, double-sided MFM (aka 1.25Mb). + /// + internal static string GetMediumTypeDescription_Type3Floppy { + get { + return ResourceManager.GetString("GetMediumTypeDescription_Type3Floppy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to a Write-once Read-many optical. + /// + internal static string GetMediumTypeDescription_WORM { + get { + return ResourceManager.GetString("GetMediumTypeDescription_WORM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ANSI X3.73-1980: 200 mm, 6631 ftprad, 1.9 Tracks per mm, 1 side. + /// + internal static string GetMediumTypeDescription_X3_73 { + get { + return ResourceManager.GetString("GetMediumTypeDescription_X3_73", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ANSI X3.73-1980: 200 mm, 6631 ftprad, 1.9 Tracks per mm, 2 sides. + /// + internal static string GetMediumTypeDescription_X3_73_DS { + get { + return ResourceManager.GetString("GetMediumTypeDescription_X3_73_DS", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ANSI X3.80-1980: 130 mm, 3979 ftprad, 1.9 Tracks per mm, 1 side. + /// + internal static string GetMediumTypeDescription_X3_82 { + get { + return ResourceManager.GetString("GetMediumTypeDescription_X3_82", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Global logging target save disabled. + /// + internal static string Global_logging_target_save_disabled { + get { + return ResourceManager.GetString("Global_logging_target_save_disabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Got {0} bytes of gap. + /// + internal static string Got_0_bytes_of_gap { + get { + return ResourceManager.GetString("Got_0_bytes_of_gap", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Graphics arts pre-press device (defined in ASC IT8). + /// + internal static string Graphics_arts_pre_press_device_defined_in_ASC_IT8 { + get { + return ResourceManager.GetString("Graphics_arts_pre_press_device_defined_in_ASC_IT8", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Group {0} has been certified by an user. + /// + internal static string Group_0_has_been_certified_by_an_user { + get { + return ResourceManager.GetString("Group_0_has_been_certified_by_an_user", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Group {0} is being certified partially. + /// + internal static string Group_0_is_being_certified_partially { + get { + return ResourceManager.GetString("Group_0_is_being_certified_partially", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Group {0} is being formatted. + /// + internal static string Group_0_is_being_formatted { + get { + return ResourceManager.GetString("Group_0_is_being_formatted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hardware Feature Control is supported. + /// + internal static string Hardware_Feature_Control_is_supported { + get { + return ResourceManager.GetString("Hardware_Feature_Control_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hardware Feature Control is supported and enabled. + /// + internal static string Hardware_Feature_Control_is_supported_and_enabled { + get { + return ResourceManager.GetString("Hardware_Feature_Control_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hardware ID: {0}. + /// + internal static string Hardware_ID_0 { + get { + return ResourceManager.GetString("Hardware_ID_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Head switch time is bigger than 15 µs.. + /// + internal static string Head_switch_time_is_bigger_than_15_µs { + get { + return ResourceManager.GetString("Head_switch_time_is_bigger_than_15_µs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Head takes {0} ms to load. + /// + internal static string Head_takes_0_ms_to_load { + get { + return ResourceManager.GetString("Head_takes_0_ms_to_load", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Head takes {0} ms to unload. + /// + internal static string Head_takes_0_ms_to_unload { + get { + return ResourceManager.GetString("Head_takes_0_ms_to_unload", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Heads: {0}. + /// + internal static string Heads_0 { + get { + return ResourceManager.GetString("Heads_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Heads: {0} max., {1} current. + /// + internal static string Heads_0_max_1_current { + get { + return ResourceManager.GetString("Heads_0_max_1_current", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Heads park in cylinder {0}. + /// + internal static string Heads_park_in_cylinder_0 { + get { + return ResourceManager.GetString("Heads_park_in_cylinder_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Heads settles in {0} μs. + /// + internal static string Heads_settles_in_0_μs { + get { + return ResourceManager.GetString("Heads_settles_in_0_μs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hi-MD device.. + /// + internal static string Hi_MD_device_ { + get { + return ResourceManager.GetString("Hi_MD_device_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hi-MD specific bytes 44 to 55. + /// + internal static string Hi_MD_specific_bytes_44_to_55 { + get { + return ResourceManager.GetString("Hi_MD_specific_bytes_44_to_55", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to HI-TC1: 12.7 mm 24-Track Magnetic Tape Cartridge, 500 bpmm, GCR. + /// + internal static string HiTC1 { + get { + return ResourceManager.GetString("HiTC1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to HI-TC2: 12.7 mm 24-Track Magnetic Tape Cartridge, 999 bpmm, GCR. + /// + internal static string HiTC2 { + get { + return ResourceManager.GetString("HiTC2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Host managed zoned block device. + /// + internal static string Host_managed_zoned_block_device { + get { + return ResourceManager.GetString("Host_managed_zoned_block_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Host Protected Area is supported. + /// + internal static string Host_Protected_Area_is_supported { + get { + return ResourceManager.GetString("Host_Protected_Area_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Host Protected Area is supported and enabled. + /// + internal static string Host_Protected_Area_is_supported_and_enabled { + get { + return ResourceManager.GetString("Host_Protected_Area_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to How should tapes be unloaded in a power cycle, tape incompatibility, firmware download or cleaning end: . + /// + internal static string How_should_tapes_be_unloaded_in_a_power_cycle_tape_incompatibility_firmware_download_or_cleaning_end { + get { + return ResourceManager.GetString("How_should_tapes_be_unloaded_in_a_power_cycle_tape_incompatibility_firmware_downl" + + "oad_or_cleaning_end", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to HP CD-ROM Emulation/Disaster Recovery Mode Page:. + /// + internal static string HP_CD_ROM_Emulation_Disaster_Recovery_Mode_Page { + get { + return ResourceManager.GetString("HP_CD_ROM_Emulation_Disaster_Recovery_Mode_Page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to HP Device Time Mode Page:. + /// + internal static string HP_Device_Time_Mode_Page { + get { + return ResourceManager.GetString("HP_Device_Time_Mode_Page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to HP Drive ACI Revision Levels page:. + /// + internal static string HP_Drive_ACI_Revision_Levels_page { + get { + return ResourceManager.GetString("HP_Drive_ACI_Revision_Levels_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to HP Drive Firmware Revision Levels page:. + /// + internal static string HP_Drive_Firmware_Revision_Levels_page { + get { + return ResourceManager.GetString("HP_Drive_Firmware_Revision_Levels_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to HP Drive Hardware Revision Levels page:. + /// + internal static string HP_Drive_Hardware_Revision_Levels_page { + get { + return ResourceManager.GetString("HP_Drive_Hardware_Revision_Levels_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to HP Drive Head Assembly Revision Levels page:. + /// + internal static string HP_Drive_Head_Assembly_Revision_Levels_page { + get { + return ResourceManager.GetString("HP_Drive_Head_Assembly_Revision_Levels_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to HP Drive Mechanism Revision Levels page:. + /// + internal static string HP_Drive_Mechanism_Revision_Levels_page { + get { + return ResourceManager.GetString("HP_Drive_Mechanism_Revision_Levels_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to HP Drive PCA Revision Levels page:. + /// + internal static string HP_Drive_PCA_Revision_Levels_page { + get { + return ResourceManager.GetString("HP_Drive_PCA_Revision_Levels_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to HP Extended Reset Mode Page:. + /// + internal static string HP_Extended_Reset_Mode_Page { + get { + return ResourceManager.GetString("HP_Extended_Reset_Mode_Page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to HP Serial Number Override Mode Page:. + /// + internal static string HP_Serial_Number_Override_Mode_Page { + get { + return ResourceManager.GetString("HP_Serial_Number_Override_Mode_Page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to HP vendor-specific information:. + /// + internal static string HP_vendor_specific_information { + get { + return ResourceManager.GetString("HP_vendor_specific_information", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to IBM ALDC with 1024 byte buffer. + /// + internal static string IBM_ALDC_with_1024_byte_buffer { + get { + return ResourceManager.GetString("IBM_ALDC_with_1024_byte_buffer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to IBM ALDC with 2048 byte buffer. + /// + internal static string IBM_ALDC_with_2048_byte_buffer { + get { + return ResourceManager.GetString("IBM_ALDC_with_2048_byte_buffer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to IBM ALDC with 512 byte buffer. + /// + internal static string IBM_ALDC_with_512_byte_buffer { + get { + return ResourceManager.GetString("IBM_ALDC_with_512_byte_buffer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to IBM Behaviour Configuration Mode Page:. + /// + internal static string IBM_Behaviour_Configuration_Mode_Page { + get { + return ResourceManager.GetString("IBM_Behaviour_Configuration_Mode_Page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to IBM Drive Component Revision Levels page:. + /// + internal static string IBM_Drive_Component_Revision_Levels_page { + get { + return ResourceManager.GetString("IBM_Drive_Component_Revision_Levels_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to IBM Drive Serial Numbers page:. + /// + internal static string IBM_Drive_Serial_Numbers_page { + get { + return ResourceManager.GetString("IBM_Drive_Serial_Numbers_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to IBM IDRC. + /// + internal static string IBM_IDRC { + get { + return ResourceManager.GetString("IBM_IDRC", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to IBM LEOT Mode Page:. + /// + internal static string IBM_LEOT_Mode_Page { + get { + return ResourceManager.GetString("IBM_LEOT_Mode_Page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to IBM OEM Specific Field: {0}. + /// + internal static string IBM_OEM_Specific_Field_0 { + get { + return ResourceManager.GetString("IBM_OEM_Specific_Field_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to IBM Vendor-Specific Control Mode Page:. + /// + internal static string IBM_Vendor_Specific_Control_Mode_Page { + get { + return ResourceManager.GetString("IBM_Vendor_Specific_Control_Mode_Page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to IBM vendor-specific information:. + /// + internal static string IBM_vendor_specific_information { + get { + return ResourceManager.GetString("IBM_vendor_specific_information", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Draft ECMA & ANSI X3B5/87-099: 12.7 mm 18-Track Magnetic Tape Cartridge, 1944 ftpmm, IFM, GCR (IBM 3480, 3490, 3490E). + /// + internal static string IBM3480 { + get { + return ResourceManager.GetString("IBM3480", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to IBM 3490E. + /// + internal static string IBM3490E { + get { + return ResourceManager.GetString("IBM3490E", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to IBM 3590. + /// + internal static string IBM3590 { + get { + return ResourceManager.GetString("IBM3590", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to IBM 3590 extended. + /// + internal static string IBM3590_extended { + get { + return ResourceManager.GetString("IBM3590_extended", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to IBM 3590E. + /// + internal static string IBM3590E { + get { + return ResourceManager.GetString("IBM3590E", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to IBM 3590E extended. + /// + internal static string IBM3590E_extended { + get { + return ResourceManager.GetString("IBM3590E_extended", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Identifier belongs to addressed logical unit. + /// + internal static string Identifier_belongs_to_addressed_logical_unit { + get { + return ResourceManager.GetString("Identifier_belongs_to_addressed_logical_unit", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Identifier belongs to target device that contains the addressed logical unit. + /// + internal static string Identifier_belongs_to_target_device_that_contains_the_addressed_logical_unit { + get { + return ResourceManager.GetString("Identifier_belongs_to_target_device_that_contains_the_addressed_logical_unit", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Identifier belongs to target port. + /// + internal static string Identifier_belongs_to_target_port { + get { + return ResourceManager.GetString("Identifier_belongs_to_target_port", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Identifier has unknown association with code {0}. + /// + internal static string Identifier_has_unknown_association_with_code_0 { + get { + return ResourceManager.GetString("Identifier_has_unknown_association_with_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to IDLE IMMEDIATE with UNLOAD FEATURE is supported. + /// + internal static string IDLE_IMMEDIATE_with_UNLOAD_FEATURE_is_supported { + get { + return ResourceManager.GetString("IDLE_IMMEDIATE_with_UNLOAD_FEATURE_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to IDLE IMMEDIATE with UNLOAD FEATURE is supported and enabled. + /// + internal static string IDLE_IMMEDIATE_with_UNLOAD_FEATURE_is_supported_and_enabled { + get { + return ResourceManager.GetString("IDLE_IMMEDIATE_with_UNLOAD_FEATURE_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to IEEE 1394. + /// + internal static string IEEE_1394 { + get { + return ResourceManager.GetString("IEEE_1394", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to IEEE EUI-64: {0}. + /// + internal static string IEEE_EUI_64_0 { + get { + return ResourceManager.GetString("IEEE_EUI_64_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to IEEE EUI-64: {0:X2}. + /// + internal static string IEEE_EUI_64_0_X2 { + get { + return ResourceManager.GetString("IEEE_EUI_64_0_X2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to If ACA is established, the task set commands shall resume after it is cleared, otherwise they shall terminate with CHECK CONDITION. + /// + internal static string If_ACA_is_established_the_task_set_commands_shall_resume_after_it_is_cleared_otherwise_they_shall_terminate_with_CHECK_CONDITION { + get { + return ResourceManager.GetString("If_ACA_is_established_the_task_set_commands_shall_resume_after_it_is_cleared_othe" + + "rwise_they_shall_terminate_with_CHECK_CONDITION", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to If set, target shall report log exception conditions. + /// + internal static string If_set_target_shall_report_log_exception_conditions { + get { + return ResourceManager.GetString("If_set_target_shall_report_log_exception_conditions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Illegal field in CDB. + /// + internal static string Illegal_field_in_CDB { + get { + return ResourceManager.GetString("Illegal_field_in_CDB", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Illegal field in data parameters. + /// + internal static string Illegal_field_in_data_parameters { + get { + return ResourceManager.GetString("Illegal_field_in_data_parameters", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Implicit Asymmetric Logical Unit Access is enabled. + /// + internal static string Implicit_Asymmetric_Logical_Unit_Access_is_enabled { + get { + return ResourceManager.GetString("Implicit_Asymmetric_Logical_Unit_Access_is_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to In-order data delivery is supported. + /// + internal static string In_order_data_delivery_is_supported { + get { + return ResourceManager.GetString("In_order_data_delivery_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to In-order data delivery is supported and enabled. + /// + internal static string In_order_data_delivery_is_supported_and_enabled { + get { + return ResourceManager.GetString("In_order_data_delivery_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Incomplete identify response. + /// + internal static string Incomplete_identify_response { + get { + return ResourceManager.GetString("Incomplete_identify_response", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Incorrect CD-Text pack type {0}, not decoding. + /// + internal static string Incorrect_CD_Text_pack_type_0_not_decoding { + get { + return ResourceManager.GetString("Incorrect_CD_Text_pack_type_0_not_decoding", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Incorrect ECC P.. + /// + internal static string Incorrect_ECC_P { + get { + return ResourceManager.GetString("Incorrect_ECC_P", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Incorrect ECC Q.. + /// + internal static string Incorrect_ECC_Q { + get { + return ResourceManager.GetString("Incorrect_ECC_Q", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Incorrect EDC.. + /// + internal static string Incorrect_EDC { + get { + return ResourceManager.GetString("Incorrect_EDC", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Incorrect length indicator. + /// + internal static string Incorrect_length_indicator { + get { + return ResourceManager.GetString("Incorrect_length_indicator", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Incorrect sector contents.. + /// + internal static string Incorrect_sector_contents { + get { + return ResourceManager.GetString("Incorrect_sector_contents", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Incorrect zero fill.. + /// + internal static string Incorrect_zero_fill { + get { + return ResourceManager.GetString("Incorrect_zero_fill", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Indicative Target Writing Power: 0x{0:X2}. + /// + internal static string Indicative_Target_Writing_Power_0 { + get { + return ResourceManager.GetString("Indicative_Target_Writing_Power_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Informational exception conditions will be reported a maximum of {0} times. + /// + internal static string Informational_exception_conditions_will_be_reported_a_maximum_of_0_times { + get { + return ResourceManager.GetString("Informational_exception_conditions_will_be_reported_a_maximum_of_0_times", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Informational exceptions are disabled. + /// + internal static string Informational_exceptions_are_disabled { + get { + return ResourceManager.GetString("Informational_exceptions_are_disabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Informational exceptions are enabled. + /// + internal static string Informational_exceptions_are_enabled { + get { + return ResourceManager.GetString("Informational_exceptions_are_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Informational exceptions reporting should not affect drive performance. + /// + internal static string Informational_exceptions_reporting_should_not_affect_drive_performance { + get { + return ResourceManager.GetString("Informational_exceptions_reporting_should_not_affect_drive_performance", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Initial priority is {0}. + /// + internal static string Initial_priority_is_0 { + get { + return ResourceManager.GetString("Initial_priority_is_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Initial program address: 0x{0:X8}. + /// + internal static string Initial_program_address_0 { + get { + return ResourceManager.GetString("Initial_program_address_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Initial program entry address: 0x{0:X8}. + /// + internal static string Initial_program_entry_address_0 { + get { + return ResourceManager.GetString("Initial_program_entry_address_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Initial program load size: {0} bytes. + /// + internal static string Initial_program_load_size_0 { + get { + return ResourceManager.GetString("Initial_program_load_size_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Initial program work RAM: {0} bytes. + /// + internal static string Initial_program_work_RAM_0 { + get { + return ResourceManager.GetString("Initial_program_work_RAM_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Inner gap has {0} bytes. + /// + internal static string Inner_gap_has_0_bytes { + get { + return ResourceManager.GetString("Inner_gap_has_0_bytes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Inquiry descriptor contains: {0}. + /// + internal static string Inquiry_descriptor_contains_0 { + get { + return ResourceManager.GetString("Inquiry_descriptor_contains_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Inquiry descriptor contains binary data (hex): {0}. + /// + internal static string Inquiry_descriptor_contains_binary_data_hex_0 { + get { + return ResourceManager.GetString("Inquiry_descriptor_contains_binary_data_hex_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Inquiry descriptor contains unknown kind {1} of data (hex): {0}. + /// + internal static string Inquiry_descriptor_contains_unknown_kind_1_of_data_hex_0 { + get { + return ResourceManager.GetString("Inquiry_descriptor_contains_unknown_kind_1_of_data_hex_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Inquiry descriptor type {2} contains unknown kind {1} of data (hex): {0}. + /// + internal static string Inquiry_descriptor_type_2_contains_unknown_kind_1_of_data_hex_0 { + get { + return ResourceManager.GetString("Inquiry_descriptor_type_2_contains_unknown_kind_1_of_data_hex_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Inserted cartridge is LTO. + /// + internal static string Inserted_cartridge_is_LTO { + get { + return ResourceManager.GetString("Inserted_cartridge_is_LTO", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Inter-block gap is {0} times the device's defined gap size. + /// + internal static string Inter_block_gap_is_0_times_the_device_defined_gap_size { + get { + return ResourceManager.GetString("Inter_block_gap_is_0_times_the_device_defined_gap_size", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Inter-block gap is long enough to support update in place. + /// + internal static string Inter_block_gap_is_long_enough_to_support_update_in_place { + get { + return ResourceManager.GetString("Inter_block_gap_is_long_enough_to_support_update_in_place", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Inter-block gap is unknown value {0}. + /// + internal static string Inter_block_gap_is_unknown_value_0 { + get { + return ResourceManager.GetString("Inter_block_gap_is_unknown_value_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Internet SCSI. + /// + internal static string Internet_SCSI { + get { + return ResourceManager.GetString("Internet_SCSI", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid mode 3.. + /// + internal static string Invalid_mode_3 { + get { + return ResourceManager.GetString("Invalid_mode_3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid purpose field with value {0}. + /// + internal static string Invalid_purpose_field_with_value_0 { + get { + return ResourceManager.GetString("Invalid_purpose_field_with_value_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to invalid size. + /// + internal static string invalid_size { + get { + return ResourceManager.GetString("invalid_size", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid value in bit {0} in field {1} of CDB. + /// + internal static string Invalid_value_in_bit_0_in_field_1_of_CDB { + get { + return ResourceManager.GetString("Invalid_value_in_bit_0_in_field_1_of_CDB", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid value in field {0} of CDB. + /// + internal static string Invalid_value_in_field_0_of_CDB { + get { + return ResourceManager.GetString("Invalid_value_in_field_0_of_CDB", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to IORDY is supported. + /// + internal static string IORDY_is_supported { + get { + return ResourceManager.GetString("IORDY_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to IORDY is supported and can be disabled. + /// + internal static string IORDY_is_supported_and_can_be_disabled { + get { + return ResourceManager.GetString("IORDY_is_supported_and_can_be_disabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ISA0 size: {0}. + /// + internal static string ISA0_size_0 { + get { + return ResourceManager.GetString("ISA0_size_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ISA1 size: {0}. + /// + internal static string ISA1_size_0 { + get { + return ResourceManager.GetString("ISA1_size_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ISO/IEC 10090: 86 mm Read/Write single-sided optical disc with 12500 tracks. + /// + internal static string ISO10090 { + get { + return ResourceManager.GetString("ISO10090", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ISO/IEC 13614: 300 mm double-sided optical disc. + /// + internal static string ISO13614 { + get { + return ResourceManager.GetString("ISO13614", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Japanese NTSC.. + /// + internal static string Japanese_NTSC { + get { + return ResourceManager.GetString("Japanese_NTSC", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to kilobytes. + /// + internal static string kilobytes { + get { + return ResourceManager.GetString("kilobytes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Large unit maximum multiplier is {0}.. + /// + internal static string Large_unit_maximum_multiplier_is_0 { + get { + return ResourceManager.GetString("Large_unit_maximum_multiplier_is_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Large unit size is {0} MiB. + /// + internal static string Large_unit_size_is_0_MiB { + get { + return ResourceManager.GetString("Large_unit_size_is_0_MiB", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Last address unit number of data zone in this layer: {0}. + /// + internal static string Last_address_unit_number_of_data_zone_in_this_layer_0 { + get { + return ResourceManager.GetString("Last_address_unit_number_of_data_zone_in_this_layer_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Last addressable logical block is {0}. + /// + internal static string Last_addressable_logical_block_is_0 { + get { + return ResourceManager.GetString("Last_addressable_logical_block_is_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Last complete session number: {0}. + /// + internal static string Last_complete_session_number_0 { + get { + return ResourceManager.GetString("Last_complete_session_number_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Last data read was compressed with . + /// + internal static string Last_data_read_was_compressed_with_ { + get { + return ResourceManager.GetString("Last_data_read_was_compressed_with_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Last data read was uncompressed. + /// + internal static string Last_data_read_was_uncompressed { + get { + return ResourceManager.GetString("Last_data_read_was_uncompressed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Last extended security error was {0}. + /// + internal static string Last_extended_security_error_was_0 { + get { + return ResourceManager.GetString("Last_extended_security_error_was_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Last possible Lead-Out address is {0} (as LBA) or {1:X2}:{2:X2}:{3:X2}. + /// + internal static string Last_possible_Lead_Out_address_is_0_as_LBA_or_1_2_3 { + get { + return ResourceManager.GetString("Last_possible_Lead_Out_address_is_0_as_LBA_or_1_2_3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Last session is complete. + /// + internal static string Last_session_is_complete { + get { + return ResourceManager.GetString("Last_session_is_complete", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Last session is damaged. + /// + internal static string Last_session_is_damaged { + get { + return ResourceManager.GetString("Last_session_is_damaged", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Last session is empty. + /// + internal static string Last_session_is_empty { + get { + return ResourceManager.GetString("Last_session_is_empty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Last session is incomplete. + /// + internal static string Last_session_is_incomplete { + get { + return ResourceManager.GetString("Last_session_is_incomplete", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Last session Lead-In address is {0} (as LBA) or {1:X2}:{2:X2}:{3:X2}. + /// + internal static string Last_session_Lead_In_address_is_0_as_LBA_or_1_2_3 { + get { + return ResourceManager.GetString("Last_session_Lead_In_address_is_0_as_LBA_or_1_2_3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Last track in last session is track {0}. + /// + internal static string Last_track_in_last_session_is_track_0 { + get { + return ResourceManager.GetString("Last_track_in_last_session_is_track_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Last track number: {0} (. + /// + internal static string Last_track_number_0_open_parenthesis { + get { + return ResourceManager.GetString("Last_track_number_0_open_parenthesis", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Last track number in last complete session: {0}. + /// + internal static string Last_track_number_in_last_complete_session_0 { + get { + return ResourceManager.GetString("Last_track_number_in_last_complete_session_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Last User Data Area's LSN 0: 0x{0:X8}. + /// + internal static string Last_User_Data_Areas_LSN_0_0 { + get { + return ResourceManager.GetString("Last_User_Data_Areas_LSN_0_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Last user data PSN for disc: {0}. + /// + internal static string Last_user_data_PSN_for_disc_0 { + get { + return ResourceManager.GetString("Last_user_data_PSN_for_disc_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Last video track number: {0}. + /// + internal static string Last_video_track_number_0 { + get { + return ResourceManager.GetString("Last_video_track_number_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Last writable ECC block address: 0x{0:X6}. + /// + internal static string Last_writable_ECC_block_address_0_X6_ { + get { + return ResourceManager.GetString("Last_writable_ECC_block_address_0_X6_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Last WRITE MULTIPLE command correctly programmed {0} sectors. + /// + internal static string Last_WRITE_MULTIPLE_command_correctly_programmed_0_sectors { + get { + return ResourceManager.GetString("Last_WRITE_MULTIPLE_command_correctly_programmed_0_sectors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Layer {0} is of type Blu-ray. + /// + internal static string Layer_0_is_of_type_Blu_ray { + get { + return ResourceManager.GetString("Layer_0_is_of_type_Blu_ray", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Layer {0} is of type CD. + /// + internal static string Layer_0_is_of_type_CD { + get { + return ResourceManager.GetString("Layer_0_is_of_type_CD", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Layer {0} is of type DVD. + /// + internal static string Layer_0_is_of_type_DVD { + get { + return ResourceManager.GetString("Layer_0_is_of_type_DVD", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Layer {0} is of type HD DVD. + /// + internal static string Layer_0_is_of_type_HD_DVD { + get { + return ResourceManager.GetString("Layer_0_is_of_type_HD_DVD", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Layer {0} is of unknown type 0x{1:X4}. + /// + internal static string Layer_0_is_of_unknown_type_1 { + get { + return ResourceManager.GetString("Layer_0_is_of_unknown_type_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Layer 0 ends at PSN {0:X}h. + /// + internal static string Layer_zero_ends_at_PSN_0 { + get { + return ResourceManager.GetString("Layer_zero_ends_at_PSN_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Layers are in opposite track path. + /// + internal static string Layers_are_in_opposite_track_path { + get { + return ResourceManager.GetString("Layers_are_in_opposite_track_path", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Layers are in parallel track path. + /// + internal static string Layers_are_in_parallel_track_path { + get { + return ResourceManager.GetString("Layers_are_in_parallel_track_path", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LBA Extent {0} starts at LBA {1} and goes for {2} sectors. + /// + internal static string LBA_Extent_0_starts_at_LBA_1_and_goes_for_2_sectors { + get { + return ResourceManager.GetString("LBA_Extent_0_starts_at_LBA_1_and_goes_for_2_sectors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Lead-In is pre-recorded. + /// + internal static string Lead_In_is_pre_recorded { + get { + return ResourceManager.GetString("Lead_In_is_pre_recorded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Lead-Out is audio type. + /// + internal static string Lead_out_is_audio_type { + get { + return ResourceManager.GetString("Lead_out_is_audio_type", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Lead-Out is data type. + /// + internal static string Lead_out_is_data_type { + get { + return ResourceManager.GetString("Lead_out_is_data_type", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Lead-Out is pre-recorded. + /// + internal static string Lead_Out_is_pre_recorded { + get { + return ResourceManager.GetString("Lead_Out_is_pre_recorded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Lead-Out start position: {0:D2}:{1:D2}:{2:D2}. + /// + internal static string Lead_out_start_position_0_1_2 { + get { + return ResourceManager.GetString("Lead_out_start_position_0_1_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Lead-Out start position: {3:D2}:{0:D2}:{1:D2}:{2:D2}. + /// + internal static string Lead_out_start_position_3_0_1_2 { + get { + return ResourceManager.GetString("Lead_out_start_position_3_0_1_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Legacy value: 0x{0:X2}. + /// + internal static string Legacy_value_0 { + get { + return ResourceManager.GetString("Legacy_value_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Library interface transmits 1 stop bits per byte. + /// + internal static string Library_interface_transmits_1_stop_bits_per_byte { + get { + return ResourceManager.GetString("Library_interface_transmits_1_stop_bits_per_byte", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Library interface transmits 2 stop bits per byte. + /// + internal static string Library_interface_transmits_2_stop_bits_per_byte { + get { + return ResourceManager.GetString("Library_interface_transmits_2_stop_bits_per_byte", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Library interface will operate at 115200 baud on next reset. + /// + internal static string Library_interface_will_operate_at_115200_baud_on_next_reset { + get { + return ResourceManager.GetString("Library_interface_will_operate_at_115200_baud_on_next_reset", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Library interface will operate at 19200 baud on next reset. + /// + internal static string Library_interface_will_operate_at_19200_baud_on_next_reset { + get { + return ResourceManager.GetString("Library_interface_will_operate_at_19200_baud_on_next_reset", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Library interface will operate at 38400 baud on next reset. + /// + internal static string Library_interface_will_operate_at_38400_baud_on_next_reset { + get { + return ResourceManager.GetString("Library_interface_will_operate_at_38400_baud_on_next_reset", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Library interface will operate at 57600 baud on next reset. + /// + internal static string Library_interface_will_operate_at_57600_baud_on_next_reset { + get { + return ResourceManager.GetString("Library_interface_will_operate_at_57600_baud_on_next_reset", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Library interface will operate at 9600 baud on next reset. + /// + internal static string Library_interface_will_operate_at_9600_baud_on_next_reset { + get { + return ResourceManager.GetString("Library_interface_will_operate_at_9600_baud_on_next_reset", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Library is present. + /// + internal static string Library_is_present { + get { + return ResourceManager.GetString("Library_is_present", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Library time is {0}. + /// + internal static string Library_time_is_0 { + get { + return ResourceManager.GetString("Library_time_is_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Link block. + /// + internal static string Link_block { + get { + return ResourceManager.GetString("Link_block", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LOGICAL BLOCK APPLICATION TAG should not be modified. + /// + internal static string LOGICAL_BLOCK_APPLICATION_TAG_should_not_be_modified { + get { + return ResourceManager.GetString("LOGICAL_BLOCK_APPLICATION_TAG_should_not_be_modified", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Logical block provisioning error reporting is enabled. + /// + internal static string Logical_block_provisioning_error_reporting_is_enabled { + get { + return ResourceManager.GetString("Logical_block_provisioning_error_reporting_is_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Logical sector size: {0} bytes. + /// + internal static string Logical_sector_size_0_bytes { + get { + return ResourceManager.GetString("Logical_sector_size_0_bytes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Logical sector starts at offset {0} from physical sector. + /// + internal static string Logical_sector_starts_at_offset_0_from_physical_sector { + get { + return ResourceManager.GetString("Logical_sector_starts_at_offset_0_from_physical_sector", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Logical unit group identifier: {0}. + /// + internal static string Logical_unit_group_identifier_0 { + get { + return ResourceManager.GetString("Logical_unit_group_identifier_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Logical unit supports logical block protection. + /// + internal static string Logical_unit_supports_logical_block_protection { + get { + return ResourceManager.GetString("Logical_unit_supports_logical_block_protection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Logical unit supports type 1 protection. + /// + internal static string Logical_unit_supports_type_1_protection { + get { + return ResourceManager.GetString("Logical_unit_supports_type_1_protection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Logical unit supports type 2 protection. + /// + internal static string Logical_unit_supports_type_2_protection { + get { + return ResourceManager.GetString("Logical_unit_supports_type_2_protection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Logical unit supports type 3 protection. + /// + internal static string Logical_unit_supports_type_3_protection { + get { + return ResourceManager.GetString("Logical_unit_supports_type_3_protection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Logical unit supports types 1, 2 and 3 protection. + /// + internal static string Logical_unit_supports_types_1_2_and_3_protection { + get { + return ResourceManager.GetString("Logical_unit_supports_types_1_2_and_3_protection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Logical unit supports types 1 and 2 protection. + /// + internal static string Logical_unit_supports_types_1_and_2_protection { + get { + return ResourceManager.GetString("Logical_unit_supports_types_1_and_2_protection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Logical unit supports types 1 and 3 protection. + /// + internal static string Logical_unit_supports_types_1_and_3_protection { + get { + return ResourceManager.GetString("Logical_unit_supports_types_1_and_3_protection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Logical unit supports types 2 and 3 protection. + /// + internal static string Logical_unit_supports_types_2_and_3_protection { + get { + return ResourceManager.GetString("Logical_unit_supports_types_2_and_3_protection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Logical unit supports unknown protection defined by code {0}. + /// + internal static string Logical_unit_supports_unknown_protection_defined_by_code_0 { + get { + return ResourceManager.GetString("Logical_unit_supports_unknown_protection_defined_by_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Long Physical Alignment setting is {0}. + /// + internal static string Long_Physical_Alignment_setting_is_0 { + get { + return ResourceManager.GetString("Long_Physical_Alignment_setting_is_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Look-ahead read is supported. + /// + internal static string Look_ahead_read_is_supported { + get { + return ResourceManager.GetString("Look_ahead_read_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Look-ahead read is supported and enabled. + /// + internal static string Look_ahead_read_is_supported_and_enabled { + get { + return ResourceManager.GetString("Look_ahead_read_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LSN 0 is at PSN {0:X}h. + /// + internal static string LSN_zero_is_at_PSN_0 { + get { + return ResourceManager.GetString("LSN_zero_is_at_PSN_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LTO in CD-ROM emulation mode. + /// + internal static string LTO_in_CD_ROM_emulation_mode { + get { + return ResourceManager.GetString("LTO_in_CD_ROM_emulation_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LTO Ultrium or Super AIT-1. + /// + internal static string LTO_or_SAIT1 { + get { + return ResourceManager.GetString("LTO_or_SAIT1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LTO Ultrium 1 Type A cartridge inserted. + /// + internal static string LTO_Ultrium_1_Type_A_cartridge_inserted { + get { + return ResourceManager.GetString("LTO_Ultrium_1_Type_A_cartridge_inserted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LTO Ultrium 1 Type B cartridge inserted. + /// + internal static string LTO_Ultrium_1_Type_B_cartridge_inserted { + get { + return ResourceManager.GetString("LTO_Ultrium_1_Type_B_cartridge_inserted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LTO Ultrium 1 Type C cartridge inserted. + /// + internal static string LTO_Ultrium_1_Type_C_cartridge_inserted { + get { + return ResourceManager.GetString("LTO_Ultrium_1_Type_C_cartridge_inserted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LTO Ultrium 1 Type D cartridge inserted. + /// + internal static string LTO_Ultrium_1_Type_D_cartridge_inserted { + get { + return ResourceManager.GetString("LTO_Ultrium_1_Type_D_cartridge_inserted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LTO Ultrium 2 cartridge inserted. + /// + internal static string LTO_Ultrium_2_cartridge_inserted { + get { + return ResourceManager.GetString("LTO_Ultrium_2_cartridge_inserted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LTO Ultrium cleaning cartridge. + /// + internal static string LTO_Ultrium_cleaning_cartridge { + get { + return ResourceManager.GetString("LTO_Ultrium_cleaning_cartridge", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LTO Ultrium-2 in CD emulation mode. + /// + internal static string LTO2_CDemu { + get { + return ResourceManager.GetString("LTO2_CDemu", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LTO Ultrium-2 or T9840. + /// + internal static string LTO2_or_T9840 { + get { + return ResourceManager.GetString("LTO2_or_T9840", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LTO Ultrium-3 in CD emulation mode. + /// + internal static string LTO3_CDemu { + get { + return ResourceManager.GetString("LTO3_CDemu", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LTO Ultrium-3 or T9940. + /// + internal static string LTO3_or_T9940 { + get { + return ResourceManager.GetString("LTO3_or_T9940", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LTO Ultrium-4 in CD emulation mode. + /// + internal static string LTO4_CDemu { + get { + return ResourceManager.GetString("LTO4_CDemu", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LTO Ultrium-4 or T9840D. + /// + internal static string LTO4_or_T9840D { + get { + return ResourceManager.GetString("LTO4_or_T9840D", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LTO Ultrium-5 in CD emulation mode. + /// + internal static string LTO5_CDemu { + get { + return ResourceManager.GetString("LTO5_CDemu", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LUN shall clear unit attention condition reported in the same nexus. + /// + internal static string LUN_shall_clear_unit_attention_condition_reported_in_the_same_nexus { + get { + return ResourceManager.GetString("LUN_shall_clear_unit_attention_condition_reported_in_the_same_nexus", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LUN shall not clear unit attention condition reported in the same nexus. + /// + internal static string LUN_shall_not_clear_unit_attention_condition_reported_in_the_same_nexus { + get { + return ResourceManager.GetString("LUN_shall_not_clear_unit_attention_condition_reported_in_the_same_nexus", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LUN shall not clear unit attention condition reported in the same nexus and shall establish a unit attention condition for the initiator. + /// + internal static string LUN_shall_not_clear_unit_attention_condition_reported_in_the_same_nexus_and_shall_establish_a_unit_attention_condition_for_the_initiator { + get { + return ResourceManager.GetString("LUN_shall_not_clear_unit_attention_condition_reported_in_the_same_nexus_and_shall" + + "_establish_a_unit_attention_condition_for_the_initiator", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mammoth-2. + /// + internal static string Mammoth2 { + get { + return ResourceManager.GetString("Mammoth2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Manufacturer: {0}. + /// + internal static string Manufacturer_0 { + get { + return ResourceManager.GetString("Manufacturer_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Manufacturer ID: {0}. + /// + internal static string Manufacturer_ID_0 { + get { + return ResourceManager.GetString("Manufacturer_ID_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PCMCIA Manufacturer Identification Tuple:. + /// + internal static string Manufacturer_Identification_Tuple { + get { + return ResourceManager.GetString("Manufacturer_Identification_Tuple", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Manufacturing serial number: {0}. + /// + internal static string Manufacturing_serial_number_0 { + get { + return ResourceManager.GetString("Manufacturing_serial_number_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Master password revision code: {0}. + /// + internal static string Master_password_revision_code_0 { + get { + return ResourceManager.GetString("Master_password_revision_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Material type: 0x{0:X2}. + /// + internal static string Material_type_0 { + get { + return ResourceManager.GetString("Material_type_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Max context ID is {0}.. + /// + internal static string Max_context_ID_is_0 { + get { + return ResourceManager.GetString("Max_context_ID_is_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Maximum {0} scramble extent information entries. + /// + internal static string Maximum_0_scramble_extent_information_entries { + get { + return ResourceManager.GetString("Maximum_0_scramble_extent_information_entries", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Maximum ATA revision supported: . + /// + internal static string Maximum_ATA_revision_supported { + get { + return ResourceManager.GetString("Maximum_ATA_revision_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Maximum sense data would be {0} bytes. + /// + internal static string Maximum_sense_data_would_be_0_bytes { + get { + return ResourceManager.GetString("Maximum_sense_data_would_be_0_bytes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Maximum start of outermost Lead-Out in the recordable area of the disc: {0:D2}:{1:D2}:{2:D2}. + /// + internal static string Maximum_start_of_outermost_Lead_out_in_the_recordable_area_of_the_disc_0_1_2 { + get { + return ResourceManager.GetString("Maximum_start_of_outermost_Lead_out_in_the_recordable_area_of_the_disc_0_1_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Maximum start of outermost Lead-Out in the recordable area of the disc: {3:D2}:{0:D2}:{1:D2}:{2:D2}. + /// + internal static string Maximum_start_of_outermost_Lead_out_in_the_recordable_area_of_the_disc_3_0_1_2 { + get { + return ResourceManager.GetString("Maximum_start_of_outermost_Lead_out_in_the_recordable_area_of_the_disc_3_0_1_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Maximum timeout for switch command when setting a value to the mode operation codes field is {0:D2}ms. + /// + internal static string Maximum_timeout_for_switch_command_when_setting_a_value_to_the_mode_operation_codes_field_is_0_ms { + get { + return ResourceManager.GetString("Maximum_timeout_for_switch_command_when_setting_a_value_to_the_mode_operation_cod" + + "es_field_is_0_ms", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Maximum timeout for switch command when setting a value to the mode operation codes field is {0:D2}s. + /// + internal static string Maximum_timeout_for_switch_command_when_setting_a_value_to_the_mode_operation_codes_field_is_0_s { + get { + return ResourceManager.GetString("Maximum_timeout_for_switch_command_when_setting_a_value_to_the_mode_operation_cod" + + "es_field_is_0_s", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Maximum timeout for switch command when setting a value to the mode operation codes field is {0:D2}µs. + /// + internal static string Maximum_timeout_for_switch_command_when_setting_a_value_to_the_mode_operation_codes_field_is_0_µs { + get { + return ResourceManager.GetString("Maximum_timeout_for_switch_command_when_setting_a_value_to_the_mode_operation_cod" + + "es_field_is_0_µs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MBit/s. + /// + internal static string MBit_s { + get { + return ResourceManager.GetString("MBit_s", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MD5 logical unit identifier: {0}. + /// + internal static string MD5_logical_unit_identifier_0 { + get { + return ResourceManager.GetString("MD5_logical_unit_identifier_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MD5 logical unit identifier: {0:x2}. + /// + internal static string MD5_logical_unit_identifier_0_x2 { + get { + return ResourceManager.GetString("MD5_logical_unit_identifier_0_x2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Media attribute is {0}. + /// + internal static string Media_attribute_is_0 { + get { + return ResourceManager.GetString("Media_attribute_is_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Media background formatting has completed. + /// + internal static string Media_background_formatting_has_completed { + get { + return ResourceManager.GetString("Media_background_formatting_has_completed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Media Card Pass Through command set is supported. + /// + internal static string Media_Card_Pass_Through_command_set_is_supported { + get { + return ResourceManager.GetString("Media_Card_Pass_Through_command_set_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Media Card Pass Through command set is supported and enabled. + /// + internal static string Media_Card_Pass_Through_command_set_is_supported_and_enabled { + get { + return ResourceManager.GetString("Media_Card_Pass_Through_command_set_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Media has been taken out, or inserted in, the cartridge. + /// + internal static string Media_has_been_taken_out_or_inserted_in_the_cartridge { + get { + return ResourceManager.GetString("Media_has_been_taken_out_or_inserted_in_the_cartridge", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Media has out bit marked, shouldn't. + /// + internal static string Media_has_out_bit_marked_shouldnt { + get { + return ResourceManager.GetString("Media_has_out_bit_marked_shouldnt", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Media has write protection bit marked, shouldn't. + /// + internal static string Media_has_write_protection_bit_marked_shouldnt { + get { + return ResourceManager.GetString("Media_has_write_protection_bit_marked_shouldnt", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Media ID: . + /// + internal static string Media_ID { + get { + return ResourceManager.GetString("Media_ID", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Media is currently being formatted in the background. + /// + internal static string Media_is_currently_being_formatted_in_the_background { + get { + return ResourceManager.GetString("Media_is_currently_being_formatted_in_the_background", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Media is inserted in a cartridge. + /// + internal static string Media_is_inserted_in_a_cartridge { + get { + return ResourceManager.GetString("Media_is_inserted_in_a_cartridge", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Media is not in a cartridge. + /// + internal static string Media_is_not_in_a_cartridge { + get { + return ResourceManager.GetString("Media_is_not_in_a_cartridge", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Media is write protected. + /// + internal static string Media_is_write_protected { + get { + return ResourceManager.GetString("Media_is_write_protected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Media loader firmware version: {0}. + /// + internal static string Media_loader_firmware_version_0 { + get { + return ResourceManager.GetString("Media_loader_firmware_version_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Media loader hardware version: {0}. + /// + internal static string Media_loader_hardware_version_0 { + get { + return ResourceManager.GetString("Media_loader_hardware_version_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Media loader is present. + /// + internal static string Media_loader_is_present { + get { + return ResourceManager.GetString("Media_loader_is_present", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Media loader mechanical version: {0}. + /// + internal static string Media_loader_mechanical_version_0 { + get { + return ResourceManager.GetString("Media_loader_mechanical_version_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Media Serial is supported. + /// + internal static string Media_Serial_is_supported { + get { + return ResourceManager.GetString("Media_Serial_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Media Serial is supported and valid. + /// + internal static string Media_Serial_is_supported_and_valid { + get { + return ResourceManager.GetString("Media_Serial_is_supported_and_valid", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Media surface sets write protection. + /// + internal static string Media_surface_sets_write_protection { + get { + return ResourceManager.GetString("Media_surface_sets_write_protection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Media was being formatted in the background but it is stopped and incomplete. + /// + internal static string Media_was_being_formatted_in_the_background_but_it_is_stopped_and_incomplete { + get { + return ResourceManager.GetString("Media_was_being_formatted_in_the_background_but_it_is_stopped_and_incomplete", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Medium change device. + /// + internal static string Medium_change_device { + get { + return ResourceManager.GetString("Medium_change_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Medium description: {0}. + /// + internal static string Medium_description_0 { + get { + return ResourceManager.GetString("Medium_description_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Medium has a nominal length of {0} m in a {1} mm width tape. + /// + internal static string Medium_has_a_nominal_length_of_0_m_in_a_1_mm_width_tape { + get { + return ResourceManager.GetString("Medium_has_a_nominal_length_of_0_m_in_a_1_mm_width_tape", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Medium has defined {0} partitions. + /// + internal static string Medium_has_defined_0_partitions { + get { + return ResourceManager.GetString("Medium_has_defined_0_partitions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Medium is . + /// + internal static string Medium_is_ { + get { + return ResourceManager.GetString("Medium_is_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Medium is {0}. + /// + internal static string Medium_is_0 { + get { + return ResourceManager.GetString("Medium_is_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Medium is write protected. + /// + internal static string Medium_is_write_protected { + get { + return ResourceManager.GetString("Medium_is_write_protected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Medium rotates at {0} rpm. + /// + internal static string Medium_rotates_at_0_rpm { + get { + return ResourceManager.GetString("Medium_rotates_at_0_rpm", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Medium supports block IDs. + /// + internal static string Medium_supports_block_IDs { + get { + return ResourceManager.GetString("Medium_supports_block_IDs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Medium supports following density codes:. + /// + internal static string Medium_supports_following_density_codes { + get { + return ResourceManager.GetString("Medium_supports_following_density_codes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Medium type "{0}" defined by "{1}".. + /// + internal static string Medium_type_0_defined_by_1 { + get { + return ResourceManager.GetString("Medium_type_0_defined_by_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Medium type code: {0:X2}h. + /// + internal static string Medium_type_code_0 { + get { + return ResourceManager.GetString("Medium_type_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CompactTape I, Exatape 28m, CompactTape II, VXA-2 or VXA-3. + /// + internal static string MediumType_CT1 { + get { + return ResourceManager.GetString("MediumType_CT1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DAT-72. + /// + internal static string MediumType_DAT72 { + get { + return ResourceManager.GetString("MediumType_DAT72", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DC-2900SL. + /// + internal static string MediumType_DC2900SL { + get { + return ResourceManager.GetString("MediumType_DC2900SL", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DC-9200 or DDS-4. + /// + internal static string MediumType_DC9200 { + get { + return ResourceManager.GetString("MediumType_DC9200", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DDS cleaning cartridge. + /// + internal static string MediumType_DDSCleaning { + get { + return ResourceManager.GetString("MediumType_DDSCleaning", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DLTtape S4. + /// + internal static string MediumType_DLTtapeS4 { + get { + return ResourceManager.GetString("MediumType_DLTtapeS4", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exatape 106m, DLTtape IV or Travan 5. + /// + internal static string MediumType_Exatape106m { + get { + return ResourceManager.GetString("MediumType_Exatape106m", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exatape 160m XL or Super DLTtape I. + /// + internal static string MediumType_Exatape106mXL { + get { + return ResourceManager.GetString("MediumType_Exatape106mXL", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exatape 112m. + /// + internal static string MediumType_Exatape112m { + get { + return ResourceManager.GetString("MediumType_Exatape112m", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exatape 125m. + /// + internal static string MediumType_Exatape125m { + get { + return ResourceManager.GetString("MediumType_Exatape125m", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exatape 150m. + /// + internal static string MediumType_Exatape150m { + get { + return ResourceManager.GetString("MediumType_Exatape150m", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exatape 15m, IBM MagStar or VXA. + /// + internal static string MediumType_Exatape15m { + get { + return ResourceManager.GetString("MediumType_Exatape15m", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exatape 170m. + /// + internal static string MediumType_Exatape170m { + get { + return ResourceManager.GetString("MediumType_Exatape170m", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exatape 225m. + /// + internal static string MediumType_Exatape225m { + get { + return ResourceManager.GetString("MediumType_Exatape225m", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exatape 22m. + /// + internal static string MediumType_Exatape22m { + get { + return ResourceManager.GetString("MediumType_Exatape22m", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exatape 22m AME. + /// + internal static string MediumType_Exatape22mAME { + get { + return ResourceManager.GetString("MediumType_Exatape22mAME", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exatape 40m. + /// + internal static string MediumType_Exatape40m { + get { + return ResourceManager.GetString("MediumType_Exatape40m", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exatape 45m. + /// + internal static string MediumType_Exatape45m { + get { + return ResourceManager.GetString("MediumType_Exatape45m", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exatape 54m or DLTtape III. + /// + internal static string MediumType_Exatape54m { + get { + return ResourceManager.GetString("MediumType_Exatape54m", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exatape 75m. + /// + internal static string MediumType_Exatape75m { + get { + return ResourceManager.GetString("MediumType_Exatape75m", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exatape 76m. + /// + internal static string MediumType_Exatape76m { + get { + return ResourceManager.GetString("MediumType_Exatape76m", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exatape 80m or DLTtape IIIxt. + /// + internal static string MediumType_Exatape80m { + get { + return ResourceManager.GetString("MediumType_Exatape80m", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LTO Ultrium. + /// + internal static string MediumType_LTO { + get { + return ResourceManager.GetString("MediumType_LTO", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LTO Ultrium-2. + /// + internal static string MediumType_LTO2 { + get { + return ResourceManager.GetString("MediumType_LTO2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LTO Ultrium-3. + /// + internal static string MediumType_LTO3 { + get { + return ResourceManager.GetString("MediumType_LTO3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LTO Ultrium-3 WORM. + /// + internal static string MediumType_LTO3WORM { + get { + return ResourceManager.GetString("MediumType_LTO3WORM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LTO Ultrium-4. + /// + internal static string MediumType_LTO4 { + get { + return ResourceManager.GetString("MediumType_LTO4", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LTO Ultrium-4 WORM. + /// + internal static string MediumType_LTO4WORM { + get { + return ResourceManager.GetString("MediumType_LTO4WORM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LTO Ultrium-5. + /// + internal static string MediumType_LTO5 { + get { + return ResourceManager.GetString("MediumType_LTO5", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LTO Ultrium-5 WORM. + /// + internal static string MediumType_LTO5WORM { + get { + return ResourceManager.GetString("MediumType_LTO5WORM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LTO Ultrium-6. + /// + internal static string MediumType_LTO6 { + get { + return ResourceManager.GetString("MediumType_LTO6", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LTO Ultrium-6 WORM. + /// + internal static string MediumType_LTO6WORM { + get { + return ResourceManager.GetString("MediumType_LTO6WORM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LTO Ultrium-7. + /// + internal static string MediumType_LTO7 { + get { + return ResourceManager.GetString("MediumType_LTO7", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LTO Ultrium-7 WORM. + /// + internal static string MediumType_LTO7WORM { + get { + return ResourceManager.GetString("MediumType_LTO7WORM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to LTO Ultrium WORM or cleaning cartridge. + /// + internal static string MediumType_LTOWORM { + get { + return ResourceManager.GetString("MediumType_LTOWORM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MLR1-26GB or DDS-3. + /// + internal static string MediumType_MLR1 { + get { + return ResourceManager.GetString("MediumType_MLR1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Super DLTtape II. + /// + internal static string MediumType_SDLT2 { + get { + return ResourceManager.GetString("MediumType_SDLT2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SLR-32. + /// + internal static string MediumType_SLR32 { + get { + return ResourceManager.GetString("MediumType_SLR32", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SLR-32SL. + /// + internal static string MediumType_SLR32SL { + get { + return ResourceManager.GetString("MediumType_SLR32SL", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SLR-40, SLR-60 or SLR-100. + /// + internal static string MediumType_SLR40_60_100 { + get { + return ResourceManager.GetString("MediumType_SLR40_60_100", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SLR-5. + /// + internal static string MediumType_SLR5 { + get { + return ResourceManager.GetString("MediumType_SLR5", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SLR-5SL. + /// + internal static string MediumType_SLR5SL { + get { + return ResourceManager.GetString("MediumType_SLR5SL", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SLRtape-100. + /// + internal static string MediumType_SLRtape100 { + get { + return ResourceManager.GetString("MediumType_SLRtape100", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SLRtape-140. + /// + internal static string MediumType_SLRtape140 { + get { + return ResourceManager.GetString("MediumType_SLRtape140", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SLRtape-24. + /// + internal static string MediumType_SLRtape24 { + get { + return ResourceManager.GetString("MediumType_SLRtape24", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SLRtape-24 SL. + /// + internal static string MediumType_SLRtape24SL { + get { + return ResourceManager.GetString("MediumType_SLRtape24SL", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SLRtape-40. + /// + internal static string MediumType_SLRtape40 { + get { + return ResourceManager.GetString("MediumType_SLRtape40", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SLRtape-50. + /// + internal static string MediumType_SLRtape50 { + get { + return ResourceManager.GetString("MediumType_SLRtape50", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SLRtape-50 SL. + /// + internal static string MediumType_SLRtape50SL { + get { + return ResourceManager.GetString("MediumType_SLRtape50SL", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SLRtape-60 or SLRtape-75. + /// + internal static string MediumType_SLRtape60 { + get { + return ResourceManager.GetString("MediumType_SLRtape60", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SLRtape-7. + /// + internal static string MediumType_SLRtape7 { + get { + return ResourceManager.GetString("MediumType_SLRtape7", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SLRtape-7 SL. + /// + internal static string MediumType_SLRtape7SL { + get { + return ResourceManager.GetString("MediumType_SLRtape7SL", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 6.3 mm tape with 12 tracks at 394 ftpmm or DC-9250. + /// + internal static string MediumType_Tape12 { + get { + return ResourceManager.GetString("MediumType_Tape12", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 6.3 mm tape with 24 tracks at 394 ftpmm or MLR1-26GBSL. + /// + internal static string MediumType_Tape24 { + get { + return ResourceManager.GetString("MediumType_Tape24", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Travan 7. + /// + internal static string MediumType_Travan7 { + get { + return ResourceManager.GetString("MediumType_Travan7", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to undefined. + /// + internal static string MediumType_undefined { + get { + return ResourceManager.GetString("MediumType_undefined", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to VStape I. + /// + internal static string MediumType_VStapeI { + get { + return ResourceManager.GetString("MediumType_VStapeI", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 120 mm Compact Disc Digital Audio. + /// + internal static string MediumTypes_CDDA { + get { + return ResourceManager.GetString("MediumTypes_CDDA", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 80 mm Compact Disc Digital Audio. + /// + internal static string MediumTypes_CDDA_80 { + get { + return ResourceManager.GetString("MediumTypes_CDDA_80", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 120 mm CD-R with data only. + /// + internal static string MediumTypes_CDR { + get { + return ResourceManager.GetString("MediumTypes_CDR", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 80 mm CD-R with data only. + /// + internal static string MediumTypes_CDR_80 { + get { + return ResourceManager.GetString("MediumTypes_CDR_80", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 120 mm CD-R with audio only. + /// + internal static string MediumTypes_CDR_DA { + get { + return ResourceManager.GetString("MediumTypes_CDR_DA", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 80 mm CD-R with audio only. + /// + internal static string MediumTypes_CDR_DA_80 { + get { + return ResourceManager.GetString("MediumTypes_CDR_DA_80", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 120 mm CD-R with data and audio. + /// + internal static string MediumTypes_CDR_Mixed { + get { + return ResourceManager.GetString("MediumTypes_CDR_Mixed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 120 mm CD-ROM. + /// + internal static string MediumTypes_CDROM { + get { + return ResourceManager.GetString("MediumTypes_CDROM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 80 mm CD-ROM. + /// + internal static string MediumTypes_CDROM_80 { + get { + return ResourceManager.GetString("MediumTypes_CDROM_80", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 120 mm CD-RW with data only. + /// + internal static string MediumTypes_CDRW { + get { + return ResourceManager.GetString("MediumTypes_CDRW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 80 mm CD-RW with data only. + /// + internal static string MediumTypes_CDRW_80 { + get { + return ResourceManager.GetString("MediumTypes_CDRW_80", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 120 mm CD-RW with audio only. + /// + internal static string MediumTypes_CDRW_DA { + get { + return ResourceManager.GetString("MediumTypes_CDRW_DA", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 80 mm CD-RW with audio only. + /// + internal static string MediumTypes_CDRW_DA_80 { + get { + return ResourceManager.GetString("MediumTypes_CDRW_DA_80", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 120 mm CD-RW with data and audio. + /// + internal static string MediumTypes_CDRW_Mixed { + get { + return ResourceManager.GetString("MediumTypes_CDRW_Mixed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 80 mm CD-RW with data and audio. + /// + internal static string MediumTypes_CDRW_Mixed_80 { + get { + return ResourceManager.GetString("MediumTypes_CDRW_Mixed_80", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 120 mm HD disc. + /// + internal static string MediumTypes_HD { + get { + return ResourceManager.GetString("MediumTypes_HD", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 80 mm HD disc. + /// + internal static string MediumTypes_HD_80 { + get { + return ResourceManager.GetString("MediumTypes_HD_80", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 120 mm Hybrid disc (Photo CD). + /// + internal static string MediumTypes_HybridCD { + get { + return ResourceManager.GetString("MediumTypes_HybridCD", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 120 mm Hybrid CD-R (Photo CD). + /// + internal static string MediumTypes_HybridCDR { + get { + return ResourceManager.GetString("MediumTypes_HybridCDR", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 80 mm Hybrid CD-R (Photo CD). + /// + internal static string MediumTypes_HybridCDR_80 { + get { + return ResourceManager.GetString("MediumTypes_HybridCDR_80", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 120 mm Hybrid CD-RW (Photo CD). + /// + internal static string MediumTypes_HybridCDRW { + get { + return ResourceManager.GetString("MediumTypes_HybridCDRW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 80 mm Hybrid CD-RW (Photo CD). + /// + internal static string MediumTypes_HybridCDRW_80 { + get { + return ResourceManager.GetString("MediumTypes_HybridCDRW_80", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 120 mm Compact Disc with data and audio. + /// + internal static string MediumTypes_MixedCD { + get { + return ResourceManager.GetString("MediumTypes_MixedCD", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 80 mm Compact Disc with data and audio. + /// + internal static string MediumTypes_MixedCD_80 { + get { + return ResourceManager.GetString("MediumTypes_MixedCD_80", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown size CD-R. + /// + internal static string MediumTypes_Unknown_CDR { + get { + return ResourceManager.GetString("MediumTypes_Unknown_CDR", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown size CD-RW. + /// + internal static string MediumTypes_Unknown_CDRW { + get { + return ResourceManager.GetString("MediumTypes_Unknown_CDRW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown size HD disc. + /// + internal static string MediumTypes_Unknown_HD { + get { + return ResourceManager.GetString("MediumTypes_Unknown_HD", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to megabytes. + /// + internal static string megabytes { + get { + return ResourceManager.GetString("megabytes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Minimum request size is {0}. + /// + internal static string Minimum_request_size_is_0 { + get { + return ResourceManager.GetString("Minimum_request_size_is_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Minor ATA version not specified. + /// + internal static string Minor_ATA_version_not_specified { + get { + return ResourceManager.GetString("Minor_ATA_version_not_specified", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MLR1-26GB. + /// + internal static string MLR1_26GB { + get { + return ResourceManager.GetString("MLR1_26GB", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MLR1-26GBSL. + /// + internal static string MLR1_26GBSL { + get { + return ResourceManager.GetString("MLR1_26GBSL", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MMC BD Read. + /// + internal static string MMC_BD_Read { + get { + return ResourceManager.GetString("MMC_BD_Read", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MMC BD Write. + /// + internal static string MMC_BD_Write { + get { + return ResourceManager.GetString("MMC_BD_Write", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MMC CD Read. + /// + internal static string MMC_CD_Read { + get { + return ResourceManager.GetString("MMC_CD_Read", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MMC Core Feature:. + /// + internal static string MMC_Core_Feature { + get { + return ResourceManager.GetString("MMC_Core_Feature", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MMC DVD Read. + /// + internal static string MMC_DVD_Read { + get { + return ResourceManager.GetString("MMC_DVD_Read", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MMC Embedded Changer:. + /// + internal static string MMC_Embedded_Changer { + get { + return ResourceManager.GetString("MMC_Embedded_Changer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MMC Enhanced Defect Reporting Feature:. + /// + internal static string MMC_Enhanced_Defect_Reporting_Feature { + get { + return ResourceManager.GetString("MMC_Enhanced_Defect_Reporting_Feature", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MMC Formattable:. + /// + internal static string MMC_Formattable { + get { + return ResourceManager.GetString("MMC_Formattable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MMC Hardware Defect Management:. + /// + internal static string MMC_Hardware_Defect_Management { + get { + return ResourceManager.GetString("MMC_Hardware_Defect_Management", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MMC Incremental Streaming Writable:. + /// + internal static string MMC_Incremental_Streaming_Writable { + get { + return ResourceManager.GetString("MMC_Incremental_Streaming_Writable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MMC Layer Jump Recording:. + /// + internal static string MMC_Layer_Jump_Recording { + get { + return ResourceManager.GetString("MMC_Layer_Jump_Recording", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MMC Morphing:. + /// + internal static string MMC_Morphing { + get { + return ResourceManager.GetString("MMC_Morphing", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MMC Random Readable. + /// + internal static string MMC_Random_Readable { + get { + return ResourceManager.GetString("MMC_Random_Readable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MMC Random Writable:. + /// + internal static string MMC_Random_Writable { + get { + return ResourceManager.GetString("MMC_Random_Writable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MMC Real Time Streaming:. + /// + internal static string MMC_Real_Time_Streaming_ { + get { + return ResourceManager.GetString("MMC_Real_Time_Streaming_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MMC Rigid Restricted Overwrite. + /// + internal static string MMC_Rigid_Restricted_Overwrite { + get { + return ResourceManager.GetString("MMC_Rigid_Restricted_Overwrite", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MMC Supported Profiles:. + /// + internal static string MMC_Supported_Profiles { + get { + return ResourceManager.GetString("MMC_Supported_Profiles", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MMC Write Once. + /// + internal static string MMC_Write_Once { + get { + return ResourceManager.GetString("MMC_Write_Once", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MMC Write Protect:. + /// + internal static string MMC_Write_Protect { + get { + return ResourceManager.GetString("MMC_Write_Protect", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mode 0.. + /// + internal static string Mode_0 { + get { + return ResourceManager.GetString("Mode_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mode 1.. + /// + internal static string Mode_1 { + get { + return ResourceManager.GetString("Mode_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mode 2.. + /// + internal static string Mode_2 { + get { + return ResourceManager.GetString("Mode_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Module revision: {0}. + /// + internal static string Module_revision_0 { + get { + return ResourceManager.GetString("Module_revision_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Moment of inertia: 0x{0:X2}. + /// + internal static string Moment_of_inertia_0 { + get { + return ResourceManager.GetString("Moment_of_inertia_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MRW is dirty. + /// + internal static string MRW_is_dirty { + get { + return ResourceManager.GetString("MRW_is_dirty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Multi-port device. + /// + internal static string Multi_port_device { + get { + return ResourceManager.GetString("Multi_port_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Multi-word DMA: . + /// + internal static string Multi_word_DMA { + get { + return ResourceManager.GetString("Multi_word_DMA", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MultiMediaCard Device Identification Register:. + /// + internal static string MultiMediaCard_Device_Identification_Register { + get { + return ResourceManager.GetString("MultiMediaCard_Device_Identification_Register", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MultiMediaCard Device Specific Data Register:. + /// + internal static string MultiMediaCard_Device_Specific_Data_Register_ { + get { + return ResourceManager.GetString("MultiMediaCard_Device_Specific_Data_Register_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MultiMediaCard Extended Device Specific Data Register:. + /// + internal static string MultiMediaCard_Extended_Device_Specific_Data_Register { + get { + return ResourceManager.GetString("MultiMediaCard_Extended_Device_Specific_Data_Register", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MultiMediaCard Operation Conditions Register:. + /// + internal static string MultiMediaCard_Operation_Conditions_Register { + get { + return ResourceManager.GetString("MultiMediaCard_Operation_Conditions_Register", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to muted. + /// + internal static string muted { + get { + return ResourceManager.GetString("muted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to NAA: {0}. + /// + internal static string NAA_0 { + get { + return ResourceManager.GetString("NAA_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to NAA: {0:X2}. + /// + internal static string NAA_0_X2 { + get { + return ResourceManager.GetString("NAA_0_X2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to NCQ Autosense is supported. + /// + internal static string NCQ_Autosense_is_supported { + get { + return ResourceManager.GetString("NCQ_Autosense_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to NCQ is supported. + /// + internal static string NCQ_is_supported { + get { + return ResourceManager.GetString("NCQ_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to NCQ priority is supported. + /// + internal static string NCQ_priority_is_supported { + get { + return ResourceManager.GetString("NCQ_priority_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to NCQ queue management is supported. + /// + internal static string NCQ_queue_management_is_supported { + get { + return ResourceManager.GetString("NCQ_queue_management_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to NCQ streaming is supported. + /// + internal static string NCQ_streaming_is_supported { + get { + return ResourceManager.GetString("NCQ_streaming_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Never apply the verify operation. + /// + internal static string Never_apply_the_verify_operation { + get { + return ResourceManager.GetString("Never_apply_the_verify_operation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Next Border-In first sector is PSN {0:X}h. + /// + internal static string Next_Border_In_first_sector_is_PSN_0 { + get { + return ResourceManager.GetString("Next_Border_In_first_sector_is_PSN_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No additional information.. + /// + internal static string No_additional_information { + get { + return ResourceManager.GetString("No_additional_information", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No deferred error will be reported to a rewind command. + /// + internal static string No_deferred_error_will_be_reported_to_a_rewind_command { + get { + return ResourceManager.GetString("No_deferred_error_will_be_reported_to_a_rewind_command", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No disc inserted, tray closed or caddy inserted. + /// + internal static string No_disc_inserted_tray_closed_or_caddy_inserted { + get { + return ResourceManager.GetString("No_disc_inserted_tray_closed_or_caddy_inserted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No drive region setting.. + /// + internal static string No_drive_region_setting { + get { + return ResourceManager.GetString("No_drive_region_setting", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No manufacturer information string.. + /// + internal static string No_manufacturer_information_string { + get { + return ResourceManager.GetString("No_manufacturer_information_string", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No pre-fetch will be done. + /// + internal static string No_pre_fetch_will_be_done { + get { + return ResourceManager.GetString("No_pre_fetch_will_be_done", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No product name string.. + /// + internal static string No_product_name_string { + get { + return ResourceManager.GetString("No_product_name_string", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No reporting of informational exception condition. + /// + internal static string No_reporting_of_informational_exception_condition { + get { + return ResourceManager.GetString("No_reporting_of_informational_exception_condition", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to no specific. + /// + internal static string no_specific_protocol { + get { + return ResourceManager.GetString("no_specific_protocol", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No unit attention on release. + /// + internal static string No_unit_attention_on_release { + get { + return ResourceManager.GetString("No_unit_attention_on_release", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Non-Volatile Cache:. + /// + internal static string Non_Volatile_Cache { + get { + return ResourceManager.GetString("Non_Volatile_Cache", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Non-Volatile Cache is {0} bytes. + /// + internal static string Non_Volatile_Cache_is_0_bytes { + get { + return ResourceManager.GetString("Non_Volatile_Cache_is_0_bytes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Non-Volatile cache is disabled. + /// + internal static string Non_Volatile_cache_is_disabled { + get { + return ResourceManager.GetString("Non_Volatile_cache_is_disabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Non-zero buffer offsets are supported. + /// + internal static string Non_zero_buffer_offsets_are_supported { + get { + return ResourceManager.GetString("Non_zero_buffer_offsets_are_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Non-zero buffer offsets are supported and enabled. + /// + internal static string Non_zero_buffer_offsets_are_supported_and_enabled { + get { + return ResourceManager.GetString("Non_zero_buffer_offsets_are_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to NOP is supported. + /// + internal static string NOP_is_supported { + get { + return ResourceManager.GetString("NOP_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to NOP is supported and enabled. + /// + internal static string NOP_is_supported_and_enabled { + get { + return ResourceManager.GetString("NOP_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Normal reset behaviour. + /// + internal static string Normal_reset_behaviour { + get { + return ResourceManager.GetString("Normal_reset_behaviour", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to North America NTSC.. + /// + internal static string North_America_NTSC { + get { + return ResourceManager.GetString("North_America_NTSC", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Not all 28-bit commands are supported. + /// + internal static string Not_all_28_bit_commands_are_supported { + get { + return ResourceManager.GetString("Not_all_28_bit_commands_are_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Number and size of partitions can be manually defined. + /// + internal static string Number_and_size_of_partitions_can_be_manually_defined { + get { + return ResourceManager.GetString("Number_and_size_of_partitions_can_be_manually_defined", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Number of partitions can be defined but their size is defined by the device. + /// + internal static string Number_of_partitions_can_be_defined_but_their_size_is_defined_by_the_device { + get { + return ResourceManager.GetString("Number_of_partitions_can_be_defined_but_their_size_is_defined_by_the_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Number of skip interval pointers: {0}. + /// + internal static string Number_of_skip_interval_pointers_0 { + get { + return ResourceManager.GetString("Number_of_skip_interval_pointers_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Number of skip track pointers: {0}. + /// + internal static string Number_of_skip_track_pointers_0 { + get { + return ResourceManager.GetString("Number_of_skip_track_pointers_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Object-based Storage Device. + /// + internal static string Object_based_Storage_Device { + get { + return ResourceManager.GetString("Object_based_Storage_Device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to On logical block {0}. + /// + internal static string On_logical_block_0 { + get { + return ResourceManager.GetString("On_logical_block_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to On medium insertion, it shall be loaded for auxiliary memory access only. + /// + internal static string On_medium_insertion_it_shall_be_loaded_for_auxiliary_memory_access_only { + get { + return ResourceManager.GetString("On_medium_insertion_it_shall_be_loaded_for_auxiliary_memory_access_only", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to On medium insertion, it shall be loaded for full access. + /// + internal static string On_medium_insertion_it_shall_be_loaded_for_full_access { + get { + return ResourceManager.GetString("On_medium_insertion_it_shall_be_loaded_for_full_access", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to On medium insertion, it shall not be loaded. + /// + internal static string On_medium_insertion_it_shall_not_be_loaded { + get { + return ResourceManager.GetString("On_medium_insertion_it_shall_not_be_loaded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to On reading an updated block drive will return RECOVERED ERROR. + /// + internal static string On_reading_an_updated_block_drive_will_return_RECOVERED_ERROR { + get { + return ResourceManager.GetString("On_reading_an_updated_block_drive_will_return_RECOVERED_ERROR", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to On segment {0}. + /// + internal static string On_segment_0 { + get { + return ResourceManager.GetString("On_segment_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Only a group is being formatted. + /// + internal static string Only_a_group_is_being_formatted { + get { + return ResourceManager.GetString("Only_a_group_is_being_formatted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Only report informational exception condition on request. + /// + internal static string Only_report_informational_exception_condition_on_request { + get { + return ResourceManager.GetString("Only_report_informational_exception_condition_on_request", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Only retries and CIRC are used.. + /// + internal static string Only_retries_and_CIRC_are_used { + get { + return ResourceManager.GetString("Only_retries_and_CIRC_are_used", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Only retries are used.. + /// + internal static string Only_retries_are_used { + get { + return ResourceManager.GetString("Only_retries_are_used", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to OPC values for {0}Kbit/sec.: {1}, {2}, {3}, {4}, {5}, {6}. + /// + internal static string OPC_values_for_0_Kbit_sec_1_2_3_4_5_6 { + get { + return ResourceManager.GetString("OPC_values_for_0_Kbit_sec_1_2_3_4_5_6", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Operating systems support is standard LTO. + /// + internal static string Operating_systems_support_is_standard_LTO { + get { + return ResourceManager.GetString("Operating_systems_support_is_standard_LTO", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Operating systems support is unknown code {0}. + /// + internal static string Operating_systems_support_is_unknown_code_0 { + get { + return ResourceManager.GetString("Operating_systems_support_is_unknown_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Optical card reader/writer device. + /// + internal static string Optical_card_reader_writer_device { + get { + return ResourceManager.GetString("Optical_card_reader_writer_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Optical memory device. + /// + internal static string Optical_memory_device { + get { + return ResourceManager.GetString("Optical_memory_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Optimal read size is {0} KiB. + /// + internal static string Optimal_read_size_is_0_KiB { + get { + return ResourceManager.GetString("Optimal_read_size_is_0_KiB", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Optimal trim size is {0} KiB. + /// + internal static string Optimal_trim_size_is_0_KiB { + get { + return ResourceManager.GetString("Optimal_trim_size_is_0_KiB", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Optimal write size is {0} KiB. + /// + internal static string Optimal_write_size_is_0_KiB { + get { + return ResourceManager.GetString("Optimal_write_size_is_0_KiB", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Optimum recording power: 0x{0:X2}. + /// + internal static string Optimum_recording_power_0 { + get { + return ResourceManager.GetString("Optimum_recording_power_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to OSA size: {0}. + /// + internal static string OSA_size_0 { + get { + return ResourceManager.GetString("OSA_size_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Output port 0 has channels . + /// + internal static string Output_port_0_has_channels { + get { + return ResourceManager.GetString("Output_port_0_has_channels", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Output port 1 has channels . + /// + internal static string Output_port_1_has_channels { + get { + return ResourceManager.GetString("Output_port_1_has_channels", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Output port 2 has channels . + /// + internal static string Output_port_2_has_channels { + get { + return ResourceManager.GetString("Output_port_2_has_channels", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Output port 3 has channels . + /// + internal static string Output_port_3_has_channels { + get { + return ResourceManager.GetString("Output_port_3_has_channels", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Overseas title: {0}. + /// + internal static string Overseas_title_0 { + get { + return ResourceManager.GetString("Overseas_title_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to OVERWRITE EXT is supported. + /// + internal static string OVERWRITE_EXT_is_supported { + get { + return ResourceManager.GetString("OVERWRITE_EXT_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PACKET is supported. + /// + internal static string PACKET_is_supported { + get { + return ResourceManager.GetString("PACKET_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PACKET is supported and enabled. + /// + internal static string PACKET_is_supported_and_enabled { + get { + return ResourceManager.GetString("PACKET_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Panic fence behaviour is enabled. + /// + internal static string Panic_fence_behaviour_is_enabled { + get { + return ResourceManager.GetString("Panic_fence_behaviour_is_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Parallel ATA device: . + /// + internal static string Parallel_ATA_device { + get { + return ResourceManager.GetString("Parallel_ATA_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Parallel SCSI. + /// + internal static string Parallel_SCSI { + get { + return ResourceManager.GetString("Parallel_SCSI", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Parameters can be saved. + /// + internal static string Parameters_can_be_saved { + get { + return ResourceManager.GetString("Parameters_can_be_saved", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Part version {0}. + /// + internal static string Part_version_0 { + get { + return ResourceManager.GetString("Part_version_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Partition {0} is {1} {2} long. + /// + internal static string Partition_0_is_1_2_long { + get { + return ResourceManager.GetString("Partition_0_is_1_2_long", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Partition {0} is {1} units long. + /// + internal static string Partition_0_is_1_units_long { + get { + return ResourceManager.GetString("Partition_0_is_1_units_long", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Partition {0} runs for rest of medium. + /// + internal static string Partition_0_runs_for_rest_of_medium { + get { + return ResourceManager.GetString("Partition_0_runs_for_rest_of_medium", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Partition alignment: {0} bytes. + /// + internal static string Partition_alignment_0_bytes { + get { + return ResourceManager.GetString("Partition_alignment_0_bytes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Partition parameters will not be applied until a FORMAT MEDIUM command is received. + /// + internal static string Partition_parameters_will_not_be_applied_until_a_FORMAT_MEDIUM_command_is_received { + get { + return ResourceManager.GetString("Partition_parameters_will_not_be_applied_until_a_FORMAT_MEDIUM_command_is_receive" + + "d", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Partitions are defined in bytes. + /// + internal static string Partitions_are_defined_in_bytes { + get { + return ResourceManager.GetString("Partitions_are_defined_in_bytes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Partitions are defined in kilobytes. + /// + internal static string Partitions_are_defined_in_kilobytes { + get { + return ResourceManager.GetString("Partitions_are_defined_in_kilobytes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Partitions are defined in megabytes. + /// + internal static string Partitions_are_defined_in_megabytes { + get { + return ResourceManager.GetString("Partitions_are_defined_in_megabytes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Partitions are defined in units of {0} bytes. + /// + internal static string Partitions_are_defined_in_units_of_0_bytes { + get { + return ResourceManager.GetString("Partitions_are_defined_in_units_of_0_bytes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Partitions are fixed under device definitions. + /// + internal static string Partitions_are_fixed_under_device_definitions { + get { + return ResourceManager.GetString("Partitions_are_fixed_under_device_definitions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PCI Express. + /// + internal static string PCI_Express { + get { + return ResourceManager.GetString("PCI_Express", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PCMCIA Device Geometry Tuples:. + /// + internal static string PCMCIA_Device_Geometry_Tuples { + get { + return ResourceManager.GetString("PCMCIA_Device_Geometry_Tuples", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PCMCIA Level 1 Version / Product Information Tuple:. + /// + internal static string PCMCIA_Level_1_Version_Product_Information_Tuple { + get { + return ResourceManager.GetString("PCMCIA_Level_1_Version_Product_Information_Tuple", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Performance is limited using factor {0}. + /// + internal static string Performance_is_limited_using_factor_0 { + get { + return ResourceManager.GetString("Performance_is_limited_using_factor_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Performance is not limited. + /// + internal static string Performance_is_not_limited { + get { + return ResourceManager.GetString("Performance_is_not_limited", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Peripherals:. + /// + internal static string Peripherals { + get { + return ResourceManager.GetString("Peripherals", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Permanent write protect is enabled. + /// + internal static string Permanent_write_protect_is_enabled { + get { + return ResourceManager.GetString("Permanent_write_protect_is_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Permanent write protection is disabled.. + /// + internal static string Permanent_write_protection_is_disabled { + get { + return ResourceManager.GetString("Permanent_write_protection_is_disabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Permanent write protection of boot areas is disabled.. + /// + internal static string Permanent_write_protection_of_boot_areas_is_disabled { + get { + return ResourceManager.GetString("Permanent_write_protection_of_boot_areas_is_disabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Permanent write protection will be applied to selected group.. + /// + internal static string Permanent_write_protection_will_be_applied_to_selected_group { + get { + return ResourceManager.GetString("Permanent_write_protection_will_be_applied_to_selected_group", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Persistent write protect is enabled. + /// + internal static string Persistent_write_protect_is_enabled { + get { + return ResourceManager.GetString("Persistent_write_protect_is_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PFI in extra Border zone starts at PSN {0:X}h. + /// + internal static string PFI_in_extra_Border_zone_starts_at_PSN_0 { + get { + return ResourceManager.GetString("PFI_in_extra_Border_zone_starts_at_PSN_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PHY Event counters are supported. + /// + internal static string PHY_Event_counters_are_supported { + get { + return ResourceManager.GetString("PHY_Event_counters_are_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Physical sector size: {0} bytes. + /// + internal static string Physical_sector_size_0_bytes { + get { + return ResourceManager.GetString("Physical_sector_size_0_bytes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pin 1 indicates disk change reset when active high. + /// + internal static string Pin_1_indicates_disk_change_reset_when_active_high { + get { + return ResourceManager.GetString("Pin_1_indicates_disk_change_reset_when_active_high", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pin 1 indicates disk change reset when active low. + /// + internal static string Pin_1_indicates_disk_change_reset_when_active_low { + get { + return ResourceManager.GetString("Pin_1_indicates_disk_change_reset_when_active_low", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pin 1 indicates unknown function {0} when active high. + /// + internal static string Pin_1_indicates_unknown_function_0_when_active_high { + get { + return ResourceManager.GetString("Pin_1_indicates_unknown_function_0_when_active_high", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pin 1 indicates unknown function {0} when active low. + /// + internal static string Pin_1_indicates_unknown_function_0_when_active_low { + get { + return ResourceManager.GetString("Pin_1_indicates_unknown_function_0_when_active_low", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pin 1 is unconnected. + /// + internal static string Pin_1_is_unconnected { + get { + return ResourceManager.GetString("Pin_1_is_unconnected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pin 2 indicates unknown function {0} when active high. + /// + internal static string Pin_2_indicates_unknown_function_0_when_active_high { + get { + return ResourceManager.GetString("Pin_2_indicates_unknown_function_0_when_active_high", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pin 2 indicates unknown function {0} when active low. + /// + internal static string Pin_2_indicates_unknown_function_0_when_active_low { + get { + return ResourceManager.GetString("Pin_2_indicates_unknown_function_0_when_active_low", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pin 2 is unconnected. + /// + internal static string Pin_2_is_unconnected { + get { + return ResourceManager.GetString("Pin_2_is_unconnected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pin 34 indicates disk has changed when active high. + /// + internal static string Pin_34_indicates_disk_has_changed_when_active_high { + get { + return ResourceManager.GetString("Pin_34_indicates_disk_has_changed_when_active_high", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pin 34 indicates disk has changed when active low. + /// + internal static string Pin_34_indicates_disk_has_changed_when_active_low { + get { + return ResourceManager.GetString("Pin_34_indicates_disk_has_changed_when_active_low", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pin 34 indicates drive is ready when active high. + /// + internal static string Pin_34_indicates_drive_is_ready_when_active_high { + get { + return ResourceManager.GetString("Pin_34_indicates_drive_is_ready_when_active_high", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pin 34 indicates drive is ready when active low. + /// + internal static string Pin_34_indicates_drive_is_ready_when_active_low { + get { + return ResourceManager.GetString("Pin_34_indicates_drive_is_ready_when_active_low", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pin 34 indicates unknown function {0} when active high. + /// + internal static string Pin_34_indicates_unknown_function_0_when_active_high { + get { + return ResourceManager.GetString("Pin_34_indicates_unknown_function_0_when_active_high", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pin 34 indicates unknown function {0} when active low. + /// + internal static string Pin_34_indicates_unknown_function_0_when_active_low { + get { + return ResourceManager.GetString("Pin_34_indicates_unknown_function_0_when_active_low", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pin 34 is unconnected. + /// + internal static string Pin_34_is_unconnected { + get { + return ResourceManager.GetString("Pin_34_is_unconnected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pin 4 indicates drive is in use when active high. + /// + internal static string Pin_4_indicates_drive_is_in_use_when_active_high { + get { + return ResourceManager.GetString("Pin_4_indicates_drive_is_in_use_when_active_high", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pin 4 indicates drive is in use when active low. + /// + internal static string Pin_4_indicates_drive_is_in_use_when_active_low { + get { + return ResourceManager.GetString("Pin_4_indicates_drive_is_in_use_when_active_low", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pin 4 indicates eject when active high. + /// + internal static string Pin_4_indicates_eject_when_active_high { + get { + return ResourceManager.GetString("Pin_4_indicates_eject_when_active_high", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pin 4 indicates eject when active low. + /// + internal static string Pin_4_indicates_eject_when_active_low { + get { + return ResourceManager.GetString("Pin_4_indicates_eject_when_active_low", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pin 4 indicates head load when active high. + /// + internal static string Pin_4_indicates_head_load_when_active_high { + get { + return ResourceManager.GetString("Pin_4_indicates_head_load_when_active_high", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pin 4 indicates head load when active low. + /// + internal static string Pin_4_indicates_head_load_when_active_low { + get { + return ResourceManager.GetString("Pin_4_indicates_head_load_when_active_low", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pin 4 indicates unknown function {0} when active high. + /// + internal static string Pin_4_indicates_unknown_function_0_when_active_high { + get { + return ResourceManager.GetString("Pin_4_indicates_unknown_function_0_when_active_high", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pin 4 indicates unknown function {0} when active low. + /// + internal static string Pin_4_indicates_unknown_function_0_when_active_low { + get { + return ResourceManager.GetString("Pin_4_indicates_unknown_function_0_when_active_low", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pin 4 is unconnected. + /// + internal static string Pin_4_is_unconnected { + get { + return ResourceManager.GetString("Pin_4_is_unconnected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PIO timing mode: {0}. + /// + internal static string PIO_timing_mode_0 { + get { + return ResourceManager.GetString("PIO_timing_mode_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pitch size is 0.147 μm/bit. + /// + internal static string Pitch_size_is_0_147_μm_bit { + get { + return ResourceManager.GetString("Pitch_size_is_0_147_μm_bit", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pitch size is 0.153 μm/bit. + /// + internal static string Pitch_size_is_0_153_μm_bit { + get { + return ResourceManager.GetString("Pitch_size_is_0_153_μm_bit", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pitch size is 0.267 μm/bit. + /// + internal static string Pitch_size_is_0_267_μm_bit { + get { + return ResourceManager.GetString("Pitch_size_is_0_267_μm_bit", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pitch size is 0.353 μm/bit. + /// + internal static string Pitch_size_is_0_353_μm_bit { + get { + return ResourceManager.GetString("Pitch_size_is_0_353_μm_bit", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pitch size is between 0.130 μm/bit and 0.140 μm/bit. + /// + internal static string Pitch_size_is_between_0_130_μm_bit_and_0_140_μm_bit { + get { + return ResourceManager.GetString("Pitch_size_is_between_0_130_μm_bit_and_0_140_μm_bit", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pitch size is between 0.140 μm/bit and 0.148 μm/bit. + /// + internal static string Pitch_size_is_between_0_140_μm_bit_and_0_148_μm_bit { + get { + return ResourceManager.GetString("Pitch_size_is_between_0_140_μm_bit_and_0_148_μm_bit", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pitch size is between 0.409 μm/bit and 0.435 μm/bit. + /// + internal static string Pitch_size_is_between_0_409_μm_bit_and_0_435_μm_bit { + get { + return ResourceManager.GetString("Pitch_size_is_between_0_409_μm_bit_and_0_435_μm_bit", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to POP device. + /// + internal static string POP_device { + get { + return ResourceManager.GetString("POP_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Port A link is down. + /// + internal static string Port_A_link_is_down { + get { + return ResourceManager.GetString("Port_A_link_is_down", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Port A uses Parallel SCSI Ultra-160 interface. + /// + internal static string Port_A_uses_Parallel_SCSI_Ultra_160_interface { + get { + return ResourceManager.GetString("Port_A_uses_Parallel_SCSI_Ultra_160_interface", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Position {0:X2}:{1:X2}:{2:X2} (LBA {3}). + /// + internal static string Position_0_1_2_LBA_3 { + get { + return ResourceManager.GetString("Position_0_1_2_LBA_3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Power cycled write protection is disabled.. + /// + internal static string Power_cycled_write_protection_is_disabled { + get { + return ResourceManager.GetString("Power_cycled_write_protection_is_disabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Power cycled write protection of boot areas is disabled.. + /// + internal static string Power_cycled_write_protection_of_boot_areas_is_disabled { + get { + return ResourceManager.GetString("Power_cycled_write_protection_of_boot_areas_is_disabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Power cycled write protection will be applied to selected group.. + /// + internal static string Power_cycled_write_protection_will_be_applied_to_selected_group { + get { + return ResourceManager.GetString("Power_cycled_write_protection_will_be_applied_to_selected_group", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Power management is supported. + /// + internal static string Power_management_is_supported { + get { + return ResourceManager.GetString("Power_management_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Power management is supported and enabled. + /// + internal static string Power_management_is_supported_and_enabled { + get { + return ResourceManager.GetString("Power_management_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Power mode feature set is supported. + /// + internal static string Power_mode_feature_set_is_supported { + get { + return ResourceManager.GetString("Power_mode_feature_set_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Power mode feature set is supported and enabled. + /// + internal static string Power_mode_feature_set_is_supported_and_enabled { + get { + return ResourceManager.GetString("Power_mode_feature_set_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Power-On Self-Test is disabled. + /// + internal static string Power_On_Self_Test_is_disabled { + get { + return ResourceManager.GetString("Power_On_Self_Test_is_disabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Power-On Self-Test is enabled. + /// + internal static string Power_On_Self_Test_is_enabled { + get { + return ResourceManager.GetString("Power_On_Self_Test_is_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Power-up in standby is supported. + /// + internal static string Power_up_in_standby_is_supported { + get { + return ResourceManager.GetString("Power_up_in_standby_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Power-up in standby is supported and enabled. + /// + internal static string Power_up_in_standby_is_supported_and_enabled { + get { + return ResourceManager.GetString("Power_up_in_standby_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pre-fetch can continue across discontinuities (such as cylinders or tracks). + /// + internal static string Pre_fetch_can_continue_across_discontinuities_such_as_cylinders_or_tracks { + get { + return ResourceManager.GetString("Pre_fetch_can_continue_across_discontinuities_such_as_cylinders_or_tracks", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pre-fetch should be aborted upon receiving a new command. + /// + internal static string Pre_fetch_should_be_aborted_upon_receiving_a_new_command { + get { + return ResourceManager.GetString("Pre_fetch_should_be_aborted_upon_receiving_a_new_command", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pre-fetch values indicate a block multiplier. + /// + internal static string Pre_fetch_values_indicate_a_block_multiplier { + get { + return ResourceManager.GetString("Pre_fetch_values_indicate_a_block_multiplier", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pre-fetch will be done for READ commands of {0} blocks or less. + /// + internal static string Pre_fetch_will_be_done_for_READ_commands_of_0_blocks_or_less { + get { + return ResourceManager.GetString("Pre_fetch_will_be_done_for_READ_commands_of_0_blocks_or_less", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Primary code: {0:X2}h. + /// + internal static string Primary_code_0 { + get { + return ResourceManager.GetString("Primary_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Primary Spare Area stats at PSN {0:X}h and ends at PSN {1:X}h, inclusively. + /// + internal static string Primary_Spare_Area_stats_at_PSN_0_and_ends_at_PSN_1_inclusively { + get { + return ResourceManager.GetString("Primary_Spare_Area_stats_at_PSN_0_and_ends_at_PSN_1_inclusively", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Printer device. + /// + internal static string Printer_device { + get { + return ResourceManager.GetString("Printer_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Processor device. + /// + internal static string Processor_device { + get { + return ResourceManager.GetString("Processor_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Producer: {0}. + /// + internal static string Producer_0 { + get { + return ResourceManager.GetString("Producer_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Product code: {0}. + /// + internal static string Product_code_0 { + get { + return ResourceManager.GetString("Product_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Product CRC: 0x{0:X8}. + /// + internal static string Product_CRC_0 { + get { + return ResourceManager.GetString("Product_CRC_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Product family: {0}. + /// + internal static string Product_family_0 { + get { + return ResourceManager.GetString("Product_family_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Product family is 10.0/20.0 GB. + /// + internal static string Product_family_is_10_0_20_0_GB { + get { + return ResourceManager.GetString("Product_family_is_10_0_20_0_GB", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Product family is 15.0/30.0 GB. + /// + internal static string Product_family_is_15_0_30_0_GB { + get { + return ResourceManager.GetString("Product_family_is_15_0_30_0_GB", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Product family is 2.6 GB. + /// + internal static string Product_family_is_2_6_GB { + get { + return ResourceManager.GetString("Product_family_is_2_6_GB", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Product family is 20.0/40.0 GB. + /// + internal static string Product_family_is_20_0_40_0_GB { + get { + return ResourceManager.GetString("Product_family_is_20_0_40_0_GB", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Product family is 6.0 GB. + /// + internal static string Product_family_is_6_0_GB { + get { + return ResourceManager.GetString("Product_family_is_6_0_GB", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Product family is not specified. + /// + internal static string Product_family_is_not_specified { + get { + return ResourceManager.GetString("Product_family_is_not_specified", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Product name: {0}. + /// + internal static string Product_name_0 { + get { + return ResourceManager.GetString("Product_name_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Product revision: {0:X2}.{1:X2}. + /// + internal static string Product_revision_0_1 { + get { + return ResourceManager.GetString("Product_revision_0_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Product serial number: {0}. + /// + internal static string Product_serial_number_0 { + get { + return ResourceManager.GetString("Product_serial_number_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Product version: {0}. + /// + internal static string Product_version_0 { + get { + return ResourceManager.GetString("Product_version_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Profile {0}: {1}. + /// + internal static string Profile_0_1 { + get { + return ResourceManager.GetString("Profile_0_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Prologue found at {0}. + /// + internal static string Prologue_found_at_0 { + get { + return ResourceManager.GetString("Prologue_found_at_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Protector information checking is disabled. + /// + internal static string Protector_information_checking_is_disabled { + get { + return ResourceManager.GetString("Protector_information_checking_is_disabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Protocol (ATA/ATAPI) specific descriptor with unknown format (hex): {0}. + /// + internal static string Protocol_ATA_ATAPI_specific_descriptor_with_unknown_format_hex_0 { + get { + return ResourceManager.GetString("Protocol_ATA_ATAPI_specific_descriptor_with_unknown_format_hex_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Protocol (Automation/Drive Interface Transport) specific descriptor with unknown format (hex): {0}. + /// + internal static string Protocol_Automation_Drive_Interface_Transport_specific_descriptor_with_unknown_format_hex_0 { + get { + return ResourceManager.GetString("Protocol_Automation_Drive_Interface_Transport_specific_descriptor_with_unknown_fo" + + "rmat_hex_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Protocol (Fibre Channel) specific descriptor with unknown format (hex): {0}. + /// + internal static string Protocol_Fibre_Channel_specific_descriptor_with_unknown_format_hex_0 { + get { + return ResourceManager.GetString("Protocol_Fibre_Channel_specific_descriptor_with_unknown_format_hex_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Protocol (IEEE 1394) specific descriptor with unknown format (hex): {0}. + /// + internal static string Protocol_IEEE_1394_specific_descriptor_with_unknown_format_hex_0 { + get { + return ResourceManager.GetString("Protocol_IEEE_1394_specific_descriptor_with_unknown_format_hex_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Protocol (Internet SCSI) specific descriptor with unknown format (hex): {0}. + /// + internal static string Protocol_Internet_SCSI_specific_descriptor_with_unknown_format_hex_0 { + get { + return ResourceManager.GetString("Protocol_Internet_SCSI_specific_descriptor_with_unknown_format_hex_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Protocol (Parallel SCSI) specific descriptor with unknown format (hex): {0}. + /// + internal static string Protocol_Parallel_SCSI_specific_descriptor_with_unknown_format_hex_0 { + get { + return ResourceManager.GetString("Protocol_Parallel_SCSI_specific_descriptor_with_unknown_format_hex_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Protocol (PCI Express) specific descriptor with unknown format (hex): {0}. + /// + internal static string Protocol_PCI_Express_specific_descriptor_with_unknown_format_hex_0 { + get { + return ResourceManager.GetString("Protocol_PCI_Express_specific_descriptor_with_unknown_format_hex_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Protocol (SCSI Remote Direct Memory Access) specific descriptor with unknown format (hex): {0}. + /// + internal static string Protocol_SCSI_Remote_Direct_Memory_Access_specific_descriptor_with_unknown_format_hex_0 { + get { + return ResourceManager.GetString("Protocol_SCSI_Remote_Direct_Memory_Access_specific_descriptor_with_unknown_format" + + "_hex_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Protocol (SCSIe) specific descriptor: Routing ID is {0}. + /// + internal static string Protocol_SCSIe_specific_descriptor_Routing_ID_is_0 { + get { + return ResourceManager.GetString("Protocol_SCSIe_specific_descriptor_Routing_ID_is_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Protocol (Serial Attachment SCSI) specific descriptor with unknown format (hex): {0}. + /// + internal static string Protocol_Serial_Attachment_SCSI_specific_descriptor_with_unknown_format_hex_0 { + get { + return ResourceManager.GetString("Protocol_Serial_Attachment_SCSI_specific_descriptor_with_unknown_format_hex_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Protocol (SSA) specific descriptor with unknown format (hex): {0}. + /// + internal static string Protocol_SSA_specific_descriptor_with_unknown_format_hex_0 { + get { + return ResourceManager.GetString("Protocol_SSA_specific_descriptor_with_unknown_format_hex_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Protocol (UAS) specific descriptor: USB address {0} interface {1}. + /// + internal static string Protocol_UAS_specific_descriptor_USB_address_0_interface_1 { + get { + return ResourceManager.GetString("Protocol_UAS_specific_descriptor_USB_address_0_interface_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Protocol (unknown code {0}) specific descriptor with unknown format (hex): {1}. + /// + internal static string Protocol_unknown_code_0_specific_descriptor_with_unknown_format_hex_1 { + get { + return ResourceManager.GetString("Protocol_unknown_code_0_specific_descriptor_with_unknown_format_hex_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Protocol (unknown) specific descriptor with unknown format (hex): {0}. + /// + internal static string Protocol_unknown_specific_descriptor_with_unknown_format_hex_0 { + get { + return ResourceManager.GetString("Protocol_unknown_specific_descriptor_with_unknown_format_hex_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PSN of User Data Area's LSN 0: 0x{0:X8}. + /// + internal static string PSN_of_User_Data_Areas_LSN_0_0 { + get { + return ResourceManager.GetString("PSN_of_User_Data_Areas_LSN_0_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Q subchannel mode {0}. + /// + internal static string Q_subchannel_mode_0 { + get { + return ResourceManager.GetString("Q_subchannel_mode_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Q subchannel mode not given. + /// + internal static string Q_subchannel_mode_not_given { + get { + return ResourceManager.GetString("Q_subchannel_mode_not_given", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Q subchannel stores current position. + /// + internal static string Q_subchannel_stores_current_position { + get { + return ResourceManager.GetString("Q_subchannel_stores_current_position", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Q subchannel stores ISRC. + /// + internal static string Q_subchannel_stores_ISRC { + get { + return ResourceManager.GetString("Q_subchannel_stores_ISRC", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Q subchannel stores media catalog number. + /// + internal static string Q_subchannel_stores_media_catalog_number { + get { + return ResourceManager.GetString("Q_subchannel_stores_media_catalog_number", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Q subchannel stores track pointer. + /// + internal static string Q_subchannel_stores_track_pointer { + get { + return ResourceManager.GetString("Q_subchannel_stores_track_pointer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Q subchannel stores video track pointer. + /// + internal static string Q_subchannel_stores_video_track_pointer { + get { + return ResourceManager.GetString("Q_subchannel_stores_video_track_pointer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to QIC-11. + /// + internal static string QIC11 { + get { + return ResourceManager.GetString("QIC11", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to QIC-120: 6.3 mm 15-Track Magnetic Tape Cartridge, 394 bpmm, GCR. + /// + internal static string QIC120 { + get { + return ResourceManager.GetString("QIC120", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to QIC-1350: 6.3 mm 30-Track Magnetic Tape Cartridge, 2034 bpmm, RLL. + /// + internal static string QIC1350 { + get { + return ResourceManager.GetString("QIC1350", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to QIC-150: 6.3 mm 18-Track Magnetic Tape Cartridge, 394 bpmm, GCR. + /// + internal static string QIC150 { + get { + return ResourceManager.GetString("QIC150", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to QIC-320: 6.3 mm 26-Track Magnetic Tape Cartridge, 630 bpmm, GCR. + /// + internal static string QIC320 { + get { + return ResourceManager.GetString("QIC320", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Quadraphonic audio track with 50/15 μs pre-emphasis. + /// + internal static string Quadraphonic_audio_track_with_50_15_us_pre_emphasis { + get { + return ResourceManager.GetString("Quadraphonic_audio_track_with_50_15_us_pre_emphasis", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Quadraphonic audio track with no pre-emphasis. + /// + internal static string Quadraphonic_audio_track_with_no_pre_emphasis { + get { + return ResourceManager.GetString("Quadraphonic_audio_track_with_no_pre_emphasis", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to EEPROM firmware checksum: 0x{0:X4}. + /// + internal static string Quantum_EEPROM_firmware_checksum_0 { + get { + return ResourceManager.GetString("Quantum_EEPROM_firmware_checksum_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Quantum Firmware Build Information page:. + /// + internal static string Quantum_Quantum_Firmware_Build_Information_page { + get { + return ResourceManager.GetString("Quantum_Quantum_Firmware_Build_Information_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Read/write firmware build date: {0}. + /// + internal static string Quantum_Read_write_firmware_build_date_0 { + get { + return ResourceManager.GetString("Quantum_Read_write_firmware_build_date_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Read/write firmware checksum: 0x{0:X8}. + /// + internal static string Quantum_Read_write_firmware_checksum_0 { + get { + return ResourceManager.GetString("Quantum_Read_write_firmware_checksum_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Servo firmware checksum: 0x{0:X4}. + /// + internal static string Quantum_Servo_firmware_checksum_0 { + get { + return ResourceManager.GetString("Quantum_Servo_firmware_checksum_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Quantum vendor-specific information:. + /// + internal static string Quantum_vendor_specific_information { + get { + return ResourceManager.GetString("Quantum_vendor_specific_information", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Read after TRIM is deterministic. + /// + internal static string Read_after_TRIM_is_deterministic { + get { + return ResourceManager.GetString("Read_after_TRIM_is_deterministic", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Read after TRIM returns empty data. + /// + internal static string Read_after_TRIM_returns_empty_data { + get { + return ResourceManager.GetString("Read_after_TRIM_returns_empty_data", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Read-ahead is disabled. + /// + internal static string Read_ahead_is_disabled { + get { + return ResourceManager.GetString("Read_ahead_is_disabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Read block: {0} bytes. + /// + internal static string Read_block_0_bytes { + get { + return ResourceManager.GetString("Read_block_0_bytes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Read block length is {0} bytes. + /// + internal static string Read_block_length_is_0_bytes { + get { + return ResourceManager.GetString("Read_block_length_is_0_bytes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Read block length size is defined in extended CSD. + /// + internal static string Read_block_length_size_is_defined_in_extended_CSD { + get { + return ResourceManager.GetString("Read_block_length_size_is_defined_in_extended_CSD", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to READ BUFFER DMA is supported. + /// + internal static string READ_BUFFER_DMA_is_supported { + get { + return ResourceManager.GetString("READ_BUFFER_DMA_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to READ BUFFER is supported. + /// + internal static string READ_BUFFER_is_supported { + get { + return ResourceManager.GetString("READ_BUFFER_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to READ BUFFER is supported and enabled. + /// + internal static string READ_BUFFER_is_supported_and_enabled { + get { + return ResourceManager.GetString("READ_BUFFER_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Read buffer shall have an empty ratio of {0} before more data is read from medium. + /// + internal static string Read_buffer_shall_have_an_empty_ratio_of_0_before_more_data_is_read_from_medium { + get { + return ResourceManager.GetString("Read_buffer_shall_have_an_empty_ratio_of_0_before_more_data_is_read_from_medium", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Read-cache is enabled. + /// + internal static string Read_cache_is_enabled { + get { + return ResourceManager.GetString("Read_cache_is_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Read commands can cross physical block boundaries. + /// + internal static string Read_commands_can_cross_physical_block_boundaries { + get { + return ResourceManager.GetString("Read_commands_can_cross_physical_block_boundaries", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to READ DMA QUEUED and WRITE DMA QUEUED are supported. + /// + internal static string READ_DMA_QUEUED_and_WRITE_DMA_QUEUED_are_supported { + get { + return ResourceManager.GetString("READ_DMA_QUEUED_and_WRITE_DMA_QUEUED_are_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to READ DMA QUEUED and WRITE DMA QUEUED are supported and enabled. + /// + internal static string READ_DMA_QUEUED_and_WRITE_DMA_QUEUED_are_supported_and_enabled { + get { + return ResourceManager.GetString("READ_DMA_QUEUED_and_WRITE_DMA_QUEUED_are_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to READ LOG DMA EXT is supported. + /// + internal static string READ_LOG_DMA_EXT_is_supported { + get { + return ResourceManager.GetString("READ_LOG_DMA_EXT_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Read-only block device. + /// + internal static string Read_only_block_device { + get { + return ResourceManager.GetString("Read_only_block_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Read/Write block device. + /// + internal static string Read_Write_block_device { + get { + return ResourceManager.GetString("Read_Write_block_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to READ/WRITE DMA EXT GPL are supported. + /// + internal static string READ_WRITE_DMA_EXT_GPL_are_supported { + get { + return ResourceManager.GetString("READ_WRITE_DMA_EXT_GPL_are_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to READ/WRITE DMA EXT GPL are supported and enabled. + /// + internal static string READ_WRITE_DMA_EXT_GPL_are_supported_and_enabled { + get { + return ResourceManager.GetString("READ_WRITE_DMA_EXT_GPL_are_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to READ/WRITE LONG has {0} extra bytes. + /// + internal static string READ_WRITE_LONG_has_0_extra_bytes { + get { + return ResourceManager.GetString("READ_WRITE_LONG_has_0_extra_bytes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Real-time block.. + /// + internal static string Real_time_block { + get { + return ResourceManager.GetString("Real_time_block", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Receipt of host initiated power management requests is supported. + /// + internal static string Receipt_of_host_initiated_power_management_requests_is_supported { + get { + return ResourceManager.GetString("Receipt_of_host_initiated_power_management_requests_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to RECEIVE FPDMA QUEUED and SEND FPDMA QUEUED are supported. + /// + internal static string RECEIVE_FPDMA_QUEUED_and_SEND_FPDMA_QUEUED_are_supported { + get { + return ResourceManager.GetString("RECEIVE_FPDMA_QUEUED_and_SEND_FPDMA_QUEUED_are_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Recommended erasing power ratio is {0} ε. + /// + internal static string Recommended_erasing_power_ratio_is_0 { + get { + return ResourceManager.GetString("Recommended_erasing_power_ratio_is_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Recommended recording power is {0} mW. + /// + internal static string Recommended_recording_power_is_0_mW { + get { + return ResourceManager.GetString("Recommended_recording_power_is_0_mW", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Recorded marks have a higher reflectivity than unrecorded ones (LTH disc).. + /// + internal static string Recorded_marks_have_a_higher_reflectivity_than_unrecorded_ones_LTH_disc { + get { + return ResourceManager.GetString("Recorded_marks_have_a_higher_reflectivity_than_unrecorded_ones_LTH_disc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Recorded marks have a lower reflectivity than unrecorded ones (HTL disc).. + /// + internal static string Recorded_marks_have_a_lower_reflectivity_than_unrecorded_ones_HTL_disc { + get { + return ResourceManager.GetString("Recorded_marks_have_a_lower_reflectivity_than_unrecorded_ones_HTL_disc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Recording power is not specified. + /// + internal static string Recording_power_is_not_specified { + get { + return ResourceManager.GetString("Recording_power_is_not_specified", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Recovered buffer data comes in FIFO order. + /// + internal static string Recovered_buffer_data_comes_in_FIFO_order { + get { + return ResourceManager.GetString("Recovered_buffer_data_comes_in_FIFO_order", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Recovered buffer data comes in LIFO order. + /// + internal static string Recovered_buffer_data_comes_in_LIFO_order { + get { + return ResourceManager.GetString("Recovered_buffer_data_comes_in_LIFO_order", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Recovered errors will be reported.. + /// + internal static string Recovered_errors_will_be_reported { + get { + return ResourceManager.GetString("Recovered_errors_will_be_reported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Recovered errors will be reported and aborted with CHECK CONDITION.. + /// + internal static string Recovered_errors_will_be_reported_and_aborted_with_CHECK_CONDITION { + get { + return ResourceManager.GetString("Recovered_errors_will_be_reported_and_aborted_with_CHECK_CONDITION", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Recovered errors will not be reported.. + /// + internal static string Recovered_errors_will_not_be_reported { + get { + return ResourceManager.GetString("Recovered_errors_will_not_be_reported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reference speed is 2x. + /// + internal static string Reference_speed_is_2x { + get { + return ResourceManager.GetString("Reference_speed_is_2x", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reference speed is 4x. + /// + internal static string Reference_speed_is_4x { + get { + return ResourceManager.GetString("Reference_speed_is_4x", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reference speed is 8x. + /// + internal static string Reference_speed_is_8x { + get { + return ResourceManager.GetString("Reference_speed_is_8x", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reference speed set is unknown: {0}. + /// + internal static string Reference_speed_set_is_unknown_0 { + get { + return ResourceManager.GetString("Reference_speed_set_is_unknown_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reference velocity is 3.49 m/s. + /// + internal static string Reference_velocity_is_3_49_m_s { + get { + return ResourceManager.GetString("Reference_velocity_is_3_49_m_s", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Regions supported:. + /// + internal static string Regions_supported { + get { + return ResourceManager.GetString("Regions_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Register version 1.0. + /// + internal static string Register_version_1_0 { + get { + return ResourceManager.GetString("Register_version_1_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Register version 1.1. + /// + internal static string Register_version_1_1 { + get { + return ResourceManager.GetString("Register_version_1_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Register version 1.2. + /// + internal static string Register_version_1_2 { + get { + return ResourceManager.GetString("Register_version_1_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Register version 2.0. + /// + internal static string Register_version_2_0 { + get { + return ResourceManager.GetString("Register_version_2_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Register version is defined in Extended Device Specific Data Register. + /// + internal static string Register_version_is_defined_in_Extended_Device_Specific_Data_Register { + get { + return ResourceManager.GetString("Register_version_is_defined_in_Extended_Device_Specific_Data_Register", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Relative target port identifier: {0}. + /// + internal static string Relative_target_port_identifier_0 { + get { + return ResourceManager.GetString("Relative_target_port_identifier_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Release date: {0}. + /// + internal static string Release_date_0 { + get { + return ResourceManager.GetString("Release_date_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Release firmware: {0}. + /// + internal static string Release_firmware_0 { + get { + return ResourceManager.GetString("Release_firmware_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Release is supported. + /// + internal static string Release_is_supported { + get { + return ResourceManager.GetString("Release_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Release is supported and enabled. + /// + internal static string Release_is_supported_and_enabled { + get { + return ResourceManager.GetString("Release_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Removable device. + /// + internal static string Removable_device { + get { + return ResourceManager.GetString("Removable_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Removable media feature set is supported. + /// + internal static string Removable_media_feature_set_is_supported { + get { + return ResourceManager.GetString("Removable_media_feature_set_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Removable media feature set is supported and enabled. + /// + internal static string Removable_media_feature_set_is_supported_and_enabled { + get { + return ResourceManager.GetString("Removable_media_feature_set_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Removable Media Status Notification feature set is supported. + /// + internal static string Removable_Media_Status_Notification_feature_set_is_supported { + get { + return ResourceManager.GetString("Removable_Media_Status_Notification_feature_set_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Removable Media Status Notification is supported. + /// + internal static string Removable_Media_Status_Notification_is_supported { + get { + return ResourceManager.GetString("Removable_Media_Status_Notification_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Removable Media Status Notification is supported and enabled. + /// + internal static string Removable_Media_Status_Notification_is_supported_and_enabled { + get { + return ResourceManager.GetString("Removable_Media_Status_Notification_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Report exception on compression is set to {0}. + /// + internal static string Report_exception_on_compression_is_set_to_0 { + get { + return ResourceManager.GetString("Report_exception_on_compression_is_set_to_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reported serial number: {0}. + /// + internal static string Reported_serial_number_0 { + get { + return ResourceManager.GetString("Reported_serial_number_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reserved3 = 0x{0:X2}. + /// + internal static string Reserved_3_equals_0_X2 { + get { + return ResourceManager.GetString("Reserved_3_equals_0_X2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reserved4 = 0x{0:X2}. + /// + internal static string Reserved_4_equals_0_X2 { + get { + return ResourceManager.GetString("Reserved_4_equals_0_X2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reserved5 = 0x{0:X2}. + /// + internal static string Reserved_5_equals_0_X2 { + get { + return ResourceManager.GetString("Reserved_5_equals_0_X2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reserved6 = 0x{0:X2}. + /// + internal static string Reserved_6_equals_0_X2 { + get { + return ResourceManager.GetString("Reserved_6_equals_0_X2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reserved autoload mode {0} set. + /// + internal static string Reserved_autoload_mode_0_set { + get { + return ResourceManager.GetString("Reserved_autoload_mode_0_set", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reserved byte 56, bits 7 to 4 = 0x{0:X2}. + /// + internal static string Reserved_byte_56_bits_seven_to_four_0 { + get { + return ResourceManager.GetString("Reserved_byte_56_bits_seven_to_four_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reserved byte 57 = 0x{0:X2}. + /// + internal static string Reserved_byte_57 { + get { + return ResourceManager.GetString("Reserved_byte_57", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reserved byte 5, bits 2 to 1 = 0x{0:X2}. + /// + internal static string Reserved_byte_five_bits_two_to_one_0 { + get { + return ResourceManager.GetString("Reserved_byte_five_bits_two_to_one_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reserved bytes 74 to 95. + /// + internal static string Reserved_bytes_74_to_95 { + get { + return ResourceManager.GetString("Reserved_bytes_74_to_95", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reserved data transfer disconnect control value {0}. + /// + internal static string Reserved_data_transfer_disconnect_control_value_0 { + get { + return ResourceManager.GetString("Reserved_data_transfer_disconnect_control_value_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reserved = 0x{0:X2}. + /// + internal static string Reserved_equals_0_X2 { + get { + return ResourceManager.GetString("Reserved_equals_0_X2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reserved flags 0x{0:X2} set. + /// + internal static string Reserved_flags_0_set { + get { + return ResourceManager.GetString("Reserved_flags_0_set", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reserved QErr value 2 is set. + /// + internal static string Reserved_QErr_value_2_is_set { + get { + return ResourceManager.GetString("Reserved_QErr_value_2_is_set", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reserved UA_INTLCK_CTRL value 1 is set. + /// + internal static string Reserved_UA_INTLCK_CTRL_value_1_is_set { + get { + return ResourceManager.GetString("Reserved_UA_INTLCK_CTRL_value_1_is_set", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reserved value 0x02 found in SPI clocking field. + /// + internal static string Reserved_value_0x02_found_in_SPI_clocking_field { + get { + return ResourceManager.GetString("Reserved_value_0x02_found_in_SPI_clocking_field", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reserved value set in Peripheral Qualifier field.. + /// + internal static string Reserved_value_set_in_Peripheral_Qualifier_field { + get { + return ResourceManager.GetString("Reserved_value_set_in_Peripheral_Qualifier_field", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reserved1 = 0x{0:X2}. + /// + internal static string Reserved1_equals_0_X8 { + get { + return ResourceManager.GetString("Reserved1_equals_0_X8", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reserved2 = 0x{0:X2}. + /// + internal static string Reserved2_equals_0_X8 { + get { + return ResourceManager.GetString("Reserved2_equals_0_X8", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reserved3 = 0x{0:X8}. + /// + internal static string Reserved3_equals_0_X8 { + get { + return ResourceManager.GetString("Reserved3_equals_0_X8", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reserved4 = 0x{0:X16}. + /// + internal static string Reserved4_equals_0_X16 { + get { + return ResourceManager.GetString("Reserved4_equals_0_X16", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reserved4 = 0x{0:X8}. + /// + internal static string Reserved4_equals_0_X8 { + get { + return ResourceManager.GetString("Reserved4_equals_0_X8", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reserved5 = 0x{0:X8}. + /// + internal static string Reserved5_equals_0_X8 { + get { + return ResourceManager.GetString("Reserved5_equals_0_X8", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reserved6 = 0x{0:X8}. + /// + internal static string Reserved6_equals_0_X8 { + get { + return ResourceManager.GetString("Reserved6_equals_0_X8", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reserved7 = 0x{0:X2}. + /// + internal static string Reserved7_equals_0_X2 { + get { + return ResourceManager.GetString("Reserved7_equals_0_X2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reserved7 = 0x{0:X8}. + /// + internal static string Reserved7_equals_0_X8 { + get { + return ResourceManager.GetString("Reserved7_equals_0_X8", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reserved8 = 0x{0:X2}. + /// + internal static string Reserved8_equals_0_X2 { + get { + return ResourceManager.GetString("Reserved8_equals_0_X2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reserved9 = 0x{0:X8}. + /// + internal static string Reserved9_equals_0_X8 { + get { + return ResourceManager.GetString("Reserved9_equals_0_X8", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Response modifier: {0}. + /// + internal static string Response_modifier_0 { + get { + return ResourceManager.GetString("Response_modifier_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Response value: 0x{0:X8}. + /// + internal static string Response_value_0 { + get { + return ResourceManager.GetString("Response_value_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Rotational speed tolerance is higher than 0.5%. + /// + internal static string Rotational_speed_tolerance_is_higher_than_0_5_percent { + get { + return ResourceManager.GetString("Rotational_speed_tolerance_is_higher_than_0_5_percent", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Timestamp can be initialized by methods outside of the SCSI standards, but SCSI's SET TIMESTAMP shall take precedence over them. + /// + internal static string S01_Timestamp_can_be_initialized_by_methods_outside_of_the_SCSI_standards_but_SCSI_SET_TIMESTAMP_shall_take_precedence_over_them { + get { + return ResourceManager.GetString("S01_Timestamp_can_be_initialized_by_methods_outside_of_the_SCSI_standards_but_SCS" + + "I_SET_TIMESTAMP_shall_take_precedence_over_them", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to S4 value: 0x{0:X6}. + /// + internal static string S4_value_0 { + get { + return ResourceManager.GetString("S4_value_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SANITIZE ANTIFREEZE LOCK EXT is supported. + /// + internal static string SANITIZE_ANTIFREEZE_LOCK_EXT_is_supported { + get { + return ResourceManager.GetString("SANITIZE_ANTIFREEZE_LOCK_EXT_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sanitize commands are specified by ACS-2. + /// + internal static string Sanitize_commands_are_specified_by_ACS_2 { + get { + return ResourceManager.GetString("Sanitize_commands_are_specified_by_ACS_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sanitize commands are specified by ACS-3 or higher. + /// + internal static string Sanitize_commands_are_specified_by_ACS_3_or_higher { + get { + return ResourceManager.GetString("Sanitize_commands_are_specified_by_ACS_3_or_higher", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sanitize feature set is supported. + /// + internal static string Sanitize_feature_set_is_supported { + get { + return ResourceManager.GetString("Sanitize_feature_set_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SATA 1.5Gb/s is supported. + /// + internal static string SATA_1_5Gbs_is_supported { + get { + return ResourceManager.GetString("SATA_1_5Gbs_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SATA 3.0Gb/s is supported. + /// + internal static string SATA_3_0Gbs_is_supported { + get { + return ResourceManager.GetString("SATA_3_0Gbs_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SATA 6.0Gb/s is supported. + /// + internal static string SATA_6_0Gbs_is_supported { + get { + return ResourceManager.GetString("SATA_6_0Gbs_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SATA Express device. + /// + internal static string SATA_Express_device { + get { + return ResourceManager.GetString("SATA_Express_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Scanner device. + /// + internal static string Scanner_device { + get { + return ResourceManager.GetString("Scanner_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI Background Control page:. + /// + internal static string SCSI_Background_Control_page { + get { + return ResourceManager.GetString("SCSI_Background_Control_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI Caching mode page:. + /// + internal static string SCSI_Caching_mode_page { + get { + return ResourceManager.GetString("SCSI_Caching_mode_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI CD-ROM audio control parameters page:. + /// + internal static string SCSI_CD_ROM_audio_control_parameters_page { + get { + return ResourceManager.GetString("SCSI_CD_ROM_audio_control_parameters_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI CD-ROM capabilities page:. + /// + internal static string SCSI_CD_ROM_capabilities_page { + get { + return ResourceManager.GetString("SCSI_CD_ROM_capabilities_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI CD-ROM parameters page:. + /// + internal static string SCSI_CD_ROM_parameters_page { + get { + return ResourceManager.GetString("SCSI_CD_ROM_parameters_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI Control extension page:. + /// + internal static string SCSI_Control_extension_page { + get { + return ResourceManager.GetString("SCSI_Control_extension_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI Control mode page:. + /// + internal static string SCSI_Control_mode_page { + get { + return ResourceManager.GetString("SCSI_Control_mode_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI Data compression page:. + /// + internal static string SCSI_Data_compression_page { + get { + return ResourceManager.GetString("SCSI_Data_compression_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI Device configuration page:. + /// + internal static string SCSI_Device_configuration_page { + get { + return ResourceManager.GetString("SCSI_Device_configuration_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI Device identification:. + /// + internal static string SCSI_Device_identification { + get { + return ResourceManager.GetString("SCSI_Device_identification", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI Disconnect-Reconnect mode page:. + /// + internal static string SCSI_Disconnect_Reconnect_mode_page { + get { + return ResourceManager.GetString("SCSI_Disconnect_Reconnect_mode_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI Drive Operation Mode page:. + /// + internal static string SCSI_Drive_Operation_Mode_page { + get { + return ResourceManager.GetString("SCSI_Drive_Operation_Mode_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI Extended INQUIRY Data:. + /// + internal static string SCSI_Extended_INQUIRY_Data { + get { + return ResourceManager.GetString("SCSI_Extended_INQUIRY_Data", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI Flexible disk page:. + /// + internal static string SCSI_Flexible_disk_page { + get { + return ResourceManager.GetString("SCSI_Flexible_disk_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI Format device page:. + /// + internal static string SCSI_Format_device_page { + get { + return ResourceManager.GetString("SCSI_Format_device_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI Implemented operating definitions:. + /// + internal static string SCSI_Implemented_operating_definitions { + get { + return ResourceManager.GetString("SCSI_Implemented_operating_definitions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI Informational exceptions control page:. + /// + internal static string SCSI_Informational_exceptions_control_page { + get { + return ResourceManager.GetString("SCSI_Informational_exceptions_control_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI Management Network Addresses:. + /// + internal static string SCSI_Management_Network_Addresses { + get { + return ResourceManager.GetString("SCSI_Management_Network_Addresses", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI Medium Configuration Mode Page:. + /// + internal static string SCSI_Medium_Configuration_Mode_Page { + get { + return ResourceManager.GetString("SCSI_Medium_Configuration_Mode_Page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI medium partition page:. + /// + internal static string SCSI_medium_partition_page { + get { + return ResourceManager.GetString("SCSI_medium_partition_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI medium partition page (extra):. + /// + internal static string SCSI_medium_partition_page_extra { + get { + return ResourceManager.GetString("SCSI_medium_partition_page_extra", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI Medium types supported page:. + /// + internal static string SCSI_Medium_types_supported_page { + get { + return ResourceManager.GetString("SCSI_Medium_types_supported_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI Mode Sense Header:. + /// + internal static string SCSI_Mode_Sense_Header { + get { + return ResourceManager.GetString("SCSI_Mode_Sense_Header", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI name string identifier: {0}. + /// + internal static string SCSI_name_string_identifier_0 { + get { + return ResourceManager.GetString("SCSI_name_string_identifier_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI name string identifier (hex): {0}. + /// + internal static string SCSI_name_string_identifier_hex_0 { + get { + return ResourceManager.GetString("SCSI_name_string_identifier_hex_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI optical memory:. + /// + internal static string SCSI_optical_memory { + get { + return ResourceManager.GetString("SCSI_optical_memory", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI over PCI Express. + /// + internal static string SCSI_over_PCI_Express { + get { + return ResourceManager.GetString("SCSI_over_PCI_Express", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI port is disabled. + /// + internal static string SCSI_port_is_disabled { + get { + return ResourceManager.GetString("SCSI_port_is_disabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI port is enabled. + /// + internal static string SCSI_port_is_enabled { + get { + return ResourceManager.GetString("SCSI_port_is_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI port will be disabled on next power up. + /// + internal static string SCSI_port_will_be_disabled_on_next_power_up { + get { + return ResourceManager.GetString("SCSI_port_will_be_disabled_on_next_power_up", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI port will be enabled on next power up. + /// + internal static string SCSI_port_will_be_enabled_on_next_power_up { + get { + return ResourceManager.GetString("SCSI_port_will_be_enabled_on_next_power_up", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI Power Consumption page:. + /// + internal static string SCSI_Power_Consumption_page { + get { + return ResourceManager.GetString("SCSI_Power_Consumption_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI Read error recovery page for MultiMedia Devices:. + /// + internal static string SCSI_Read_error_recovery_page_for_MultiMedia_Devices { + get { + return ResourceManager.GetString("SCSI_Read_error_recovery_page_for_MultiMedia_Devices", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI Read-write error recovery page:. + /// + internal static string SCSI_Read_write_error_recovery_page { + get { + return ResourceManager.GetString("SCSI_Read_write_error_recovery_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI Remote Direct Memory Access. + /// + internal static string SCSI_Remote_Direct_Memory_Access { + get { + return ResourceManager.GetString("SCSI_Remote_Direct_Memory_Access", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI Removable Block Access Capabilities page:. + /// + internal static string SCSI_Removable_Block_Access_Capabilities_page { + get { + return ResourceManager.GetString("SCSI_Removable_Block_Access_Capabilities_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI Rigid disk drive geometry page:. + /// + internal static string SCSI_Rigid_disk_drive_geometry_page { + get { + return ResourceManager.GetString("SCSI_Rigid_disk_drive_geometry_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI SENSE: {0}. + /// + internal static string SCSI_SENSE_0 { + get { + return ResourceManager.GetString("SCSI_SENSE_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI Sequential-access Device Capabilities:. + /// + internal static string SCSI_Sequential_access_Device_Capabilities { + get { + return ResourceManager.GetString("SCSI_Sequential_access_Device_Capabilities", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI Software Interface Identifiers:. + /// + internal static string SCSI_Software_Interface_Identifiers { + get { + return ResourceManager.GetString("SCSI_Software_Interface_Identifiers", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI Timer & Protect page:. + /// + internal static string SCSI_Timer_Protect_page { + get { + return ResourceManager.GetString("SCSI_Timer_Protect_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI to ATA Translation Layer Data:. + /// + internal static string SCSI_to_ATA_Translation_Layer_Data { + get { + return ResourceManager.GetString("SCSI_to_ATA_Translation_Layer_Data", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI UNLOAD command will not eject the cartridge. + /// + internal static string SCSI_UNLOAD_command_will_not_eject_the_cartridge { + get { + return ResourceManager.GetString("SCSI_UNLOAD_command_will_not_eject_the_cartridge", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI Verify error recovery page:. + /// + internal static string SCSI_Verify_error_recovery_page { + get { + return ResourceManager.GetString("SCSI_Verify_error_recovery_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI Verify error recovery page for MultiMedia Devices:. + /// + internal static string SCSI_Verify_error_recovery_page_for_MultiMedia_Devices { + get { + return ResourceManager.GetString("SCSI_Verify_error_recovery_page_for_MultiMedia_Devices", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCSI XOR control mode page:. + /// + internal static string SCSI_XOR_control_mode_page { + get { + return ResourceManager.GetString("SCSI_XOR_control_mode_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCT Data Tables are supported. + /// + internal static string SCT_Data_Tables_are_supported { + get { + return ResourceManager.GetString("SCT_Data_Tables_are_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCT Error Recovery Control is supported. + /// + internal static string SCT_Error_Recovery_Control_is_supported { + get { + return ResourceManager.GetString("SCT_Error_Recovery_Control_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCT Features Control is supported. + /// + internal static string SCT_Features_Control_is_supported { + get { + return ResourceManager.GetString("SCT_Features_Control_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCT Long Sector Address is supported. + /// + internal static string SCT_Long_Sector_Address_is_supported { + get { + return ResourceManager.GetString("SCT_Long_Sector_Address_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SCT Write Same is supported. + /// + internal static string SCT_Write_Same_is_supported { + get { + return ResourceManager.GetString("SCT_Write_Same_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Super DLTtape I. + /// + internal static string SDLT1 { + get { + return ResourceManager.GetString("SDLT1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Super DLTtape I at 133000 bpi. + /// + internal static string SDLT1_133k { + get { + return ResourceManager.GetString("SDLT1_133k", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Super DLTtape I compressed. + /// + internal static string SDLT1c { + get { + return ResourceManager.GetString("SDLT1c", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Seagate Firmware Numbers page:. + /// + internal static string Seagate_Firmware_Numbers_page { + get { + return ResourceManager.GetString("Seagate_Firmware_Numbers_page", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Seagate vendor-specific information:. + /// + internal static string Seagate_vendor_specific_information { + get { + return ResourceManager.GetString("Seagate_vendor_specific_information", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Second run-in block. + /// + internal static string Second_run_in_block { + get { + return ResourceManager.GetString("Second_run_in_block", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Second run-out block. + /// + internal static string Second_run_out_block { + get { + return ResourceManager.GetString("Second_run_out_block", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Secondary code: {0:X2}h. + /// + internal static string Secondary_code_0 { + get { + return ResourceManager.GetString("Secondary_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sector {0}. + /// + internal static string Sector_0 { + get { + return ResourceManager.GetString("Sector_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sector addressing is progressively incremented in one cylinder before going to the next. + /// + internal static string Sector_addressing_is_progressively_incremented_in_one_cylinder_before_going_to_the_next { + get { + return ResourceManager.GetString("Sector_addressing_is_progressively_incremented_in_one_cylinder_before_going_to_th" + + "e_next", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sector addressing is progressively incremented in one surface before going to the next. + /// + internal static string Sector_addressing_is_progressively_incremented_in_one_surface_before_going_to_the_next { + get { + return ResourceManager.GetString("Sector_addressing_is_progressively_incremented_in_one_surface_before_going_to_the" + + "_next", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sectors addressable in CHS mode: {0}. + /// + internal static string Sectors_addressable_in_CHS_mode_0 { + get { + return ResourceManager.GetString("Sectors_addressable_in_CHS_mode_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sectors addressable in CHS mode: {0} max., {1} current. + /// + internal static string Sectors_addressable_in_CHS_mode_0_max_1_current { + get { + return ResourceManager.GetString("Sectors_addressable_in_CHS_mode_0_max_1_current", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sectors per track: {0}. + /// + internal static string Sectors_per_track_0 { + get { + return ResourceManager.GetString("Sectors_per_track_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sectors per track: {0} max., {1} current. + /// + internal static string Sectors_per_track_0_max_1_current { + get { + return ResourceManager.GetString("Sectors_per_track_0_max_1_current", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sectors start at 1. + /// + internal static string Sectors_start_at_1 { + get { + return ResourceManager.GetString("Sectors_start_at_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SecureDigital Device Configuration Register:. + /// + internal static string SecureDigital_Device_Configuration_Register { + get { + return ResourceManager.GetString("SecureDigital_Device_Configuration_Register", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SecureDigital Device Identification Register:. + /// + internal static string SecureDigital_Device_Identification_Register { + get { + return ResourceManager.GetString("SecureDigital_Device_Identification_Register", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SecureDigital Device Specific Data Register:. + /// + internal static string SecureDigital_Device_Specific_Data_Register { + get { + return ResourceManager.GetString("SecureDigital_Device_Specific_Data_Register", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SecureDigital Operation Conditions Register:. + /// + internal static string SecureDigital_Operation_Conditions_Register { + get { + return ResourceManager.GetString("SecureDigital_Operation_Conditions_Register", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Security:. + /// + internal static string Security { + get { + return ResourceManager.GetString("Security", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Security count has expired. + /// + internal static string Security_count_has_expired { + get { + return ResourceManager.GetString("Security_count_has_expired", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Security count has not expired. + /// + internal static string Security_count_has_not_expired { + get { + return ResourceManager.GetString("Security_count_has_not_expired", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Security is enabled. + /// + internal static string Security_is_enabled { + get { + return ResourceManager.GetString("Security_is_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Security is frozen. + /// + internal static string Security_is_frozen { + get { + return ResourceManager.GetString("Security_is_frozen", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Security is locked. + /// + internal static string Security_is_locked { + get { + return ResourceManager.GetString("Security_is_locked", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Security is not enabled. + /// + internal static string Security_is_not_enabled { + get { + return ResourceManager.GetString("Security_is_not_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Security is not frozen. + /// + internal static string Security_is_not_frozen { + get { + return ResourceManager.GetString("Security_is_not_frozen", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Security is not locked. + /// + internal static string Security_is_not_locked { + get { + return ResourceManager.GetString("Security_is_not_locked", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Security level is high. + /// + internal static string Security_level_is_high { + get { + return ResourceManager.GetString("Security_level_is_high", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Security level is maximum. + /// + internal static string Security_level_is_maximum { + get { + return ResourceManager.GetString("Security_level_is_maximum", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Security Manager Device. + /// + internal static string Security_Manager_Device { + get { + return ResourceManager.GetString("Security_Manager_Device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Security mode is supported. + /// + internal static string Security_mode_is_supported { + get { + return ResourceManager.GetString("Security_mode_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Security mode is supported and enabled. + /// + internal static string Security_mode_is_supported_and_enabled { + get { + return ResourceManager.GetString("Security_mode_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SEGA IP.BIN INFORMATION:. + /// + internal static string SEGA_IP_BIN_INFORMATION { + get { + return ResourceManager.GetString("SEGA_IP_BIN_INFORMATION", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Segmented feature in DOWNLOAD MICROCODE is supported. + /// + internal static string Segmented_feature_in_DOWNLOAD_MICROCODE_is_supported { + get { + return ResourceManager.GetString("Segmented_feature_in_DOWNLOAD_MICROCODE_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Segmented feature in DOWNLOAD MICROCODE is supported and enabled. + /// + internal static string Segmented_feature_in_DOWNLOAD_MICROCODE_is_supported_and_enabled { + get { + return ResourceManager.GetString("Segmented_feature_in_DOWNLOAD_MICROCODE_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Selected driver strength is type {0}.. + /// + internal static string Selected_driver_strength_is_type_0 { + get { + return ResourceManager.GetString("Selected_driver_strength_is_type_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to On logical block {0}. + /// + internal static string Sense_PrettifyDescriptor00_On_logical_block_0 { + get { + return ResourceManager.GetString("Sense_PrettifyDescriptor00_On_logical_block_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sequential-access device. + /// + internal static string Sequential_access_device { + get { + return ResourceManager.GetString("Sequential_access_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Serial ATA device: . + /// + internal static string Serial_ATA_device { + get { + return ResourceManager.GetString("Serial_ATA_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Serial Attachment SCSI. + /// + internal static string Serial_Attachment_SCSI { + get { + return ResourceManager.GetString("Serial_Attachment_SCSI", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Serial number: {0}. + /// + internal static string Serial_number_0 { + get { + return ResourceManager.GetString("Serial_number_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Serial number is not the manufacturer's default value. + /// + internal static string Serial_number_is_not_the_manufacturer_default_value { + get { + return ResourceManager.GetString("Serial_number_is_not_the_manufacturer_default_value", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Serial number is the manufacturer's default value. + /// + internal static string Serial_number_is_the_manufacturer_default_value { + get { + return ResourceManager.GetString("Serial_number_is_the_manufacturer_default_value", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SERVICE interrupt is supported. + /// + internal static string SERVICE_interrupt_is_supported { + get { + return ResourceManager.GetString("SERVICE_interrupt_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SERVICE interrupt is supported and enabled. + /// + internal static string SERVICE_interrupt_is_supported_and_enabled { + get { + return ResourceManager.GetString("SERVICE_interrupt_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Servo firmware version: {0}. + /// + internal static string Servo_firmware_version_0 { + get { + return ResourceManager.GetString("Servo_firmware_version_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session {0}. + /// + internal static string Session_0 { + get { + return ResourceManager.GetString("Session_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SET FEATURES is required before spin-up. + /// + internal static string SET_FEATURES_is_required_before_spin_up { + get { + return ResourceManager.GetString("SET_FEATURES_is_required_before_spin_up", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SET MAX security extension is supported. + /// + internal static string SET_MAX_security_extension_is_supported { + get { + return ResourceManager.GetString("SET_MAX_security_extension_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SET MAX security extension is supported and enabled. + /// + internal static string SET_MAX_security_extension_is_supported_and_enabled { + get { + return ResourceManager.GetString("SET_MAX_security_extension_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SET PASSWORD DMA and SET UNLOCK DMA are supported. + /// + internal static string SET_PASSWORD_DMA_and_SET_UNLOCK_DMA_are_supported { + get { + return ResourceManager.GetString("SET_PASSWORD_DMA_and_SET_UNLOCK_DMA_are_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Simplified direct-access device. + /// + internal static string Simplified_direct_access_device { + get { + return ResourceManager.GetString("Simplified_direct_access_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Single-word DMA: . + /// + internal static string Single_word_DMA { + get { + return ResourceManager.GetString("Single_word_DMA", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Skip time interval assignment {0} says that from {1:D2}:{2:D2}:{3:D2} to {4:D2}:{5:D2}:{6:D2} should be skipped. + /// + internal static string Skip_time_interval_assignment_0_says_that_from_1_2_3_to_4_5_6_should_be_skipped { + get { + return ResourceManager.GetString("Skip_time_interval_assignment_0_says_that_from_1_2_3_to_4_5_6_should_be_skipped", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Skip time interval assignment {0} says that from {4}:{1:D2}:{2:D2}:{3:D2} to {8}:{5:D2}:{6:D2}:{7:D2} should be skipped. + /// + internal static string Skip_time_interval_assignment_0_says_that_from_4_1_2_3_to_8_5_6_7_should_be_skipped { + get { + return ResourceManager.GetString("Skip_time_interval_assignment_0_says_that_from_4_1_2_3_to_8_5_6_7_should_be_skipp" + + "ed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Skip track {0}. + /// + internal static string Skip_track_0 { + get { + return ResourceManager.GetString("Skip_track_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Skip track assignment {0} says that tracks {1} should be skipped. + /// + internal static string Skip_track_assignment_0_says_that_tracks_1_should_be_skipped { + get { + return ResourceManager.GetString("Skip_track_assignment_0_says_that_tracks_1_should_be_skipped", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SLR-32 SL. + /// + internal static string SLR32SL { + get { + return ResourceManager.GetString("SLR32SL", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SLR40, SLR60 or SLR100. + /// + internal static string SLR40_60_100 { + get { + return ResourceManager.GetString("SLR40_60_100", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SLR-5 SL. + /// + internal static string SLR5SL { + get { + return ResourceManager.GetString("SLR5SL", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to S.M.A.R.T. Command Transport is supported. + /// + internal static string SMART_Command_Transport_is_supported { + get { + return ResourceManager.GetString("SMART_Command_Transport_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to S.M.A.R.T. Command Transport (SCT):. + /// + internal static string SMART_Command_Transport_SCT { + get { + return ResourceManager.GetString("SMART_Command_Transport_SCT", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to S.M.A.R.T. error logging is supported. + /// + internal static string SMART_error_logging_is_supported { + get { + return ResourceManager.GetString("SMART_error_logging_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to S.M.A.R.T. error logging is supported and enabled. + /// + internal static string SMART_error_logging_is_supported_and_enabled { + get { + return ResourceManager.GetString("SMART_error_logging_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to S.M.A.R.T. is supported. + /// + internal static string SMART_is_supported { + get { + return ResourceManager.GetString("SMART_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to S.M.A.R.T. is supported and enabled. + /// + internal static string SMART_is_supported_and_enabled { + get { + return ResourceManager.GetString("SMART_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to S.M.A.R.T. self-testing is supported. + /// + internal static string SMART_self_testing_is_supported { + get { + return ResourceManager.GetString("SMART_self_testing_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to S.M.A.R.T. self-testing is supported and enabled. + /// + internal static string SMART_self_testing_is_supported_and_enabled { + get { + return ResourceManager.GetString("SMART_self_testing_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Software Settings Preservation is supported. + /// + internal static string Software_Settings_Preservation_is_supported { + get { + return ResourceManager.GetString("Software_Settings_Preservation_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Software Settings Preservation is supported and enabled. + /// + internal static string Software_Settings_Preservation_is_supported_and_enabled { + get { + return ResourceManager.GetString("Software_Settings_Preservation_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Software write protect is enabled. + /// + internal static string Software_write_protect_is_enabled { + get { + return ResourceManager.GetString("Software_write_protect_is_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Software write protection is set until power down. + /// + internal static string Software_write_protection_is_set_until_power_down { + get { + return ResourceManager.GetString("Software_write_protection_is_set_until_power_down", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Spare Area Full Flags: 0x{0:X2}. + /// + internal static string Spare_Area_Full_Flags_0 { + get { + return ResourceManager.GetString("Spare_Area_Full_Flags_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Found incorrect Blu-ray Spare Area Information size ({0} bytes). + /// + internal static string Spare_Decode_Found_incorrect_Blu_ray_Spare_Area_Information_size_0_bytes { + get { + return ResourceManager.GetString("Spare_Decode_Found_incorrect_Blu_ray_Spare_Area_Information_size_0_bytes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Spindle motor control is implemented. + /// + internal static string Spindle_motor_control_is_implemented { + get { + return ResourceManager.GetString("Spindle_motor_control_is_implemented", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Spindle synchronization is disabled or unsupported. + /// + internal static string Spindle_synchronization_is_disabled_or_unsupported { + get { + return ResourceManager.GetString("Spindle_synchronization_is_disabled_or_unsupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SSA. + /// + internal static string SSA { + get { + return ResourceManager.GetString("SSA", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Standby time values are standard. + /// + internal static string Standby_time_values_are_standard { + get { + return ResourceManager.GetString("Standby_time_values_are_standard", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Start of next possible program in the recordable area of the disc: {0:D2}:{1:D2}:{2:D2}. + /// + internal static string Start_of_next_possible_program_in_the_recordable_area_of_the_disc_0_1_2 { + get { + return ResourceManager.GetString("Start_of_next_possible_program_in_the_recordable_area_of_the_disc_0_1_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Start of next possible program in the recordable area of the disc: {3:D2}:{0:D2}:{1:D2}:{2:D2}. + /// + internal static string Start_of_next_possible_program_in_the_recordable_area_of_the_disc_3_0_1_2 { + get { + return ResourceManager.GetString("Start_of_next_possible_program_in_the_recordable_area_of_the_disc_3_0_1_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Start position of outer part lead-in area: {0:D2}:{1:D2}:{2:D2}. + /// + internal static string Start_position_of_outer_part_lead_in_area_0_1_2 { + get { + return ResourceManager.GetString("Start_position_of_outer_part_lead_in_area_0_1_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Start position of outer part lead-in area: {3:D2}:{0:D2}:{1:D2}:{2:D2}. + /// + internal static string Start_position_of_outer_part_lead_in_area_3_0_1_2 { + get { + return ResourceManager.GetString("Start_position_of_outer_part_lead_in_area_3_0_1_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Start time for interval that should be skipped: {0:D2}:{1:D2}:{2:D2}. + /// + internal static string Start_time_for_interval_that_should_be_skipped_0_1_2 { + get { + return ResourceManager.GetString("Start_time_for_interval_that_should_be_skipped_0_1_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Start time of the first Lead-in area in the disc: {0:D2}:{1:D2}:{2:D2}. + /// + internal static string Start_time_of_the_first_Lead_in_area_in_the_disc_0_1_2 { + get { + return ResourceManager.GetString("Start_time_of_the_first_Lead_in_area_in_the_disc_0_1_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Start time of the first Lead-in area in the disc: {3:D2}:{0:D2}:{1:D2}:{2:D2}. + /// + internal static string Start_time_of_the_first_Lead_in_area_in_the_disc_3_0_1_2 { + get { + return ResourceManager.GetString("Start_time_of_the_first_Lead_in_area_in_the_disc_3_0_1_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Stereo audio track with 50/15 μs pre-emphasis. + /// + internal static string Stereo_audio_track_with_50_15_us_pre_emphasis { + get { + return ResourceManager.GetString("Stereo_audio_track_with_50_15_us_pre_emphasis", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Stereo audio track with no pre-emphasis. + /// + internal static string Stereo_audio_track_with_no_pre_emphasis { + get { + return ResourceManager.GetString("Stereo_audio_track_with_no_pre_emphasis", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Stop position of inner part lead-out area: {0:D2}:{1:D2}:{2:D2}. + /// + internal static string Stop_position_of_inner_part_lead_out_area_0_1_2 { + get { + return ResourceManager.GetString("Stop_position_of_inner_part_lead_out_area_0_1_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Stop position of inner part lead-out area: {3:D2}:{0:D2}:{1:D2}:{2:D2}. + /// + internal static string Stop_position_of_inner_part_lead_out_area_3_0_1_2 { + get { + return ResourceManager.GetString("Stop_position_of_inner_part_lead_out_area_3_0_1_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Streaming:. + /// + internal static string Streaming { + get { + return ResourceManager.GetString("Streaming", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Streaming access latency is {0}. + /// + internal static string Streaming_access_latency_is_0 { + get { + return ResourceManager.GetString("Streaming_access_latency_is_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Streaming feature set is supported. + /// + internal static string Streaming_feature_set_is_supported { + get { + return ResourceManager.GetString("Streaming_feature_set_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Streaming feature set is supported and enabled. + /// + internal static string Streaming_feature_set_is_supported_and_enabled { + get { + return ResourceManager.GetString("Streaming_feature_set_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Streaming performance granularity is {0}. + /// + internal static string Streaming_performance_granularity_is_0 { + get { + return ResourceManager.GetString("Streaming_performance_granularity_is_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Streaming transfer time in DMA is {0}. + /// + internal static string Streaming_transfer_time_in_DMA_is_0 { + get { + return ResourceManager.GetString("Streaming_transfer_time_in_DMA_is_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Streaming transfer time in PIO is {0}. + /// + internal static string Streaming_transfer_time_in_PIO_is_0 { + get { + return ResourceManager.GetString("Streaming_transfer_time_in_PIO_is_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: {4} area, {5}, {6}, {7}, Q: {8:X2} {9:X2} {10:X2} {11:X2} {12:X2} {13:X2} {14:X2} {15:X2} {16:X2} {17:X2} CRC 0x{18:X2}{19:X2} ({20}), R-W {21}. + /// + internal static string Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_8_9_10_11_12_13_14_15_16_17_CRC_18_19_20_R_W_21 { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_8_9_10_11_12_13_14_15_16_17_CRC_1" + + "8_19_20_R_W_21", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: {4} area, {5}, {6}, {7}, Q mode {8}, {9} skip interval pointers, {10} skip track assignments, CRC 0x{11:X2}{12:X2} ({13}), R-W {14}. + /// + internal static string Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_9_skip_interval_pointers_10_skip_track_assignments_CRC_11_12_13_R_W_14 { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_9_skip_interval_pointers_1" + + "0_skip_track_assignments_CRC_11_12_13_R_W_14", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: {4} area, {5}, {6}, {7}, Q mode {8}, ATIP values {9:X2}, {10:X2}, {11:X2}, first disc Lead-in starts at {12:X2}{13:X2}{14:X2} (LBA {15}), CRC 0x{16:X2}{17:X2} ({18}), R-W {19}. + /// + internal static string Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_ATIP_values_9_10_11_first_disc_Lead_in_starts_at_12_13_14_LBA_15_CRC_16_17_18_R_W_19 { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_ATIP_values_9_10_11_first_" + + "disc_Lead_in_starts_at_12_13_14_LBA_15_CRC_16_17_18_R_W_19", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: {4} area, {5}, {6}, {7}, Q mode {8} ISRC: {9} frame {10:X2} CRC 0x{11:X2}{12:X2} ({13}), R-W {14}. + /// + internal static string Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_ISRC_9_frame_10_CRC_11_12_13_R_W_14 { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_ISRC_9_frame_10_CRC_11_12_" + + "13_R_W_14", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: {4} area, {5}, {6}, {7}, Q mode {8} MCN: {9} frame {10:X2} CRC 0x{11:X2}{12:X2} ({13}), R-W {14}. + /// + internal static string Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_MCN_9_frame_10_CRC_11_12_13_R_W_14 { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_MCN_9_frame_10_CRC_11_12_1" + + "3_R_W_14", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: {4} area, {5}, {6}, {7}, Q mode {8} next program area can start at {9:X2}:{10:X2}:{11:X2} (LBA {12}), last-session, {13} mode 5 pointers, CRC 0x{14:X2}{15:X2} ({16}), R-W {17}. + /// + internal static string Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_next_program_area_can_start_at_9_10_11_LBA_12_last_session_13_mode_5_pointers_CRC_14_15_16_R_W_17 { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_next_program_area_can_star" + + "t_at_9_10_11_LBA_12_last_session_13_mode_5_pointers_CRC_14_15_16_R_W_17", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: {4} area, {5}, {6}, {7}, Q mode {8} next program area can start at {9:X2}:{10:X2}:{11:X2} (LBA {12}), maximum Lead-out at {13:X2}:{14:X2}:{15:X2} (LBA {16}), {17} mode 5 pointers, CRC 0x{18:X2}{19:X2} ({20}), R-W {21}. + /// + internal static string Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_next_program_area_can_start_at_9_10_11_LBA_12_maximum_Lead_out_at_13_14_15_LBA_16_17_mode_5_pointers_CRC_18_19_20_R_W_21 { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_next_program_area_can_star" + + "t_at_9_10_11_LBA_12_maximum_Lead_out_at_13_14_15_LBA_16_17_mode_5_pointers_CRC_1" + + "8_19_20_R_W_21", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: {4} area, {5}, {6}, {7}, Q mode {8} position: {9:X2}:{10:X2}:{11:X2} (LBA {12}), track {13:X} is first program area track in {14} format, Q CRC 0x{15:X2}{16:X2} ({17}), R-W {18}. + /// + internal static string Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_position_9_10_11_LBA_12_track_13_is_first_program_area_track_in_14_format_Q_CRC_15_16_17_R_W_18 { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_position_9_10_11_LBA_12_tr" + + "ack_13_is_first_program_area_track_in_14_format_Q_CRC_15_16_17_R_W_18", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: {4} area, {5}, {6}, {7}, Q mode {8} position: {9:X2}:{10:X2}:{11:X2} (LBA {12}), track {13:X} is last program area track, Q CRC 0x{14:X2}{15:X2} ({16}), R-W {17}. + /// + internal static string Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_position_9_10_11_LBA_12_track_13_is_last_program_area_track_Q_CRC_14_15_16_R_W_17 { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_position_9_10_11_LBA_12_tr" + + "ack_13_is_last_program_area_track_Q_CRC_14_15_16_R_W_17", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: {4} area, {5}, {6}, {7}, Q mode {8} position: {9:X2}:{10:X2}:{11:X2} (LBA {12}), track {13:X} starts at {14:X2}:{15:X2}:{16:X2} (LBA {17}), Q CRC 0x{18:X2}{19:X2} ({20}), R-W {21}. + /// + internal static string Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_position_9_10_11_LBA_12_track_13_starts_at_14_15_16_LBA_17_Q_CRC_18_19_20_R_W_21 { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_position_9_10_11_LBA_12_tr" + + "ack_13_starts_at_14_15_16_LBA_17_Q_CRC_18_19_20_R_W_21", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: {4} area, {5}, {6}, {7}, Q mode {8} skip interval start time {9:X2}{10:X2}{11:X2}, skip interval stop time {12:X2}{13:X2}{14:X2}, CRC 0x{15:X2}{16:X2} ({17}), R-W {18}. + /// + internal static string Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_skip_interval_start_time_9_10_11_skip_interval_stop_time_12_13_14_CRC_15_16_17_R_W_18 { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_skip_interval_start_time_9" + + "_10_11_skip_interval_stop_time_12_13_14_CRC_15_16_17_R_W_18", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: {4} area, {5}, {6}, {7}, Q mode {8}, tracks {9} to be skipped, CRC 0x{10:X2}{11:X2} ({12}), R-W {13}. + /// + internal static string Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_tracks_9_to_be_skipped_CRC_10_11_12_R_W_13 { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_0_1_2_LBA_3_4_area_5_6_7_Q_mode_8_tracks_9_to_be_skipped_CRC" + + "_10_11_12_R_W_13", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: {4} area, {5}, {6}, {7}, Q mode {8} position: track {9:X} index {10:X} relative position {11:X2}:{12:X2}:{13:X2} (LBA {14}), absolute position {15:X2}:{16:X2}:{17:X2} (LBA {18}), Q CRC 0x{19:X2}{20:X2} ({21}), R-W {22}. + /// + internal static string Subchannel_PrettifyQ_0_D2_1_2_LBA_3_4_area_5_6_7_Q_mode_8_position_track_9_index_10_relative_position_11_12_13_LBA_14_absolute_position_15_16_17_LBA_18_Q_CRC_19_20_21_R_W_22 { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_0_D2_1_2_LBA_3_4_area_5_6_7_Q_mode_8_position_track_9_index_" + + "10_relative_position_11_12_13_LBA_14_absolute_position_15_16_17_LBA_18_Q_CRC_19_" + + "20_21_R_W_22", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to BAD. + /// + internal static string Subchannel_PrettifyQ_BAD { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_BAD", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CD-DA / CD-ROM. + /// + internal static string Subchannel_PrettifyQ_CD_DA_CD_ROM { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_CD_DA_CD_ROM", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CD-i. + /// + internal static string Subchannel_PrettifyQ_CD_i { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_CD_i", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CD-ROM XA. + /// + internal static string Subchannel_PrettifyQ_CD_ROM_XA { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_CD_ROM_XA", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to copy permitted. + /// + internal static string Subchannel_PrettifyQ_copy_permitted { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_copy_permitted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to copy prohibited. + /// + internal static string Subchannel_PrettifyQ_copy_prohibited { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_copy_prohibited", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to corrupted pause. + /// + internal static string Subchannel_PrettifyQ_corrupted_pause { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_corrupted_pause", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to empty. + /// + internal static string Subchannel_PrettifyQ_empty { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_empty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to incremental data. + /// + internal static string Subchannel_PrettifyQ_incremental_data { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_incremental_data", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Lead-In. + /// + internal static string Subchannel_PrettifyQ_Lead_In { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_Lead_In", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Lead-Out. + /// + internal static string Subchannel_PrettifyQ_Lead_out { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_Lead_out", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to not empty. + /// + internal static string Subchannel_PrettifyQ_not_empty { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_not_empty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to not pause. + /// + internal static string Subchannel_PrettifyQ_not_pause { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_not_pause", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to OK. + /// + internal static string Subchannel_PrettifyQ_OK { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_OK", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to pause. + /// + internal static string Subchannel_PrettifyQ_pause { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_pause", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Program. + /// + internal static string Subchannel_PrettifyQ_Program { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_Program", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to quadraphonic audio with pre-emphasis. + /// + internal static string Subchannel_PrettifyQ_quadraphonic_audio_with_pre_emphasis { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_quadraphonic_audio_with_pre_emphasis", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to quadraphonic audio without pre-emphasis. + /// + internal static string Subchannel_PrettifyQ_quadraphonic_audio_without_pre_emphasis { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_quadraphonic_audio_without_pre_emphasis", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to reserved control value {0}. + /// + internal static string Subchannel_PrettifyQ_reserved_control_value__0_ { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_reserved_control_value__0_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to stereo audio with pre-emphasis. + /// + internal static string Subchannel_PrettifyQ_stereo_audio_with_pre_emphasis { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_stereo_audio_with_pre_emphasis", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to stereo audio without pre-emphasis. + /// + internal static string Subchannel_PrettifyQ_stereo_audio_without_pre_emphasis { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_stereo_audio_without_pre_emphasis", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to uninterrupted data. + /// + internal static string Subchannel_PrettifyQ_uninterrupted_data { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_uninterrupted_data", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to unknown {0:X2}. + /// + internal static string Subchannel_PrettifyQ_unknown_0 { + get { + return ResourceManager.GetString("Subchannel_PrettifyQ_unknown_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Subheader copies differ.. + /// + internal static string Subheader_copies_differ { + get { + return ResourceManager.GetString("Subheader_copies_differ", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Supported ATA versions: . + /// + internal static string Supported_ATA_versions { + get { + return ResourceManager.GetString("Supported_ATA_versions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Supported medium type four: {0}. + /// + internal static string Supported_medium_type_four_0 { + get { + return ResourceManager.GetString("Supported_medium_type_four_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Supported medium type one: {0}. + /// + internal static string Supported_medium_type_one_0 { + get { + return ResourceManager.GetString("Supported_medium_type_one_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Supported medium type three: {0}. + /// + internal static string Supported_medium_type_three_0 { + get { + return ResourceManager.GetString("Supported_medium_type_three_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Supported medium type two: {0}. + /// + internal static string Supported_medium_type_two_0 { + get { + return ResourceManager.GetString("Supported_medium_type_two_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Supported operating definitions:. + /// + internal static string Supported_operating_definitions { + get { + return ResourceManager.GetString("Supported_operating_definitions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Supports block lengths and protection information. + /// + internal static string Supports_block_lengths_and_protection_information { + get { + return ResourceManager.GetString("Supports_block_lengths_and_protection_information", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Supports device automatic partial to slumber transitions is supported. + /// + internal static string Supports_device_automatic_partial_to_slumber_transitions_is_supported { + get { + return ResourceManager.GetString("Supports_device_automatic_partial_to_slumber_transitions_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Supports enhanced security erase. + /// + internal static string Supports_enhanced_security_erase { + get { + return ResourceManager.GetString("Supports_enhanced_security_erase", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Supports host automatic partial to slumber transitions is supported. + /// + internal static string Supports_host_automatic_partial_to_slumber_transitions_is_supported { + get { + return ResourceManager.GetString("Supports_host_automatic_partial_to_slumber_transitions_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to System name: {0}. + /// + internal static string System_name_0 { + get { + return ResourceManager.GetString("System_name_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to System program address: 0x{0:X8}. + /// + internal static string System_program_address_0 { + get { + return ResourceManager.GetString("System_program_address_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to System program entry address: 0x{0:X8}. + /// + internal static string System_program_entry_address_0 { + get { + return ResourceManager.GetString("System_program_entry_address_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to System program load size: {0} bytes. + /// + internal static string System_program_load_size_0 { + get { + return ResourceManager.GetString("System_program_load_size_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to System program work RAM: {0} bytes. + /// + internal static string System_program_work_RAM_0 { + get { + return ResourceManager.GetString("System_program_work_RAM_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T10000A. + /// + internal static string T10000A { + get { + return ResourceManager.GetString("T10000A", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T10000B. + /// + internal static string T10000B { + get { + return ResourceManager.GetString("T10000B", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T10000C. + /// + internal static string T10000C { + get { + return ResourceManager.GetString("T10000C", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T10000D. + /// + internal static string T10000D { + get { + return ResourceManager.GetString("T10000D", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T9840C. + /// + internal static string T9840C { + get { + return ResourceManager.GetString("T9840C", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to T9940. + /// + internal static string T9940 { + get { + return ResourceManager.GetString("T9940", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tag resources size is {0}.. + /// + internal static string Tag_resources_size_is_0 { + get { + return ResourceManager.GetString("Tag_resources_size_is_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tagged queuing is disabled. + /// + internal static string Tagged_queuing_is_disabled { + get { + return ResourceManager.GetString("Tagged_queuing_is_disabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tags must be in units of {0} sectors. + /// + internal static string Tags_must_be_in_units_of_0_sectors { + get { + return ResourceManager.GetString("Tags_must_be_in_units_of_0_sectors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tape directory format version: {0}. + /// + internal static string Tape_directory_format_version_0 { + get { + return ResourceManager.GetString("Tape_directory_format_version_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tape will be unthreaded. + /// + internal static string Tape_will_be_unthreaded { + get { + return ResourceManager.GetString("Tape_will_be_unthreaded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tape will be unthreaded and unloaded. + /// + internal static string Tape_will_be_unthreaded_and_unloaded { + get { + return ResourceManager.GetString("Tape_will_be_unthreaded_and_unloaded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tape will stay threaded at beginning. + /// + internal static string Tape_will_stay_threaded_at_beginning { + get { + return ResourceManager.GetString("Tape_will_stay_threaded_at_beginning", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mammoth. + /// + internal static string TapeName_Mammoth { + get { + return ResourceManager.GetString("TapeName_Mammoth", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Target-dependent interleave value is {0}. + /// + internal static string Target_dependent_interleave_value_is_0 { + get { + return ResourceManager.GetString("Target_dependent_interleave_value_is_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Target group identifier: {0}. + /// + internal static string Target_group_identifier_0 { + get { + return ResourceManager.GetString("Target_group_identifier_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Target is allowed to re-order the data transfer. + /// + internal static string Target_is_allowed_to_reorder_the_data_transfer { + get { + return ResourceManager.GetString("Target_is_allowed_to_reorder_the_data_transfer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Target may issue an asynchronous event notification instead of a deferred error. + /// + internal static string Target_may_issue_an_asynchronous_event_notification_instead_of_a_deferred_error { + get { + return ResourceManager.GetString("Target_may_issue_an_asynchronous_event_notification_instead_of_a_deferred_error", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Target may issue an asynchronous event notification instead of a unit attention condition. + /// + internal static string Target_may_issue_an_asynchronous_event_notification_instead_of_a_unit_attention_condition { + get { + return ResourceManager.GetString("Target_may_issue_an_asynchronous_event_notification_instead_of_a_unit_attention_c" + + "ondition", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Target may issue an asynchronous event notification upon completing its initialization. + /// + internal static string Target_may_issue_an_asynchronous_event_notification_upon_completing_its_initialization { + get { + return ResourceManager.GetString("Target_may_issue_an_asynchronous_event_notification_upon_completing_its_initializ" + + "ation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Target operates as a synchronized-spindle master. + /// + internal static string Target_operates_as_a_synchronized_spindle_master { + get { + return ResourceManager.GetString("Target_operates_as_a_synchronized_spindle_master", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Target operates as a synchronized-spindle master control. + /// + internal static string Target_operates_as_a_synchronized_spindle_master_control { + get { + return ResourceManager.GetString("Target_operates_as_a_synchronized_spindle_master_control", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Target operates as a synchronized-spindle slave. + /// + internal static string Target_operates_as_a_synchronized_spindle_slave { + get { + return ResourceManager.GetString("Target_operates_as_a_synchronized_spindle_slave", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Target shall never release the motor on signal. + /// + internal static string Target_shall_never_release_the_motor_on_signal { + get { + return ResourceManager.GetString("Target_shall_never_release_the_motor_on_signal", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Target shall not transfer data for a command during the same interconnect tenancy. + /// + internal static string Target_shall_not_transfer_data_for_a_command_during_the_same_interconnect_tenancy { + get { + return ResourceManager.GetString("Target_shall_not_transfer_data_for_a_command_during_the_same_interconnect_tenancy" + + "", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Target shall wait {0} seconds after drive is ready before aborting medium access attempts. + /// + internal static string Target_shall_wait_0_seconds_after_drive_is_ready_before_aborting_medium_access_attempts { + get { + return ResourceManager.GetString("Target_shall_wait_0_seconds_after_drive_is_ready_before_aborting_medium_access_at" + + "tempts", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Target shall wait {0} seconds before attempting to access the medium after motor on is asserted. + /// + internal static string Target_shall_wait_0_seconds_before_attempting_to_access_the_medium_after_motor_on_is_asserted { + get { + return ResourceManager.GetString("Target_shall_wait_0_seconds_before_attempting_to_access_the_medium_after_motor_on" + + "_is_asserted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Target shall wait {0} seconds before releasing the motor on signal after becoming idle. + /// + internal static string Target_shall_wait_0_seconds_before_releasing_the_motor_on_signal_after_becoming_idle { + get { + return ResourceManager.GetString("Target_shall_wait_0_seconds_before_releasing_the_motor_on_signal_after_becoming_i" + + "dle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tasks aborted by other initiator's actions should be terminated with TASK ABORTED. + /// + internal static string Tasks_aborted_by_other_initiator_s_actions_should_be_terminated_with_TASK_ABORTED { + get { + return ResourceManager.GetString("Tasks_aborted_by_other_initiator_s_actions_should_be_terminated_with_TASK_ABORTED" + + "", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test write operation is restricted during read or write operations.. + /// + internal static string Test_write_operation_is_restricted_during_read_or_write_operations { + get { + return ResourceManager.GetString("Test_write_operation_is_restricted_during_read_or_write_operations", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Text field: "{0}". + /// + internal static string Text_field_0 { + get { + return ResourceManager.GetString("Text_field_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The device type that would be provided in the INQUIRY response is {0}. + /// + internal static string The_device_type_that_would_be_provided_in_the_INQUIRY_response_is_0 { + get { + return ResourceManager.GetString("The_device_type_that_would_be_provided_in_the_INQUIRY_response_is_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The Logical Unit does not enforce Region Playback Controls (RPC).. + /// + internal static string The_Logical_Unit_does_not_enforce_Region_Playback_Controls_RPC { + get { + return ResourceManager.GetString("The_Logical_Unit_does_not_enforce_Region_Playback_Controls_RPC", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The logical unit maintains one task set for all nexuses. + /// + internal static string The_logical_unit_maintains_one_task_set_for_all_nexuses { + get { + return ResourceManager.GetString("The_logical_unit_maintains_one_task_set_for_all_nexuses", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The logical unit maintains separate task sets for each nexus. + /// + internal static string The_logical_unit_maintains_separate_task_sets_for_each_nexus { + get { + return ResourceManager.GetString("The_logical_unit_maintains_separate_task_sets_for_each_nexus", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The Logical Unit shall adhere to the specification and all requirements of the CSS license agreement concerning RPC.. + /// + internal static string The_Logical_Unit_shall_adhere_to_the_specification_and_all_requirements_of_the_CSS_license_agreement_concerning_RPC { + get { + return ResourceManager.GetString("The_Logical_Unit_shall_adhere_to_the_specification_and_all_requirements_of_the_CS" + + "S_license_agreement_concerning_RPC", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The Logical Unit uses an unknown region enforcement scheme.. + /// + internal static string The_Logical_Unit_uses_an_unknown_region_enforcement_scheme { + get { + return ResourceManager.GetString("The_Logical_Unit_uses_an_unknown_region_enforcement_scheme", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The motor on signal shall remain released. + /// + internal static string The_motor_on_signal_shall_remain_released { + get { + return ResourceManager.GetString("The_motor_on_signal_shall_remain_released", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There are {0} blocks per each second of audio. + /// + internal static string There_are_0_blocks_per_each_second_of_audio { + get { + return ResourceManager.GetString("There_are_0_blocks_per_each_second_of_audio", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There are {0} per block. + /// + internal static string There_are_0_per_block { + get { + return ResourceManager.GetString("There_are_0_per_block", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There are commands pending to be forwarded. + /// + internal static string There_are_commands_pending_to_be_forwarded { + get { + return ResourceManager.GetString("There_are_commands_pending_to_be_forwarded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There are no addresses. + /// + internal static string There_are_no_addresses { + get { + return ResourceManager.GetString("There_are_no_addresses", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There are no identifiers. + /// + internal static string There_are_no_identifiers { + get { + return ResourceManager.GetString("There_are_no_identifiers", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There are no supported definitions. + /// + internal static string There_are_no_supported_definitions { + get { + return ResourceManager.GetString("There_are_no_supported_definitions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There is a drive ready signal. + /// + internal static string There_is_a_drive_ready_signal { + get { + return ResourceManager.GetString("There_is_a_drive_ready_signal", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There is access to general purpose partition {0}. + /// + internal static string There_is_access_to_general_purpose_partition_0 { + get { + return ResourceManager.GetString("There_is_access_to_general_purpose_partition_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There is no access to boot partition. + /// + internal static string There_is_no_access_to_boot_partition { + get { + return ResourceManager.GetString("There_is_no_access_to_boot_partition", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There is no cartridge inserted. + /// + internal static string There_is_no_cartridge_inserted { + get { + return ResourceManager.GetString("There_is_no_cartridge_inserted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There is no limit on the maximum time that is allowed to remain busy. + /// + internal static string There_is_no_limit_on_the_maximum_time_that_is_allowed_to_remain_busy { + get { + return ResourceManager.GetString("There_is_no_limit_on_the_maximum_time_that_is_allowed_to_remain_busy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There is read/write access to boot partition 1. + /// + internal static string There_is_read_write_access_to_boot_partition_one { + get { + return ResourceManager.GetString("There_is_read_write_access_to_boot_partition_one", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There is read/write access to boot partition 2. + /// + internal static string There_is_read_write_access_to_boot_partition_two { + get { + return ResourceManager.GetString("There_is_read_write_access_to_boot_partition_two", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There is read/write access to replay protected memory block. + /// + internal static string There_is_read_write_access_to_replay_protected_memory_block { + get { + return ResourceManager.GetString("There_is_read_write_access_to_replay_protected_memory_block", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Third run-in block. + /// + internal static string Third_run_in_block { + get { + return ResourceManager.GetString("Third_run_in_block", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This descriptor is duplicated. + /// + internal static string This_descriptor_is_duplicated { + get { + return ResourceManager.GetString("This_descriptor_is_duplicated", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This DI continues previous unit. + /// + internal static string This_DI_continues_previous_unit { + get { + return ResourceManager.GetString("This_DI_continues_previous_unit", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This DI refers to layer {0}. + /// + internal static string This_DI_refers_to_layer_0 { + get { + return ResourceManager.GetString("This_DI_refers_to_layer_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This DI starts a new unit. + /// + internal static string This_DI_starts_a_new_unit { + get { + return ResourceManager.GetString("This_DI_starts_a_new_unit", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This disc contains a CD-R layer.. + /// + internal static string This_disc_contains_a_CD_R_layer { + get { + return ResourceManager.GetString("This_disc_contains_a_CD_R_layer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This disc contains a CD-ROM layer.. + /// + internal static string This_disc_contains_a_CD_ROM_layer { + get { + return ResourceManager.GetString("This_disc_contains_a_CD_ROM_layer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This disc contains a CD-RW layer.. + /// + internal static string This_disc_contains_a_CD_RW_layer { + get { + return ResourceManager.GetString("This_disc_contains_a_CD_RW_layer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This disc contains a DVD-R layer.. + /// + internal static string This_disc_contains_a_DVD_R_layer { + get { + return ResourceManager.GetString("This_disc_contains_a_DVD_R_layer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This disc contains a DVD-ROM layer.. + /// + internal static string This_disc_contains_a_DVD_ROM_layer { + get { + return ResourceManager.GetString("This_disc_contains_a_DVD_ROM_layer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This disc contains a DVD-RW layer.. + /// + internal static string This_disc_contains_a_DVD_RW_layer { + get { + return ResourceManager.GetString("This_disc_contains_a_DVD_RW_layer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This disc does not contain a CD layer.. + /// + internal static string This_disc_does_not_contain_a_CD_layer { + get { + return ResourceManager.GetString("This_disc_does_not_contain_a_CD_layer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This disc does not contain a DVD layer.. + /// + internal static string This_disc_does_not_contain_a_DVD_layer { + get { + return ResourceManager.GetString("This_disc_does_not_contain_a_DVD_layer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This disc has {0} layers. + /// + internal static string This_disc_has_0_layers { + get { + return ResourceManager.GetString("This_disc_has_0_layers", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This is the default density on the drive. + /// + internal static string This_is_the_default_density_on_the_drive { + get { + return ResourceManager.GetString("This_is_the_default_density_on_the_drive", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This is the default layer.. + /// + internal static string This_is_the_default_layer { + get { + return ResourceManager.GetString("This_is_the_default_layer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This is the layer actually in use.. + /// + internal static string This_is_the_layer_actually_in_use { + get { + return ResourceManager.GetString("This_is_the_layer_actually_in_use", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Timer interval is {0} ms. + /// + internal static string Timer_interval_is_0_ms { + get { + return ResourceManager.GetString("Timer_interval_is_0_ms", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Timer interval is vendor-specific. + /// + internal static string Timer_interval_is_vendor_specific { + get { + return ResourceManager.GetString("Timer_interval_is_vendor_specific", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Timestamp: {0}. + /// + internal static string Timestamp_0 { + get { + return ResourceManager.GetString("Timestamp_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Timestamp can be initialized by methods outside of the SCSI standards. + /// + internal static string Timestamp_can_be_initialized_by_methods_outside_of_the_SCSI_standards { + get { + return ResourceManager.GetString("Timestamp_can_be_initialized_by_methods_outside_of_the_SCSI_standards", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Total number of CPRM Media Key Blocks available to transfer: {0}. + /// + internal static string Total_number_of_CPRM_Media_Key_Blocks_available_to_transfer_0 { + get { + return ResourceManager.GetString("Total_number_of_CPRM_Media_Key_Blocks_available_to_transfer_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Total number of media key blocks available to transfer {0}. + /// + internal static string Total_number_of_media_key_blocks_available_to_transfer_0 { + get { + return ResourceManager.GetString("Total_number_of_media_key_blocks_available_to_transfer_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to track {0}. + /// + internal static string track_0 { + get { + return ResourceManager.GetString("track_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Track {0} (Data track, recorded incrementally) starts at {1:D2}:{2:D2}:{3:D2} and ends at {4:D2}:{5:D2}:{6:D2}. + /// + internal static string Track_0_Data_track_recorded_incrementally_starts_at_1_2_3_and_ends_at_4_5_6 { + get { + return ResourceManager.GetString("Track_0_Data_track_recorded_incrementally_starts_at_1_2_3_and_ends_at_4_5_6", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Track {0} (Data track, recorded incrementally) starts at {4}:{1:D2}:{2:D2}:{3:D2} and ends at {8}:{5:D2}:{6:D2}:{7:D2}. + /// + internal static string Track_0_Data_track_recorded_incrementally_starts_at_4_1_2_3_and_ends_at_8_5_6_7 { + get { + return ResourceManager.GetString("Track_0_Data_track_recorded_incrementally_starts_at_4_1_2_3_and_ends_at_8_5_6_7", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Track {0} (Data track, recorded uninterrupted) starts at {1:D2}:{2:D2}:{3:D2} and ends at {4:D2}:{5:D2}:{6:D2}. + /// + internal static string Track_0_Data_track_recorded_uninterrupted_starts_at_1_2_3_and_ends_at_4_5_6 { + get { + return ResourceManager.GetString("Track_0_Data_track_recorded_uninterrupted_starts_at_1_2_3_and_ends_at_4_5_6", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Track {0} (Data track, recorded uninterrupted) starts at {4}:{1:D2}:{2:D2}:{3:D2} and ends at {8}:{5:D2}:{6:D2}:{7:D2}. + /// + internal static string Track_0_Data_track_recorded_uninterrupted_starts_at_4_1_2_3_and_ends_at_8_5_6_7 { + get { + return ResourceManager.GetString("Track_0_Data_track_recorded_uninterrupted_starts_at_4_1_2_3_and_ends_at_8_5_6_7", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Track {0} (Quadraphonic audio track with 50/15 μs pre-emphasis) starts at {1:D2}:{2:D2}:{3:D2} and ends at {4:D2}:{5:D2}:{6:D2}. + /// + internal static string Track_0_Quadraphonic_audio_track_with_50_15_us_pre_emphasis_starts_at_1_2_3_and_ends_at_4_5_6 { + get { + return ResourceManager.GetString("Track_0_Quadraphonic_audio_track_with_50_15_us_pre_emphasis_starts_at_1_2_3_and_e" + + "nds_at_4_5_6", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Track {0} (Quadraphonic audio track with 50/15 μs pre-emphasis) starts at {4}:{1:D2}:{2:D2}:{3:D2} and ends at {8}:{5:D2}:{6:D2}:{7:D2}. + /// + internal static string Track_0_Quadraphonic_audio_track_with_50_15_us_pre_emphasis_starts_at_4_1_2_3_and_ends_at_8_5_6_7 { + get { + return ResourceManager.GetString("Track_0_Quadraphonic_audio_track_with_50_15_us_pre_emphasis_starts_at_4_1_2_3_and" + + "_ends_at_8_5_6_7", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Track {0} (Quadraphonic audio track with no pre-emphasis) starts at {1:D2}:{2:D2}:{3:D2} and ends at {4:D2}:{5:D2}:{6:D2}. + /// + internal static string Track_0_Quadraphonic_audio_track_with_no_pre_emphasis_starts_at_1_2_3_and_ends_at_4_5_6 { + get { + return ResourceManager.GetString("Track_0_Quadraphonic_audio_track_with_no_pre_emphasis_starts_at_1_2_3_and_ends_at" + + "_4_5_6", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Track {0} (Quadraphonic audio track with no pre-emphasis) starts at {4}:{1:D2}:{2:D2}:{3:D2} and ends at {8}:{5:D2}:{6:D2}:{7:D2}. + /// + internal static string Track_0_Quadraphonic_audio_track_with_no_pre_emphasis_starts_at_4_1_2_3_and_ends_at_8_5_6_7 { + get { + return ResourceManager.GetString("Track_0_Quadraphonic_audio_track_with_no_pre_emphasis_starts_at_4_1_2_3_and_ends_" + + "at_8_5_6_7", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Track {0} (Stereo audio track with 50/15 μs pre-emphasis) starts at {4}:{1:D2}:{2:D2}:{3:D2} and ends at {8}:{5:D2}:{6:D2}:{7:D2}. + /// + internal static string Track_0_Stereo_audio_track_with_50_15_s_pre_emphasis_starts_at_4_1_2_3_and_ends_at_8_5_6_7 { + get { + return ResourceManager.GetString("Track_0_Stereo_audio_track_with_50_15_s_pre_emphasis_starts_at_4_1_2_3_and_ends_a" + + "t_8_5_6_7", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Track {0} (Stereo audio track with 50/15 μs pre-emphasis) starts at {1:D2}:{2:D2}:{3:D2} and ends at {4:D2}:{5:D2}:{6:D2}. + /// + internal static string Track_0_Stereo_audio_track_with_50_15_us_pre_emphasis_starts_at_1_2_3_and_ends_at_4_5_6 { + get { + return ResourceManager.GetString("Track_0_Stereo_audio_track_with_50_15_us_pre_emphasis_starts_at_1_2_3_and_ends_at" + + "_4_5_6", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Track {0} (Stereo audio track with no pre-emphasis) starts at {1:D2}:{2:D2}:{3:D2} and ends at {4:D2}:{5:D2}:{6:D2}. + /// + internal static string Track_0_Stereo_audio_track_with_no_pre_emphasis_starts_at_1_2_3_and_ends_at_4_5_6 { + get { + return ResourceManager.GetString("Track_0_Stereo_audio_track_with_no_pre_emphasis_starts_at_1_2_3_and_ends_at_4_5_6" + + "", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Track {0} (Stereo audio track with no pre-emphasis) starts at {4}:{1:D2}:{2:D2}:{3:D2} and ends at {8}:{5:D2}:{6:D2}:{7:D2}. + /// + internal static string Track_0_Stereo_audio_track_with_no_pre_emphasis_starts_at_4_1_2_3_and_ends_at_8_5_6_7 { + get { + return ResourceManager.GetString("Track_0_Stereo_audio_track_with_no_pre_emphasis_starts_at_4_1_2_3_and_ends_at_8_5" + + "_6_7", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Track number: {0}. + /// + internal static string Track_number_0 { + get { + return ResourceManager.GetString("Track_number_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Track number: Lead-Out. + /// + internal static string Track_number_Lead_Out { + get { + return ResourceManager.GetString("Track_number_Lead_Out", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Track offset option is available. + /// + internal static string Track_offset_option_is_available { + get { + return ResourceManager.GetString("Track_offset_option_is_available", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Track size is 0.34 μm. + /// + internal static string Track_size_is_0_34_μm { + get { + return ResourceManager.GetString("Track_size_is_0_34_μm", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Track size is 0.40 μm. + /// + internal static string Track_size_is_0_40_μm { + get { + return ResourceManager.GetString("Track_size_is_0_40_μm", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Track size is 0.615 μm. + /// + internal static string Track_size_is_0_615_μm { + get { + return ResourceManager.GetString("Track_size_is_0_615_μm", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Track size is 0.74 μm. + /// + internal static string Track_size_is_0_74_μm { + get { + return ResourceManager.GetString("Track_size_is_0_74_μm", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Track size is 0.80 μm. + /// + internal static string Track_size_is_0_80_μm { + get { + return ResourceManager.GetString("Track_size_is_0_80_μm", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Track starts at LBA {0}, or MSF {1:X2}:{2:X2}:{3:X2}. + /// + internal static string Track_starts_at_LBA_0_or_MSF_2_3 { + get { + return ResourceManager.GetString("Track_starts_at_LBA_0_or_MSF_2_3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Transfer rate: {0} kbit/s. + /// + internal static string Transfer_rate_0_kbits { + get { + return ResourceManager.GetString("Transfer_rate_0_kbits", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Transfer will be terminated upon error detection. + /// + internal static string Transfer_will_be_terminated_upon_error_detection { + get { + return ResourceManager.GetString("Transfer_will_be_terminated_upon_error_detection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Translation layer name: {0}. + /// + internal static string Translation_layer_name_0 { + get { + return ResourceManager.GetString("Translation_layer_name_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Translation layer release level: {0}. + /// + internal static string Translation_layer_release_level_0 { + get { + return ResourceManager.GetString("Translation_layer_release_level_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Translation layer vendor: {0}. + /// + internal static string Translation_layer_vendor_0 { + get { + return ResourceManager.GetString("Translation_layer_vendor_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Travan 5. + /// + internal static string Travan5 { + get { + return ResourceManager.GetString("Travan5", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tray closed or caddy inserted but medium error. + /// + internal static string Tray_closed_or_caddy_inserted_but_medium_error { + get { + return ResourceManager.GetString("Tray_closed_or_caddy_inserted_but_medium_error", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tray open or no caddy inserted. + /// + internal static string Tray_open_or_no_caddy_inserted { + get { + return ResourceManager.GetString("Tray_open_or_no_caddy_inserted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Trigger block.. + /// + internal static string Trigger_block { + get { + return ResourceManager.GetString("Trigger_block", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Trusted Computing feature set is supported. + /// + internal static string Trusted_Computing_feature_set_is_supported { + get { + return ResourceManager.GetString("Trusted_Computing_feature_set_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ultra DMA: . + /// + internal static string Ultra_DMA { + get { + return ResourceManager.GetString("Ultra_DMA", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unconditionally generate recovered error on informational exceptions. + /// + internal static string Unconditionally_generate_recovered_error_on_informational_exceptions { + get { + return ResourceManager.GetString("Unconditionally_generate_recovered_error_on_informational_exceptions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unit is reserved by initiator ID {0:X16}. + /// + internal static string Unit_is_reserved_by_initiator_ID_0 { + get { + return ResourceManager.GetString("Unit_is_reserved_by_initiator_ID_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MHz. + /// + internal static string unit_MHz { + get { + return ResourceManager.GetString("unit_MHz", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ms. + /// + internal static string unit_ms { + get { + return ResourceManager.GetString("unit_ms", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ns. + /// + internal static string unit_ns { + get { + return ResourceManager.GetString("unit_ns", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to unknown. + /// + internal static string unit_unknown { + get { + return ResourceManager.GetString("unit_unknown", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to μs. + /// + internal static string unit_μs { + get { + return ResourceManager.GetString("unit_μs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to units. + /// + internal static string units { + get { + return ResourceManager.GetString("units", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to units of {0} bytes. + /// + internal static string units_of_0_bytes { + get { + return ResourceManager.GetString("units_of_0_bytes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown ATA revision 0x{0:X4}. + /// + internal static string Unknown_ATA_revision_0 { + get { + return ResourceManager.GetString("Unknown_ATA_revision_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown ATAPI DRQ behaviour code {0}. + /// + internal static string Unknown_ATAPI_DRQ_behaviour_code_0 { + get { + return ResourceManager.GetString("Unknown_ATAPI_DRQ_behaviour_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown ATAPI packet size code {0}. + /// + internal static string Unknown_ATAPI_packet_size_code_0 { + get { + return ResourceManager.GetString("Unknown_ATAPI_packet_size_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown auto unload code {0}. + /// + internal static string Unknown_auto_unload_code_0 { + get { + return ResourceManager.GetString("Unknown_auto_unload_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown autoloading mode code {0}. + /// + internal static string Unknown_autoloading_mode_code_0 { + get { + return ResourceManager.GetString("Unknown_autoloading_mode_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown block device. + /// + internal static string Unknown_block_device { + get { + return ResourceManager.GetString("Unknown_block_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown boot condition for bus width with code 3.. + /// + internal static string Unknown_boot_condition_for_bus_width_with_code_three { + get { + return ResourceManager.GetString("Unknown_boot_condition_for_bus_width_with_code_three", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown buffered mode code 0x{0:X2}. + /// + internal static string Unknown_buffered_mode_code_0 { + get { + return ResourceManager.GetString("Unknown_buffered_mode_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown cartridge format code {0}. + /// + internal static string Unknown_cartridge_format_code_0 { + get { + return ResourceManager.GetString("Unknown_cartridge_format_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown cartridge type code {0}. + /// + internal static string Unknown_cartridge_type_code_0 { + get { + return ResourceManager.GetString("Unknown_cartridge_type_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown CD-R disc subtype: {0}. + /// + internal static string Unknown_CD_R_disc_subtype_0 { + get { + return ResourceManager.GetString("Unknown_CD_R_disc_subtype_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown CD-RW disc subtype: {0}. + /// + internal static string Unknown_CD_RW_disc_subtype_0 { + get { + return ResourceManager.GetString("Unknown_CD_RW_disc_subtype_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown cleaning behaviour code {0}. + /// + internal static string Unknown_cleaning_behaviour_code_0 { + get { + return ResourceManager.GetString("Unknown_cleaning_behaviour_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to unknown code {0}. + /// + internal static string unknown_code_protocol_0 { + get { + return ResourceManager.GetString("unknown_code_protocol_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown command forwarding code {0}. + /// + internal static string Unknown_command_forwarding_code_0 { + get { + return ResourceManager.GetString("Unknown_command_forwarding_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown compression control code {0}. + /// + internal static string Unknown_compression_control_code_0 { + get { + return ResourceManager.GetString("Unknown_compression_control_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown data cartridge inserted. + /// + internal static string Unknown_data_cartridge_inserted { + get { + return ResourceManager.GetString("Unknown_data_cartridge_inserted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown demand read retention priority value {0}. + /// + internal static string Unknown_demand_read_retention_priority_value_0 { + get { + return ResourceManager.GetString("Unknown_demand_read_retention_priority_value_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown demand write retention priority value {0}. + /// + internal static string Unknown_demand_write_retention_priority_value_0 { + get { + return ResourceManager.GetString("Unknown_demand_write_retention_priority_value_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to unknown density code 0x{0:X2}. + /// + internal static string unknown_density_code_0 { + get { + return ResourceManager.GetString("unknown_density_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown descriptor type {1} contains: {0}. + /// + internal static string Unknown_descriptor_type_1_contains_0 { + get { + return ResourceManager.GetString("Unknown_descriptor_type_1_contains_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown descriptor type {1} contains binary data (hex): {0}. + /// + internal static string Unknown_descriptor_type_1_contains_binary_data_hex_0 { + get { + return ResourceManager.GetString("Unknown_descriptor_type_1_contains_binary_data_hex_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown device access mode {0}. + /// + internal static string Unknown_device_access_mode_0 { + get { + return ResourceManager.GetString("Unknown_device_access_mode_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown device specific configuration 0x{0:X4}. + /// + internal static string Unknown_device_specific_configuration_0 { + get { + return ResourceManager.GetString("Unknown_device_specific_configuration_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown device type field value 0x{0:X2}. + /// + internal static string Unknown_device_type_field_value_0 { + get { + return ResourceManager.GetString("Unknown_device_type_field_value_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to unknown disc type. + /// + internal static string unknown_disc_type { + get { + return ResourceManager.GetString("unknown_disc_type", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown disc type {0:X2}h. + /// + internal static string Unknown_disc_type_0 { + get { + return ResourceManager.GetString("Unknown_disc_type_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown disc type id {0}. + /// + internal static string Unknown_disc_type_id_0 { + get { + return ResourceManager.GetString("Unknown_disc_type_id_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown DVD-RAM case type key {0}. + /// + internal static string Unknown_DVD_RAM_case_type_key_0 { + get { + return ResourceManager.GetString("Unknown_DVD_RAM_case_type_key_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown enabled boot partition code {0}. + /// + internal static string Unknown_enabled_boot_partition_code_0 { + get { + return ResourceManager.GetString("Unknown_enabled_boot_partition_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown erased memory content code {0}. + /// + internal static string Unknown_erased_memory_content_code_0 { + get { + return ResourceManager.GetString("Unknown_erased_memory_content_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown factory test code {0}. + /// + internal static string Unknown_factory_test_code_0 { + get { + return ResourceManager.GetString("Unknown_factory_test_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown fence behaviour code {0}. + /// + internal static string Unknown_fence_behaviour_code_0 { + get { + return ResourceManager.GetString("Unknown_fence_behaviour_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown library interface baud rate code {0}. + /// + internal static string Unknown_library_interface_baud_rate_code_0 { + get { + return ResourceManager.GetString("Unknown_library_interface_baud_rate_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown manufacturer ID 0x{0:X2}. + /// + internal static string Unknown_manufacturer_ID_0 { + get { + return ResourceManager.GetString("Unknown_manufacturer_ID_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown medium recognition code {0}. + /// + internal static string Unknown_medium_recognition_code_0 { + get { + return ResourceManager.GetString("Unknown_medium_recognition_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown medium type. + /// + internal static string Unknown_medium_type { + get { + return ResourceManager.GetString("Unknown_medium_type", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to unknown medium type 0x{0:X2}. + /// + internal static string Unknown_medium_type_0 { + get { + return ResourceManager.GetString("Unknown_medium_type_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown method of reporting {0}. + /// + internal static string Unknown_method_of_reporting_0 { + get { + return ResourceManager.GetString("Unknown_method_of_reporting_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown or no device type. + /// + internal static string Unknown_or_no_device_type { + get { + return ResourceManager.GetString("Unknown_or_no_device_type", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown partition size unit code {0}. + /// + internal static string Unknown_partition_size_unit_code_0 { + get { + return ResourceManager.GetString("Unknown_partition_size_unit_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown pitch size key {0}. + /// + internal static string Unknown_pitch_size_key_0 { + get { + return ResourceManager.GetString("Unknown_pitch_size_key_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown port A transport type code {0}. + /// + internal static string Unknown_port_A_transport_type_code_0 { + get { + return ResourceManager.GetString("Unknown_port_A_transport_type_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown Power-On Self-Test code {0}. + /// + internal static string Unknown_Power_On_Self_Test_code_0 { + get { + return ResourceManager.GetString("Unknown_Power_On_Self_Test_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown Queue Algorithm Modifier {0}. + /// + internal static string Unknown_Queue_Algorithm_Modifier_0 { + get { + return ResourceManager.GetString("Unknown_Queue_Algorithm_Modifier_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown recovery parameter 0x{0:X2}. + /// + internal static string Unknown_recovery_parameter_0 { + get { + return ResourceManager.GetString("Unknown_recovery_parameter_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown reference velocity. + /// + internal static string Unknown_reference_velocity { + get { + return ResourceManager.GetString("Unknown_reference_velocity", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown register version {0}. + /// + internal static string Unknown_register_version_0 { + get { + return ResourceManager.GetString("Unknown_register_version_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown sense data behaviour code {0}. + /// + internal static string Unknown_sense_data_behaviour_code_0 { + get { + return ResourceManager.GetString("Unknown_sense_data_behaviour_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to unknown size identifier {0}. + /// + internal static string unknown_size_identifier_0 { + get { + return ResourceManager.GetString("unknown_size_identifier_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown Task set type {0}. + /// + internal static string Unknown_Task_set_type_0 { + get { + return ResourceManager.GetString("Unknown_Task_set_type_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown TOC entry format, printing values as-is. + /// + internal static string Unknown_TOC_entry_format_printing_values_as_is { + get { + return ResourceManager.GetString("Unknown_TOC_entry_format_printing_values_as_is", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown track pitch. + /// + internal static string Unknown_track_pitch { + get { + return ResourceManager.GetString("Unknown_track_pitch", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown track size key {0}. + /// + internal static string Unknown_track_size_key__0_ { + get { + return ResourceManager.GetString("Unknown_track_size_key__0_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown transport type 0x{0:X1}. + /// + internal static string Unknown_transport_type_0 { + get { + return ResourceManager.GetString("Unknown_transport_type_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown value in SPI clocking field 0x{0:X2}. + /// + internal static string Unknown_value_in_SPI_clocking_field_0 { + get { + return ResourceManager.GetString("Unknown_value_in_SPI_clocking_field_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown value in TPGS field 0x{0:X2}. + /// + internal static string Unknown_value_in_TPGS_field_0 { + get { + return ResourceManager.GetString("Unknown_value_in_TPGS_field_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown vendor id 0x{0:X4}. + /// + internal static string Unknown_vendor_id_0 { + get { + return ResourceManager.GetString("Unknown_vendor_id_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown wavelength. + /// + internal static string Unknown_wavelength { + get { + return ResourceManager.GetString("Unknown_wavelength", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown WORM emulation code {0}. + /// + internal static string Unknown_WORM_emulation_code_0 { + get { + return ResourceManager.GetString("Unknown_WORM_emulation_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown WORM mode label restrictions code {0}. + /// + internal static string Unknown_WORM_mode_label_restrictions_code_0 { + get { + return ResourceManager.GetString("Unknown_WORM_mode_label_restrictions_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unload is supported with outstanding NCQ commands. + /// + internal static string Unload_is_supported_with_outstanding_NCQ_commands { + get { + return ResourceManager.GetString("Unload_is_supported_with_outstanding_NCQ_commands", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unrecovered CIRC errors will not abort the transfer.. + /// + internal static string Unrecovered_CIRC_errors_will_not_abort_the_transfer { + get { + return ResourceManager.GetString("Unrecovered_CIRC_errors_will_not_abort_the_transfer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unrecovered CIRC errors will return CHECK CONDITION.. + /// + internal static string Unrecovered_CIRC_errors_will_return_CHECK_CONDITION { + get { + return ResourceManager.GetString("Unrecovered_CIRC_errors_will_return_CHECK_CONDITION", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unrecovered CIRC errors will return CHECK CONDITION and the uncorrected data.. + /// + internal static string Unrecovered_CIRC_errors_will_return_CHECK_CONDITION_and_the_uncorrected_data { + get { + return ResourceManager.GetString("Unrecovered_CIRC_errors_will_return_CHECK_CONDITION_and_the_uncorrected_data", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unrecovered ECC errors will not abort the transfer.. + /// + internal static string Unrecovered_ECC_errors_will_not_abort_the_transfer { + get { + return ResourceManager.GetString("Unrecovered_ECC_errors_will_not_abort_the_transfer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unrecovered ECC errors will return CHECK CONDITION.. + /// + internal static string Unrecovered_ECC_errors_will_return_CHECK_CONDITION { + get { + return ResourceManager.GetString("Unrecovered_ECC_errors_will_return_CHECK_CONDITION", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unrecovered ECC errors will return CHECK CONDITION and the uncorrected data.. + /// + internal static string Unrecovered_ECC_errors_will_return_CHECK_CONDITION_and_the_uncorrected_data { + get { + return ResourceManager.GetString("Unrecovered_ECC_errors_will_return_CHECK_CONDITION_and_the_uncorrected_data", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unskip time interval assignment {0} says that from {1:D2}:{2:D2}:{3:D2} to {4:D2}:{5:D2}:{6:D2} should not be skipped. + /// + internal static string Unskip_time_interval_assignment_0_says_that_from_1_2_3_to_4_5_6_should_not_be_skipped { + get { + return ResourceManager.GetString("Unskip_time_interval_assignment_0_says_that_from_1_2_3_to_4_5_6_should_not_be_ski" + + "pped", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unskip time interval assignment {0} says that from {4}:{1:D2}:{2:D2}:{3:D2} to {8}:{5:D2}:{6:D2}:{7:D2} should not be skipped. + /// + internal static string Unskip_time_interval_assignment_0_says_that_from_4_1_2_3_to_8_5_6_7_should_not_be_skipped { + get { + return ResourceManager.GetString("Unskip_time_interval_assignment_0_says_that_from_4_1_2_3_to_8_5_6_7_should_not_be" + + "_skipped", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unskip track assignment {0} says that tracks {1} should not be skipped. + /// + internal static string Unskip_track_assignment_0_says_that_tracks_1_should_not_be_skipped { + get { + return ResourceManager.GetString("Unskip_track_assignment_0_says_that_tracks_1_should_not_be_skipped", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unspecified address: {0}. + /// + internal static string Unspecified_address_0 { + get { + return ResourceManager.GetString("Unspecified_address_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to URG bit is supported in READ STREAM DMA EXT and READ STREAM EXT. + /// + internal static string URG_bit_is_supported_in_READ_STREAM_DMA_EXT_and_READ_STREAM_EXT { + get { + return ResourceManager.GetString("URG_bit_is_supported_in_READ_STREAM_DMA_EXT_and_READ_STREAM_EXT", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to URG bit is supported in WRITE STREAM DMA EXT and WRITE STREAM EXT. + /// + internal static string URG_bit_is_supported_in_WRITE_STREAM_DMA_EXT_and_WRITE_STREAM_EXT { + get { + return ResourceManager.GetString("URG_bit_is_supported_in_WRITE_STREAM_DMA_EXT_and_WRITE_STREAM_EXT", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to USA NTSC.. + /// + internal static string USA_NTSC { + get { + return ResourceManager.GetString("USA_NTSC", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to USB Attached SCSI. + /// + internal static string USB_Attached_SCSI { + get { + return ResourceManager.GetString("USB_Attached_SCSI", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use of password protection features is permanently disabled.. + /// + internal static string Use_of_password_protection_features_is_permanently_disabled { + get { + return ResourceManager.GetString("Use_of_password_protection_features_is_permanently_disabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use of permanent write protection is disabled.. + /// + internal static string Use_of_permanent_write_protection_is_disabled { + get { + return ResourceManager.GetString("Use_of_permanent_write_protection_is_disabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to User data block. + /// + internal static string User_data_block { + get { + return ResourceManager.GetString("User_data_block", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to user data only. + /// + internal static string user_data_only { + get { + return ResourceManager.GetString("user_data_only", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to user data plus auxiliary data. + /// + internal static string user_data_plus_auxiliary_data { + get { + return ResourceManager.GetString("user_data_plus_auxiliary_data", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Uses 35-bytes sense data. + /// + internal static string Uses_35_bytes_sense_data { + get { + return ResourceManager.GetString("Uses_35_bytes_sense_data", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Uses 96-bytes sense data. + /// + internal static string Uses_96_bytes_sense_data { + get { + return ResourceManager.GetString("Uses_96_bytes_sense_data", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Vendor descriptor contains: {0}. + /// + internal static string Vendor_descriptor_contains_0 { + get { + return ResourceManager.GetString("Vendor_descriptor_contains_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Vendor descriptor contains binary data (hex): {0}. + /// + internal static string Vendor_descriptor_contains_binary_data_hex_0 { + get { + return ResourceManager.GetString("Vendor_descriptor_contains_binary_data_hex_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Vendor descriptor contains unknown kind {1} of data (hex): {0}. + /// + internal static string Vendor_descriptor_contains_unknown_kind_1_of_data_hex_0 { + get { + return ResourceManager.GetString("Vendor_descriptor_contains_unknown_kind_1_of_data_hex_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Vendor's device type modifier = 0x{0:X2}. + /// + internal static string Vendor_device_type_modifier_0 { + get { + return ResourceManager.GetString("Vendor_device_type_modifier_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to VENDOR-SPECIFIC ASC {0:X2}h WITH ASCQ {1:X2}h. + /// + internal static string VENDOR_SPECIFIC_ASC_0_WITH_ASCQ_1 { + get { + return ResourceManager.GetString("VENDOR_SPECIFIC_ASC_0_WITH_ASCQ_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to VENDOR-SPECIFIC ASC {0:X2}h WITH VENDOR-SPECIFIC ASCQ {1:X2}h. + /// + internal static string VENDOR_SPECIFIC_ASC_0_WITH_VENDOR_SPECIFIC_ASCQ_1 { + get { + return ResourceManager.GetString("VENDOR_SPECIFIC_ASC_0_WITH_VENDOR_SPECIFIC_ASCQ_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Vendor specific bit 5 on byte 6 of INQUIRY response is set. + /// + internal static string Vendor_specific_bit_5_on_byte_6_of_INQUIRY_response_is_set { + get { + return ResourceManager.GetString("Vendor_specific_bit_5_on_byte_6_of_INQUIRY_response_is_set", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Vendor-specific bytes 36 to 55. + /// + internal static string Vendor_specific_bytes_36_to_55 { + get { + return ResourceManager.GetString("Vendor_specific_bytes_36_to_55", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Vendor-specific bytes 47 to 55. + /// + internal static string Vendor_specific_bytes_47_to_55 { + get { + return ResourceManager.GetString("Vendor_specific_bytes_47_to_55", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Vendor-specific bytes 96 to {0}. + /// + internal static string Vendor_specific_bytes_96_to_0 { + get { + return ResourceManager.GetString("Vendor_specific_bytes_96_to_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Vendor-specific mode control: {0}. + /// + internal static string Vendor_specific_mode_control_0 { + get { + return ResourceManager.GetString("Vendor_specific_mode_control_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Vendor-specific velocity setting: {0}. + /// + internal static string Vendor_specific_velocity_setting_0 { + get { + return ResourceManager.GetString("Vendor_specific_velocity_setting_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Vendor value {0} set in Peripheral Qualifier field.. + /// + internal static string Vendor_value_0_set_in_Peripheral_Qualifier_field { + get { + return ResourceManager.GetString("Vendor_value_0_set_in_Peripheral_Qualifier_field", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Verifying after writing is disabled. + /// + internal static string Verifying_after_writing_is_disabled { + get { + return ResourceManager.GetString("Verifying_after_writing_is_disabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Version {0}. + /// + internal static string Version_0 { + get { + return ResourceManager.GetString("Version_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Video block.. + /// + internal static string Video_block { + get { + return ResourceManager.GetString("Video_block", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Video track {3} starts at: {0:D2}:{1:D2}:{2:D2}. + /// + internal static string Video_track_3_starts_at_0_1_2 { + get { + return ResourceManager.GetString("Video_track_3_starts_at_0_1_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Volume {0}. + /// + internal static string Volume_0 { + get { + return ResourceManager.GetString("Volume_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to VStape I compressed. + /// + internal static string VStape1c { + get { + return ResourceManager.GetString("VStape1c", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to VXA-1. + /// + internal static string VXA1 { + get { + return ResourceManager.GetString("VXA1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to VXA-2. + /// + internal static string VXA2 { + get { + return ResourceManager.GetString("VXA2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to VXA-3. + /// + internal static string VXA3 { + get { + return ResourceManager.GetString("VXA3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Warning reporting is enabled. + /// + internal static string Warning_reporting_is_enabled { + get { + return ResourceManager.GetString("Warning_reporting_is_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Wavelength is 650nm. + /// + internal static string Wavelength_is_650nm { + get { + return ResourceManager.GetString("Wavelength_is_650nm", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Well known logical unit. + /// + internal static string Well_known_logical_unit { + get { + return ResourceManager.GetString("Well_known_logical_unit", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to with unknown density code 0x{0:X2}. + /// + internal static string with_unknown_density_code_0 { + get { + return ResourceManager.GetString("with_unknown_density_code_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Word {1}: 0x{0:X4}. + /// + internal static string Word_1_0 { + get { + return ResourceManager.GetString("Word_1_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Word {1} (CE-ATA): 0x{0:X4}. + /// + internal static string Word_1_CE_ATA_0 { + get { + return ResourceManager.GetString("Word_1_CE_ATA_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Word {1} (CFA): 0x{0:X4}. + /// + internal static string Word_1_CFA_0 { + get { + return ResourceManager.GetString("Word_1_CFA_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Word 116: 0x{0:X4}. + /// + internal static string Word_116_0 { + get { + return ResourceManager.GetString("Word_116_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Word 174: 0x{0:X4}. + /// + internal static string Word_174_0 { + get { + return ResourceManager.GetString("Word_174_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Word 175: 0x{0:X4}. + /// + internal static string Word_175_0 { + get { + return ResourceManager.GetString("Word_175_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Word 207 (CE-ATA): 0x{0:X4}. + /// + internal static string Word_207_CE_ATA_0 { + get { + return ResourceManager.GetString("Word_207_CE_ATA_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Word 208 (CE-ATA): 0x{0:X4}. + /// + internal static string Word_208_CE_ATA_0 { + get { + return ResourceManager.GetString("Word_208_CE_ATA_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Word 219 bits 15 to 8: 0x{0:X2}. + /// + internal static string Word_219_bits_15_to_8_0 { + get { + return ResourceManager.GetString("Word_219_bits_15_to_8_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Word 220 bits 15 to 8: 0x{0:X2}. + /// + internal static string Word_220_bits_15_to_8_0 { + get { + return ResourceManager.GetString("Word_220_bits_15_to_8_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Word 221: 0x{0:X4}. + /// + internal static string Word_221_0 { + get { + return ResourceManager.GetString("Word_221_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Word 47 bits 15 to 8: 0x{0:X2}. + /// + internal static string Word_47_bits_15_to_8_0 { + get { + return ResourceManager.GetString("Word_47_bits_15_to_8_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Word 51 bits 7 to 0: 0x{0:X2}. + /// + internal static string Word_51_bits_7_to_0_0 { + get { + return ResourceManager.GetString("Word_51_bits_7_to_0_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Word 52 bits 7 to 0: 0x{0:X2}. + /// + internal static string Word_52_bits_7_to_0_0 { + get { + return ResourceManager.GetString("Word_52_bits_7_to_0_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Word 64 bits 15 to 8: 0x{0:X2}. + /// + internal static string Word_64_bits_15_to_8_0 { + get { + return ResourceManager.GetString("Word_64_bits_15_to_8_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Word 70: 0x{0:X4}. + /// + internal static string Word_70_0 { + get { + return ResourceManager.GetString("Word_70_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Word 73: 0x{0:X4}. + /// + internal static string Word_73_0 { + get { + return ResourceManager.GetString("Word_73_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Word 74: 0x{0:X4}. + /// + internal static string Word_74_0 { + get { + return ResourceManager.GetString("Word_74_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Word 9: 0x{0:X4}. + /// + internal static string Word_nine_0 { + get { + return ResourceManager.GetString("Word_nine_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to World Wide Name: {0:X16}. + /// + internal static string World_Wide_Name_0 { + get { + return ResourceManager.GetString("World_Wide_Name_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to WORM emulation is disabled. + /// + internal static string WORM_emulation_is_disabled { + get { + return ResourceManager.GetString("WORM_emulation_is_disabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to WORM emulation is enabled. + /// + internal static string WORM_emulation_is_enabled { + get { + return ResourceManager.GetString("WORM_emulation_is_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Write block: {0} bytes. + /// + internal static string Write_block_0_bytes { + get { + return ResourceManager.GetString("Write_block_0_bytes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Write block length is {0} bytes. + /// + internal static string Write_block_length_is_0_bytes { + get { + return ResourceManager.GetString("Write_block_length_is_0_bytes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Write block length size is defined in extended CSD. + /// + internal static string Write_block_length_size_is_defined_in_extended_CSD { + get { + return ResourceManager.GetString("Write_block_length_size_is_defined_in_extended_CSD", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to WRITE BUFFER DMA is supported. + /// + internal static string WRITE_BUFFER_DMA_is_supported { + get { + return ResourceManager.GetString("WRITE_BUFFER_DMA_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to WRITE BUFFER is supported. + /// + internal static string WRITE_BUFFER_is_supported { + get { + return ResourceManager.GetString("WRITE_BUFFER_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to WRITE BUFFER is supported and enabled. + /// + internal static string WRITE_BUFFER_is_supported_and_enabled { + get { + return ResourceManager.GetString("WRITE_BUFFER_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Write buffer shall have a full ratio of {0} before being flushed to medium. + /// + internal static string Write_buffer_shall_have_a_full_ratio_of_0_before_being_flushed_to_medium { + get { + return ResourceManager.GetString("Write_buffer_shall_have_a_full_ratio_of_0_before_being_flushed_to_medium", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Write-cache is enabled. + /// + internal static string Write_cache_is_enabled { + get { + return ResourceManager.GetString("Write_cache_is_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Write cache is supported. + /// + internal static string Write_cache_is_supported { + get { + return ResourceManager.GetString("Write_cache_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Write cache is supported and enabled. + /// + internal static string Write_cache_is_supported_and_enabled { + get { + return ResourceManager.GetString("Write_cache_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Write commands can cross physical block boundaries. + /// + internal static string Write_commands_can_cross_physical_block_boundaries { + get { + return ResourceManager.GetString("Write_commands_can_cross_physical_block_boundaries", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Write current reduction starts at cylinder {0}. + /// + internal static string Write_current_reduction_starts_at_cylinder_0 { + get { + return ResourceManager.GetString("Write_current_reduction_starts_at_cylinder_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to WRITE DMA FUA EXT and WRITE MULTIPLE FUA EXT are supported. + /// + internal static string WRITE_DMA_FUA_EXT_and_WRITE_MULTIPLE_FUA_EXT_are_supported { + get { + return ResourceManager.GetString("WRITE_DMA_FUA_EXT_and_WRITE_MULTIPLE_FUA_EXT_are_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to WRITE DMA FUA EXT and WRITE MULTIPLE FUA EXT are supported and enabled. + /// + internal static string WRITE_DMA_FUA_EXT_and_WRITE_MULTIPLE_FUA_EXT_are_supported_and_enabled { + get { + return ResourceManager.GetString("WRITE_DMA_FUA_EXT_and_WRITE_MULTIPLE_FUA_EXT_are_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to WRITE DMA QUEUED FUA EXT is supported. + /// + internal static string WRITE_DMA_QUEUED_FUA_EXT_is_supported { + get { + return ResourceManager.GetString("WRITE_DMA_QUEUED_FUA_EXT_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to WRITE DMA QUEUED FUA EXT is supported and enabled. + /// + internal static string WRITE_DMA_QUEUED_FUA_EXT_is_supported_and_enabled { + get { + return ResourceManager.GetString("WRITE_DMA_QUEUED_FUA_EXT_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Write-once device. + /// + internal static string Write_once_device { + get { + return ResourceManager.GetString("Write_once_device", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Write pre-compensation is {0}. + /// + internal static string Write_pre_compensation_is_0 { + get { + return ResourceManager.GetString("Write_pre_compensation_is_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Write pre-compensation starts at cylinder {0}. + /// + internal static string Write_pre_compensation_starts_at_cylinder_0 { + get { + return ResourceManager.GetString("Write_pre_compensation_starts_at_cylinder_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Write/Read/Verify is supported. + /// + internal static string Write_Read_Verify_is_supported { + get { + return ResourceManager.GetString("Write_Read_Verify_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Write/Read/Verify is supported and enabled. + /// + internal static string Write_Read_Verify_is_supported_and_enabled { + get { + return ResourceManager.GetString("Write_Read_Verify_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to WRITE UNCORRECTABLE is supported. + /// + internal static string WRITE_UNCORRECTABLE_is_supported { + get { + return ResourceManager.GetString("WRITE_UNCORRECTABLE_is_supported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to WRITE UNCORRECTABLE is supported and enabled. + /// + internal static string WRITE_UNCORRECTABLE_is_supported_and_enabled { + get { + return ResourceManager.GetString("WRITE_UNCORRECTABLE_is_supported_and_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Writing inhibited by media specific reason. + /// + internal static string Writing_inhibited_by_media_specific_reason { + get { + return ResourceManager.GetString("Writing_inhibited_by_media_specific_reason", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Writing is {0} times slower than reading. + /// + internal static string Writing_is_0_times_slower_than_reading { + get { + return ResourceManager.GetString("Writing_is_0_times_slower_than_reading", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ANSI X3.136-1986: 6.3 mm 4 or 9-Track Magnetic Tape Cartridge, 315 bpmm, GCR (QIC-24). + /// + internal static string X3_136 { + get { + return ResourceManager.GetString("X3_136", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ANSI X3.157-1987: 12.7 mm 9-Track Magnetic Tape, 126 bpmm, Phase Encoding. + /// + internal static string X3_157 { + get { + return ResourceManager.GetString("X3_157", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ANSI X3.158-1987: 3.81 mm 4-Track Magnetic Tape Cassette, 315 bpmm, GCR. + /// + internal static string X3_158 { + get { + return ResourceManager.GetString("X3_158", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ANSI X3.191: 130 mm Write-Once double-sided optical disc with 30000 tracks. + /// + internal static string X3_191 { + get { + return ResourceManager.GetString("X3_191", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ANSI X3.193-1990: 12.7 mm 48-Track Magnetic Tape Cartridge, 394 bpmm, MFM. + /// + internal static string X3_193 { + get { + return ResourceManager.GetString("X3_193", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ANSI X3.200: 356 mm double-sided optical disc with 56350 tracks. + /// + internal static string X3_200 { + get { + return ResourceManager.GetString("X3_200", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ANSI X3.202-1991: 8 mm Magnetic Tape Cassette, 1703 bpmm, RLL. + /// + internal static string X3_202 { + get { + return ResourceManager.GetString("X3_202", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ANSI X3.211: 130 mm Write-Once double-sided optical disc with 18750 tracks. + /// + internal static string X3_211 { + get { + return ResourceManager.GetString("X3_211", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ANSI X3.212: 130 mm Read/Write double-sided optical disc with 18750 tracks. + /// + internal static string X3_212 { + get { + return ResourceManager.GetString("X3_212", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ANSI X3.214: 130 mm Write-Once double-sided optical disc with 20000 tracks. + /// + internal static string X3_214 { + get { + return ResourceManager.GetString("X3_214", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ANSI X3B5/86-199: 12.7 mm 22-Track Magnetic Tape Cartridge, 262 bpmm, MFM. + /// + internal static string X3B5_86 { + get { + return ResourceManager.GetString("X3B5_86", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ANSI X3B5/88-185A: 3.81 mm Magnetic Tape Cassette, 2400 bpmm, DDS. + /// + internal static string X3B5_88 { + get { + return ResourceManager.GetString("X3B5_88", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ANSI X3B5/97-174: 12.7 mm 48-Track Magnetic Tape Cartridge, 1673 bpmm, MFM. + /// + internal static string X3B5_91 { + get { + return ResourceManager.GetString("X3B5_91", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Xbox 360 Game Disc. + /// + internal static string Xbox_360_Game_Disc { + get { + return ResourceManager.GetString("Xbox_360_Game_Disc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Xbox Game Disc. + /// + internal static string Xbox_Game_Disc { + get { + return ResourceManager.GetString("Xbox_Game_Disc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to XOR operations are disabled. + /// + internal static string XOR_operations_are_disabled { + get { + return ResourceManager.GetString("XOR_operations_are_disabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Zone {0} starts at LSN {1}. + /// + internal static string Zone_0_starts_at_LSN_1 { + get { + return ResourceManager.GetString("Zone_0_starts_at_LSN_1", resourceCulture); + } + } + } +} diff --git a/Aaru.Decoders/Localization/Localization.es.resx b/Aaru.Decoders/Localization/Localization.es.resx new file mode 100644 index 000000000..e6a84bfc2 --- /dev/null +++ b/Aaru.Decoders/Localization/Localization.es.resx @@ -0,0 +1,9752 @@ + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + DEVICE RESET está soportado + + + Valor A1: 0x{0:X6} + + + Valor A2: 0x{0:X6} + + + Valor A3: 0x{0:X6} + + + AACS Data Keys en hexadecimal a continuación: + + + AACS Media Identifier en hexadecimal a continuación: + + + AACS Media Key Blocks en hexadecimal a continuación: + + + AACS Media Serial Number en hexadecimal a continuación: + + + AACS Volume Identifier en hexadecimal a continuación: + + + Abortar cualquier comando de escritura sin información de protección + + + Tiempo absoluto: {0:D2}:{1:D2}:{2:D2} + + + Tiempo absoluto: {3:D2}:{0:D2}:{1:D2}:{2:D2} + + + Accessible Max Address Configuration está soportada + + + Accessible Max Address Configuration está soportada y activada + + + ACS-2 publicado, ANSI INCITS 482-2012 + + + ACS-2 revisión 2 + + + ACS-2 revisión 3 + + + ACS-2 revisión 3b + + + ACS-3 revisión 4 + + + ACS-3 revisión 5 + + + Formato activo: {0} + + + Partición activa: {0} + + + Reintentos actuales: {0} + + + Añadiendo sector {0} de la pista {1} + + + Información adicional: + + + ID de producto adicional: {0} + + + Dirección para el servicio de configuración administrativa: {0} + + + Dirección para descarga de código: {0} + + + Dirección para servicio de copia: {0} + + + Dirección para diagnósticos: {0} + + + Dirección para anotaciones: {0} + + + Dirección para el servicio de configuración de almacenamiento: {0} + + + Dirección para estado: {0} + + + Address Offset Reserved Area Boot está soportado + + + Address Offset Reserved Area Boot está soportado y activado + + + Dirección de tipo {1} desconocido: {0} + + + PIO avanzado: + + + La Gestión Avanzada de Energía (APM) está soportada + + + La Gestión Avanzada de Energía (APM) está soportada y activada con valor {0} + + + Los comandos afectados en la tarea con el nexus en CHECK CONDITION se abortarán + + + AIT-1 + + + AIT-2 + + + AIT-3 + + + álbum + + + Las alertas están activadas + + + Se intentarán todos los procedimientos de recuperación. + + + Todos los datos y la respuesta a un comando se transferirán en una interconexión única + + + Todos los datos de un comando se transferirán en una interconexión única + + + Todos los bloques restantes son {0} y tienen {1} bytes cada uno + + + Todos los bloques restantes son {0} y tienen una longitud variable + + + Todos los bloques restantes tienen {0} bytes cada uno + + + Todos los bloques restantes son conformes a {0} y tienen {1} bytes cada uno + + + Todos los bloques restantes son conformes a {0} y tienen una longitud variable + + + Todos los bloques restantes tienen {0} y tienen {1} bytes cada uno + + + Todos los bloques restantes tienen una longitud variable + + + Todas las tareas recibidas en el nexto con ACA ACTIVE establecido y en condición ACA deben terminar + + + Todos los comandos afectados en el conjunto de tarea deberán abortarse cuando se devuelva CHECK CONDITION + + + Siempre aplicar la operación de verificación + + + un algorithmo de código {0} desconocido + + + un tipo de medio 0x{0:X2} desconocido + + + un algoritmo de compresión no registrado + + + ID de aplicación: {0} + + + La página de modos de Marca de Aplicación está activada + + + Aplicar la operación de verificación dependiendo de la condición + + + Dispositivo controlador de colección + + + ASC {0:X2}h CON ASCQ {1:X2}h + + + ASC {0:X2}h CON ASCQ DE FABRICANTE {1:X2}h + + + NTSC (Asia) + + + La protección contra escritura asociada está activada + + + El tiempo de acceso de datos asíncrono es {0}{1} + + + Evento asíncrono de reporte de excepciones informativas + + + La notificación asíncrona está soportada + + + La notificación asíncrona está soportada y activada + + + ATA8-ACS revisión 2d + + + ATA8-ACS revisión 3b + + + ATA8-ACS revisión 3c + + + ATA8-ACS revisión 3e + + + ATA8-ACS revisión 3f + + + ATA8-ACS revisión 4 + + + ATA8-ACS revisión 4c + + + ATA8-ACS revisión 6 + + + Dispositivo ATAPI controlador de colecciones + + + Interfaz ATAPI de automatización + + + Expansores puente ATAPI + + + Dispositivo ATAPI CD-ROM/DVD/etc + + + Dispositivo ATAPI de comunicaciones + + + Dispositivo ATAPI + + + El dispositivo ATAPI requiere restablecimiento ATA por software + + + El dispositivo ATAPI soporta atención de dispositivos conectados + + + El dispositivo ATAPI soporta encolado de comandos + + + El dispositivo ATAPI soporta detectar el entorno anfitrión + + + El dispositivo ATAPI soporta DMA entrelazado + + + El dispositivo ATAPI soporta operaciones superpuestas + + + El dispositivo ATAPI usa paquetes de comandos de 12 bytes + + + El dispositivo ATAPI usa paquetes de comandos de 16 bytes + + + Dispositivo ATAPI de acceso directo + + + Dispositivo ATAPI de servicios de carcasas + + + Dispositivo ATAPI de artes gráficas pre-prensa (definido en ASC IT8) + + + Dispositivo ATAPI de cambio de medios + + + Dispositivo ATAPI de almacenamiento basado en objetos + + + Dispositivo ATAPI de lector/escritor de tarjeta óptica + + + Dispositivo ATAPI de memoria óptica + + + Dispositivo ATAPI de impresora + + + Dispositivo ATAPI de procesador + + + Dispositivo ATAPI de escáner + + + Dispositivo ATAPI de acceso secuencial + + + Dispositivo ATAPI simplificado de acceso directo + + + Dispositivo ATAPI con valor de tipo 0x{0:X2} desconocido + + + Dispositivo ATAPI desconocido o sin tipo + + + Dispositivo ATAPI de unidad lógica conocida + + + Dispositivo ATAPI de escritura única + + + ATA-1 publicado, ANSI X3.221-1994 + + + ATA-2 publicado, ANSI X3.279-1996 + + + ATA-2 X3T10 948D anterior a revisión 2k + + + ATA-2 X3T10 948D revisión 2k + + + ATA-2 X3T10 948D revisión 3 + + + ATA-3 publicado, ANSI X3.298-1997 + + + ATA-3 X3T10 2008D revisión 0 + + + ATA-3 X3T10 2008D revisión 1 + + + ATA-3 X3T10 2008D revisión 6 + + + ATA-3 X3T13 2008D revisión 7 + + + ATA/ATAPI-4 publicado, ANSI INCITS 317-1998 + + + ATA/ATAPI-4 T13 1153D revisión 13 + + + ATA/ATAPI-4 T13 1153D revisión 14 + + + ATA/ATAPI-4 T13 1153D revisión 15 + + + ATA/ATAPI-4 T13 1153D revisión 17 + + + ATA/ATAPI-4 T13 1153D revisión 18 + + + ATA/ATAPI-4 X3T13 1153D revisión 6 + + + ATA/ATAPI-4 X3T13 1153D revisión 7 + + + ATA/ATAPI-5 publicado, ANSI INCITS 340-2000 + + + ATA/ATAPI-5 T13 1321D revisión 1 + + + ATA/ATAPI-5 T13 1321D revisión 3 + + + ATA/ATAPI-6 publicado, ANSI INCITS 361-2002 + + + ATA/ATAPI-6 T13 1410D revisión 0 + + + ATA/ATAPI-6 T13 1410D revisión 1 + + + ATA/ATAPI-6 T13 1410D revisión 2 + + + ATA/ATAPI-6 T13 1410D revisión 3a + + + ATA/ATAPI-7 publicado ANSI INCITS 397-2005 + + + ATA/ATAPI-7 T13 1523D revisión 0 + + + ATA/ATAPI-7 T13 1523D revisión 1 + + + ATA/ATAPI-7 T13 1523D revisión 4a + + + ATA (ATA-1) X3T9.2 781D anterior a la revisión 4 + + + ATA (ATA-1) X3T9.2 781D revisión 4 + + + Dispositivo ATA + + + Información de ATA IDENTIFY a continuación: + + + Último tiempo de comienzo posible del Lead-out según ATIP: 0x{0:X6} + + + Último tiempo de comienzo posible del Lead-out según ATIP: {0}:{1:D2}:{2:D2} + + + Tiempo de comienzo del Lead-in según ATIP: 0x{0:X6} + + + Tiempo de comienzo del Lead-in según ATIP: {0}:{1:D2}:{2:D2} + + + Interfaz de conexión AT (ATA/ATAPI) + + + Siempre se pre-leerán al menos {0} bloques + + + Debe estar inactivo al menos {0} ms antes de resumir una operación de escaneo en segundo plano + + + al volumen máximo + + + Mínimo {0} ns. de tiempo del ciclo de transferencia por palabra en MDMA, {1} ns. recomendados + + + Mínimo {0} ns. de tiempo del ciclo de transferencia por palabra en PIO, sin control de flujo + + + Mínimo {0} ns. de tiempo del ciclo de transferencia por palabra en PIO, con control de flujo IORDY + + + Como mucho {0} ms deben pasar antes de suspender una operación de escaneo en segundo plano y procesando los comandos recibidos + + + al volumen {0} + + + Bloque de audio. + + + sólo información de audio + + + La pista de audio {3} comienza en: {0:D2}:{1:D2}:{2:D2} ( + + + La pista de audio {3} comienza en: {4:D2}:{0:D2}:{1:D2}:{2:D2} ( + + + El soporte del modo de datos audiovisual está aplicado + + + La gestión acústica automática (AAM) está soportada + + + La gestión acústica automática (AAM) está soportada y activada con el valor {0} (el fabricante recomienda {1} + + + Las transiciones automáticas de parcial a inactividad están activadas + + + La recolocación automática en lectura está activada + + + La recolocación automática en escritura está activada + + + Interfaz de automatización/unidad + + + Interfaz de transporte de automatización/unidad + + + La automatización está desactivada + + + una combinación de óptico de sólo lectura y borrable + + + una combinación de óptico de escritura única y borrable + + + Se pre-leerán un máximo de {0} bloques + + + Se pre-leerán un máximo de {0} bloques incluso si se piden más + + + Se permite un máximo de {0} ms ocupado + + + Se transferirán un máximo de {0} sectores por interrupción en READ/WRITE MULTIPLE + + + Una excepción informacional de prueba se lanzará en el siguiente temporizador + + + Las funciones en segundo plano están activadas + + + El escaneo del medio en segundo plano está activado + + + Los pre-escaneos en segundo plano están activados + + + Las operaciones en segundo plano pueden tomar un máximo de {0} horas + + + Los escaneos en segundo plano se pararán si las anotaciones están llenas + + + Sólo se notaran los escaneos en segundo plano que requieran intervención + + + Dispositivo BGA + + + Contenidos en binario: {0} + + + La comprobación de estar en blanco está activada al escribir + + + BLOCK ERASE EXT está soportado + + + Bloque número {0} + + + Burst Cutting Area de Blu-ray en hexadecimal a continuación: + + + Datos específicos del tipo de disco Blu-ray en hexadecimal a continuación: + + + Bits de estado del descriptor de disco Blu-ray en hexadecimal a continuación: + + + Contenidos de información de disco dependiente del formato de Blu-ray en hexadecimal a continuación: + + + Tipo de libro: 0x{0:X2} + + + El área de arranque 1 no está protegida + + + El área de arranque 1 está protegida permanentemente + + + El área de arranque 1 está protegida contra escritura permanentemente + + + El área de arranque 1 está protegida en el encendido + + + El área de arranque 1 está protegida contra escritura hasta el próximo ciclo de corriente + + + El área de arranque 2 no está protegida + + + El área de arranque 2 está protegida permanentemente + + + El área de arranque 2 está protegida contra escritura permanentemente + + + El área de arranque 2 está protegida contra escritura hasta el próximo ciclo de corriente + + + El área de arranque 2 está protegida en el encendido + + + Versión del firmware de arranque: {0} + + + Ambas áreas de arranque están protegidas contra escritura permanentemente + + + Ambas áreas de arranque están protegidas contra escritura hasta el próximo ciclo de corriente + + + Expansores puente + + + bytes + + + El análisis de la caché está permitido + + + ID de tarjeta: 0x{0:X4} + + + La tarjeta indica cumplimiento del estandar PC Card versión {0}.{1} + + + El cartucho tiene una capacidad sin comprimir de {0} gigabytes + + + El cartucho está protegido contra escritura + + + La extracción del cartucho está prevenida + + + Número de serie del cartucho: {0} + + + El cartucho decide la protección contra escritura + + + La cinta del cartucho está enroscada + + + El cartucho se cargará y enroscará en su inserción + + + El cartucho se cargará pero no se enroscará en su inserción + + + El cartucho no se cargará + + + Número de catálogo: + + + Dispositivo CD-ROM/DVD/etc + + + Sector CD-ROM. + + + Sector CD. + + + El paquete de CD-Text contiene el arreglista del álbum + + + El paquete de CD-Text contiene el arreglista de la pista {0} + + + El paquete de CD-Text contiene mensaje del proveedor para el álbum + + + El paquete de CD-Text contiene mensaje del proveedor para la pista {0} + + + El paquete de CD-Text contiene datos reservados para el proveedor + + + El paquete de CD-Text contiene información de identificación del disco + + + El paquete de CD-Text contiene información de identificación del género + + + El paquete de CD-Text contiene el intérprete del álbum + + + El paquete de CD-Text contiene el intérprete de la pista {0} + + + El paquete de CD-Text contiene datos reservados + + + El paquete de CD-Text contiene información de una segunda tabla de contenidos + + + El paquete de CD-Text contiene información del tamaño del bloque + + + El paquete de CD-Text contiene el compositor del álbum + + + El paquete de CD-Text contiene el compositor de la pista {0} + + + El paquete de CD-Text contiene información de una tabla de contenidos + + + El paquete de CD-Text contiene el título del álbum + + + El paquete de CD-Text contiene el título de la pista {0} + + + El paquete de CD-Text contiene el UPC + + + Disco CD-V en formato NTSC con sonido digital bilingüe + + + Disco CD-V en formato NTSC con sonido digital estéreo + + + Disco CD-V en formato PAL con sonido digital bilingüe + + + Disco CD-V en formato PAL con sonido digital estéreo + + + Single CD-V en formato NTSC con conido digital bilingüe + + + Single CD-V en formato NTSC con sonido digital estéreo + + + Single CD-V en formato PAL con sonido digital bilingüe + + + Single CD-V en formato PAL con sonido digital estéreo + + + Número de serie de la base mécanica: {0} + + + Número de serie de la placa: {0} + + + Página de niveles de revisión de los componentes de la unidad Certance: + + + Página de números de serie de los componentes de la unidad Certance: + + + Componente: {0} + + + Fecha: {0} + + + Página de control de capacidades de la unidad Certance: + + + Página de estado de la unidad Certance: + + + Número de serie del emsamblado del cabezal: {0} + + + Página de control de modos de la interfaz Central: + + + Número de serie del motor del carrete 1: {0} + + + Número de serie del motor del carrete 2: {0} + + + Variante: {0} + + + Versión: {0} + + + ID del desafío: {0} + + + Nivel del desafío: {0} + + + Valor del desafío: 0x{0:X8} + + + El cambio de los bits de registro de la configuración de arranque está desactivado hasta el próximo ciclo de corriente. + + + El cambio de los bits de registro de la configuración de arranque está desactivado permanentemente. + + + Canal número: {0} + + + Posición del carácter {0} + + + Checksum {0} + + + Se debe reportar CHECK CONDITION en lugar de una condición de ocupación larga + + + CID CRC: 0x{0:X2} + + + El comportamiento de limpieza es normal + + + Está insertado un cartucho de limpieza + + + El acceso a datos dependiente del reloj es de {0} ciclos del reloj + + + ) + + + Nombre del código: {0} + + + Número de información de codificación: {0} + + + Los comandos pueden reordenarse de cualquier forma + + + Los comandos deben mandar estrictamente ordenados + + + El reenvío de comandos está desactivado + + + El reenvío de comandos está activado + + + Conjunto de comandos y funciones: + + + Dispositivo de comunicaciones + + + Dispositivo CompactFlash + + + El dispositivo CompactFlash soporta el modo de energía 1 + + + El dispositivo CompactFlash usa un máximo de {0} mA + + + El conjunto de funciones CompactFlash está soportado + + + El conjunto de funciones CompactFlash está soportado y activado + + + El modo de energía 1 de CompactFlash está desactivado + + + El modo de energía 1 de CompactFlash se requiere para algunos comandos + + + La compresión se controla con las páginas de modo 0Fh y 10h + + + La compresión está desactivada y no es controlable + + + La compresión está activada y no es controlable + + + Condicionalmente generar errores recuperables en excepciones informativas + + + Disco de uso de consumidor para uso en unidades de consumidor + + + Versión de firmware del controlador: {0} + + + Versión de hardware del controlador: {0} + + + La zona de control de datos está pre-grabada + + + Copyright: {0} + + + Encontrada copia de la información A1 del ATIP + + + ECC P correcto. + + + ECC Q correcto. + + + EDC correcto. + + + Contenido del sector correcto. + + + Relleno de ceros correcto. + + + No se pudo descodificar la información de ATA IDENTIFY. + + + CPRM Media Key Blocks en hexadecimal a continuación: + + + CRC: 0x{0:X4} + + + CRYPTO SCRAMBLE EXT está soportado + + + CSD CRC: 0x{0:X2} + + + CSD versión 1.{0} revisión 1.{1} + + + CompactTape I + + + CompactTape II + + + (actual) + + + El primer sector actual del Border-Out es el PSN {0:X}h + + + El medio actual tiene disponibles {0} bytes de enlace + + + El medio actual está inicializado con TCG OSSC + + + Definición de operación actual: {0} + + + El RMD en la zona borde extra comienza en el PSN {0:X}h + + + Modo Escritura/Lectura/Verificación actual: {0} + + + Cilindros: {0} + + + Cilindros: {0} máx., {1} actualmente + + + disco óptico de 200 mm + + + disco óptico de 89 mm de lectura/escritura y doble cara con 12500 pistas + + + El área de datos comienzo en el PSN {0:X}h + + + El área de datos finaliza en el PSN {0:X}h + + + Bloque de datos. + + + La compresión de datos está activada con + + + La descompresión de datos está activada + + + Los datos tienen {0} bytes + + + Los datos no recuperados dentro de los límites deben transferirse de vuelta antes de un CHECK CONDITION + + + Los datos recogidos por los comandos READ deben eliminarse de la caché antes que los datos puestos en la caché de lectura por otros medios + + + Los datos recogidos por los comandos READ no deben eliminarse si hay datos puestos en la caché por otros medios que pueden ser eliminados + + + Los datos puestos por los comandos WRITE deben eliminarse de la caché antes que los datos puestos en la caché de escritura por otros medios + + + Los datos puestos por los comandos WRITE no deben eliminarse si hay datos puestos en la caché por otros medios que pueden ser eliminados + + + DATA SET MANAGEMENT puede recibir un máximo de {0} bloques de 512 bytes + + + La opción de compensación de datos intermitentes está disponible + + + Las cintas de datos se enroscarán al principio, y las demás se descargarán + + + Pista de datos {3} comienza en: {0:D2}:{1:D2}:{2:D2} ( + + + Pista de datos {3} comienza en: {4:D2}:{1:D2}:{2:D2} ( + + + Pista de datos, grabada incrementalmente + + + Pista de datos, graba ininterrumpidamente + + + El control de desconexión de la transferencia de datos no se usa + + + DC-9200 + + + DC-9250 + + + DCLZ + + + DDS-2 + + + DDS-3 + + + DDS-4 + + + Formato DDS: 0x{0:X2} + + + El DDS se ha actualizado {0} veces + + + Definición de operación por defecto: {0} + + + Densidad "{0}" definida por "{1}". + + + Descripción de densidad: {0} + + + La densidad tiene {0} bits por mm, con {1} pistas en una cinta de {2} mm de ancho + + + La capacidad máxima de la densidad es {0} megabytes + + + El descriptor se refiere al protocolo {0} + + + Código del desarrollador: {0} + + + La caché del dispostivo está activada + + + El dispositivo permite leer bloques parciales + + + El dispositivo permite escribir bloques parciales + + + La partición de arranque 1 del dispositivo está activada + + + La partición de arranque 2 del dispositivo está activada + + + El dispositivo no puede alcanzar 2,4MB/s leyendo en el modo SDR 26MHz de 4-bit + + + El dispositivo no puede alcanzar 2,4MB/s leyendo en el modo SDR 26MHz + + + El dispositivo no puede alcanzar 2,4MB/s leyendo en el modo SDR 52MHz + + + El dispositivo no puede alcanzar 2,4MB/s escribiendo en el modo SDR 26MHz de 4-bit + + + El dispositivo no puede alcanzar 2,4MB/s escribiendo en el modo SDR 26MHz + + + El dispositivo no puede alcanzar 2,4MB/s escribiendo en el modo SDR 52MHz + + + El dispositivo no puede alcanzar 4,8MB/s leyendo en el modo DDR 52MHz + + + El dispositivo no puede alcanzar 4,8MB/s escribiendo en el modo DDR 52MHz + + + El dispositivo no puede proteger regiones contra escritura + + + El dispositivo puede alcanzar un mínimo de {0}MB/s leyendo en el modo DDR 52MHz + + + El dispositivo puede alcanzar un mínimo de {0}MB/s leyendo en el modo SDR 26MHz de 4-bit + + + El dispositivo puede alcanzar un mínimo de {0}MB/s leyendo en el modo SDR 26MHz + + + El dispositivo puede alcanzar un mínimo de {0}MB/s leyendo en el modo SDR 52MHz + + + El dispositivo puede alcanzar un mínimo de {0}MB/s escribiendo en el modo DDR 52MHz + + + El dispositivo puede alcanzar un mínimo de {0}MB/s escribiendo en el modo SDR 26MHz de 4-bit + + + El dispositivo puede alcanzar un mínimo de {0}MB/s escribiendo en el modo SDR 26MHz + + + El dispositivo puede alcanzar un mínimo de {0}MB/s escribiendo en el modo SDR 52MHz + + + El dispositivo puede borrar un mínimo de {0} bloques a la vez + + + El dispositivo puede borrar múltiples bloques + + + El dispositivo tiene mejores tecnológicas en las particiones y el área de datos de usuario + + + El dispositivo puede tener el atributo de particiones extendidas + + + El dispositivo puede cambiar a funcionar con un suministro de 1,8V + + + El dispositivo toma un máximo de {0} ms para liberarse de una interrupción + + + El dispositivo toma un máximo de {0} ms para cambiar de partición + + + El dispositivo puede funcionar con un suministro de 3,5~3,6V + + + El dispositivo puede funcionar con un suministro de 3,4~3,5V + + + El dispositivo puede funcionar con un suministro de 3,3~3,4V + + + El dispositivo puede funcionar con un suministro de 3,2~3,3V + + + El dispositivo puede funcionar con un suministro de 3,1~3,2V + + + El dispositivo puede funcionar con un suministro de 2,9~3,0V + + + El dispositivo puede funcionar con un suministro de 2,8~2,9V + + + El dispositivo puede funcionar con un suministro de 2,7~2,8V + + + El dispositivo puede funcionar con un suministro de 2,6~2,7V + + + El dispositivo puede funcionar con un suministro de 2,5~2,6V + + + El dispositivo puede funcionar con un suministro de 2,4~2,5V + + + El dispositivo puede funcionar con un suministro de 2,3~2,4V + + + El dispositivo puede funcionar con un suministro de 2,2~2,3V + + + El dispositivo puede funcionar con un suministro de 2,1~2,2V + + + El dispositivo puede funcionar con un suministro de 2,0~2,1V + + + El dispositivo puede funcionar con un suministro de 1,65~1,95V + + + El dispositivo puede proteger contra escritura un mínimo de {0} bloques a la vez + + + El dispositivo puede proteger regiones contra escritura + + + Capacidades del dispositivo: + + + El dispositivo comprueba la etiqueta de aplicación del bloque lógico + + + El dispositivo comprueba la etiqueta de guarda del bloque lógico + + + El dispositivo comprueba la etiqueta de referencia del bloque lógico + + + El dispositivo es conforme con SAM (versión no especificada) + + + El dispositivo es conforme con SAM T10/0994-D revisión 18 + + + El dispositivo es conforme con SAM ANSI INCITS 270-1996 + + + El dispositivo es conforme con SAM-2 (versión no especificada) + + + El dispositivo es conforme con SAM-2 T10/1157-D revisión 23 + + + El dispositivo es conforme con SAM-2 T10/1157-D revisión 24 + + + El dispositivo es conforme con SAM-2 ANSI INCITS 366-2003 + + + El dispositivo es conforme con SAM-2 ISO/IEC 14776-412 + + + El dispositivo es conforme con SAM-3 (versión no especificada) + + + El dispositivo es conforme con SAM-3 T10/1561-D revisión 7 + + + El dispositivo es conforme con SAM-3 T10/1561-D revisión 13 + + + El dispositivo es conforme con SAM-3 T10/1561-D revisión 14 + + + El dispositivo es conforme con SAM-3 ANSI INCITS 402-2005 + + + El dispositivo es conforme con SAM-4 (versión no especificada) + + + El dispositivo es conforme con SAM-4 T10/1683-D revisión 13 + + + El dispositivo es conforme con SAM-4 T10/1683-D revisión 14 + + + El dispositivo es conforme con SAM-4 ANSI INCITS 447-2008 + + + El dispositivo es conforme con SAM-4 ISO/IEC 14776-414 + + + El dispositivo es conforme con SAM-5 (versión no especificada) + + + El dispositivo es conforme con SAM-5 T10/2104-D revisión 4 + + + El dispositivo es conforme con SAM-5 T10/2104-D revisión 20 + + + El dispositivo es conforme con SAM-5 T10/2104-D revisión 21 + + + El dispositivo es conforme con SAM-6 (versión no especificada) + + + El dispositivo es conforme con SPC (versión no especificada) + + + El dispositivo es conforme con SPC T10/0995-D revisión 11a + + + El dispositivo es conforme con SPC ANSI INCITS 301-1997 + + + El dispositivo es conforme con MMC (versión no especificada) + + + El dispositivo es conforme con MMC T10/1048-D revisión 10a + + + El dispositivo es conforme con MMC ANSI INCITS 304-1997 + + + El dispositivo es conforme con SCC (versión no especificada) + + + El dispositivo es conforme con SCC T10/1047-D revisión 06c + + + El dispositivo es conforme con SCC ANSI INCITS 276-1997 + + + El dispositivo es conforme con SBC (versión no especificada) + + + El dispositivo es conforme con SBC T10/0996-D revisión 08c + + + El dispositivo es conforme con SBC ANSI INCITS 306-1998 + + + El dispositivo es conforme con SMC (versión no especificada) + + + El dispositivo es conforme con SMC T10/0999-D revisión 10a + + + El dispositivo es conforme con SMC ANSI INCITS 314-1998 + + + El dispositivo es conforme con SMC ISO/IEC 14776-351 + + + El dispositivo es conforme con SES (versión no especificada) + + + El dispositivo es conforme con SES T10/1212-D revisión 08b + + + El dispositivo es conforme con SES ANSI INCITS 305-1998 + + + El dispositivo es conforme con SES T10/1212 revisión 08b con Anexo ANSI INCITS.305/AM1-2000 + + + El dispositivo es conforme con SES ANSI INCITS 305-1998 con Anexo ANSI INCITS.305/AM1-2000 + + + El dispositivo es conforme con SCC-2 (versión no especificada) + + + El dispositivo es conforme con SCC-2 T10/1125-D revisión 04 + + + El dispositivo es conforme con SCC-2 ANSI INCITS 318-1998 + + + El dispositivo es conforme con SSC (versión no especificada) + + + El dispositivo es conforme con SSC T10/0997-D revisión 17 + + + El dispositivo es conforme con SSC T10/0997-D revisión 22 + + + El dispositivo es conforme con SSC ANSI INCITS 335-2000 + + + El dispositivo es conforme con RBC (versión no especificada) + + + El dispositivo es conforme con RBC T10/1240-D revisión 10a + + + El dispositivo es conforme con RBC ANSI INCITS 330-2000 + + + El dispositivo es conforme con MMC-2 (versión no especificada) + + + El dispositivo es conforme con MMC-2 T10/1228-D revisión 11 + + + El dispositivo es conforme con MMC-2 T10/1228-D revisión 11a + + + El dispositivo es conforme con MMC-2 ANSI INCITS 333-2000 + + + El dispositivo es conforme con SPC-2 (versión no especificada) + + + El dispositivo es conforme con SPC-2 T10/1236-D revisión 12 + + + El dispositivo es conforme con SPC-2 T10/1236-D revisión 18 + + + El dispositivo es conforme con SPC-2 T10/1236-D revisión 19 + + + El dispositivo es conforme con SPC-2 T10/1236-D revisión 20 + + + El dispositivo es conforme con SPC-2 ANSI INCITS 351-2001 + + + El dispositivo es conforme con SPC-2 ISO/IEC 14776-452 + + + El dispositivo es conforme con OCRW (versión no especificada) + + + El dispositivo es conforme con OCRW ISO/IEC 14776-381 + + + El dispositivo es conforme con MMC-3 (versión no especificada) + + + El dispositivo es conforme con MMC-3 T10/1363-D revisión 9 + + + El dispositivo es conforme con MMC-3 T10/1363-D revisión 10g + + + El dispositivo es conforme con MMC-3 ANSI INCITS 360-2002 + + + El dispositivo es conforme con SMC-2 (versión no especificada) + + + El dispositivo es conforme con SMC-2 T10/1383-D revisión 5 + + + El dispositivo es conforme con SMC-2 T10/1383-D revisión 6 + + + El dispositivo es conforme con SMC-2 T10/1383-D revisión 7 + + + El dispositivo es conforme con SMC-2 ANSI INCITS 382-2004 + + + El dispositivo es conforme con SPC-3 (versión no especificada) + + + El dispositivo es conforme con SPC-3 T10/1416-D revisión 7 + + + El dispositivo es conforme con SPC-3 T10/1416-D revisión 21 + + + El dispositivo es conforme con SPC-3 T10/1416-D revisión 22 + + + El dispositivo es conforme con SPC-3 T10/1416-D revisión 23 + + + El dispositivo es conforme con SPC-3 ANSI INCITS 408-2005 + + + El dispositivo es conforme con SPC-3 ISO/IEC 14776-453 + + + El dispositivo es conforme con SBC-2 (versión no especificada) + + + El dispositivo es conforme con SBC-2 T10/1417-D revisión 5a + + + El dispositivo es conforme con SBC-2 T10/1417-D revisión 15 + + + El dispositivo es conforme con SBC-2 T10/1417-D revisión 16 + + + El dispositivo es conforme con SBC-2 ANSI INCITS 405-2005 + + + El dispositivo es conforme con SBC-2 ISO/IEC 14776-322 + + + El dispositivo es conforme con OSD (versión no especificada) + + + El dispositivo es conforme con OSD T10/1355-D revisión 0 + + + El dispositivo es conforme con OSD T10/1355-D revisión 7a + + + El dispositivo es conforme con OSD T10/1355-D revisión 8 + + + El dispositivo es conforme con OSD T10/1355-D revisión 9 + + + El dispositivo es conforme con OSD T10/1355-D revisión 10 + + + El dispositivo es conforme con OSD ANSI INCITS 400-2004 + + + El dispositivo es conforme con SSC-2 (versión no especificada) + + + El dispositivo es conforme con SSC-2 T10/1434-D revisión 7 + + + El dispositivo es conforme con SSC-2 T10/1434-D revisión 9 + + + El dispositivo es conforme con SSC-2 ANSI INCITS 380-2003 + + + El dispositivo es conforme con BCC (versión no especificada) + + + El dispositivo es conforme con MMC-4 (versión no especificada) + + + El dispositivo es conforme con MMC-4 T10/1545-D revisión 5 + + + El dispositivo es conforme con MMC-4 T10/1545-D revisión 5a + + + El dispositivo es conforme con MMC-4 T10/1545-D revisión 3 + + + El dispositivo es conforme con MMC-4 T10/1545-D revisión 3d + + + El dispositivo es conforme con MMC-4 ANSI INCITS 401-2005 + + + El dispositivo es conforme con ADC (versión no especificada) + + + El dispositivo es conforme con ADC T10/1558-D revisión 6 + + + El dispositivo es conforme con ADC T10/1558-D revisión 7 + + + El dispositivo es conforme con ADC ANSI INCITS 403-2005 + + + El dispositivo es conforme con SES-2 (versión no especificada) + + + El dispositivo es conforme con SES-2 T10/1559-D revisión 16 + + + El dispositivo es conforme con SES-2 T10/1559-D revisión 19 + + + El dispositivo es conforme con SES-2 T10/1559-D revisión 20 + + + El dispositivo es conforme con SES-2 ANSI INCITS 448-2008 + + + El dispositivo es conforme con SES-2 ISO/IEC 14776-372 + + + El dispositivo es conforme con SSC-3 (versión no especificada) + + + El dispositivo es conforme con SSC-3 T10/1611-D revisión 04a + + + El dispositivo es conforme con SSC-3 T10/1611-D revisión 05 + + + El dispositivo es conforme con SSC-3 ANSI INCITS 467-2011 + + + El dispositivo es conforme con SSC-3 ISO/IEC 14776-333:2013 + + + El dispositivo es conforme con MMC-5 (versión no especificada) + + + El dispositivo es conforme con MMC-5 T10/1675-D revisión 03 + + + El dispositivo es conforme con MMC-5 T10/1675-D revisión 03b + + + El dispositivo es conforme con MMC-5 T10/1675-D revisión 04 + + + El dispositivo es conforme con MMC-5 ANSI INCITS 430-2007 + + + El dispositivo es conforme con OSD-2 (versión no especificada) + + + El dispositivo es conforme con OSD-2 T10/1729-D revisión 4 + + + El dispositivo es conforme con OSD-2 T10/1729-D revisión 5 + + + El dispositivo es conforme con OSD-2 ANSI INCITS 458-2011 + + + El dispositivo es conforme con SPC-4 (versión no especificada) + + + El dispositivo es conforme con SPC-4 T10/BSR INCITS 513 revisión 16 + + + El dispositivo es conforme con SPC-4 T10/BSR INCITS 513 revisión 18 + + + El dispositivo es conforme con SPC-4 T10/BSR INCITS 513 revisión 23 + + + El dispositivo es conforme con SPC-4 T10/BSR INCITS 513 revisión 36 + + + El dispositivo es conforme con SPC-4 T10/BSR INCITS 513 revisión 37 + + + El dispositivo es conforme con SPC-4 T10/BSR INCITS 513 revisión 37a + + + El dispositivo es conforme con SPC-4 ANSI INCITS 513-2015 + + + El dispositivo es conforme con SMC-3 (versión no especificada) + + + El dispositivo es conforme con SMC-3 T10/1730-D revisión 15 + + + El dispositivo es conforme con SMC-3 T10/1730-D revisión 16 + + + El dispositivo es conforme con SMC-3 ANSI INCITS 484-2012 + + + El dispositivo es conforme con ADC-2 (versión no especificada) + + + El dispositivo es conforme con ADC-2 T10/1741-D revisión 7 + + + El dispositivo es conforme con ADC-2 T10/1741-D revisión 8 + + + El dispositivo es conforme con ADC-2 ANSI INCITS 441-2008 + + + El dispositivo es conforme con SBC-3 (versión no especificada) + + + El dispositivo es conforme con SBC-3 T10/BSR INCITS 514 revisión 35 + + + El dispositivo es conforme con SBC-3 T10/BSR INCITS 514 revisión 36 + + + El dispositivo es conforme con SBC-3 ANSI INCITS 514-2014 + + + El dispositivo es conforme con MMC-6 (versión no especificada) + + + El dispositivo es conforme con MMC-6 T10/1836-D revisión 02b + + + El dispositivo es conforme con MMC-6 T10/1836-D revisión 02g + + + El dispositivo es conforme con MMC-6 ANSI INCITS 468-2010 + + + El dispositivo es conforme con MMC-6 ANSI INCITS 468-2010 + MMC-6/AM1 ANSI INCITS 468-2010/AM 1 + + + El dispositivo es conforme con ADC-3 (versión no especificada) + + + El dispositivo es conforme con ADC-3 T10/1895-D revisión 04 + + + El dispositivo es conforme con ADC-3 T10/1895-D revisión 05 + + + El dispositivo es conforme con ADC-3 T10/1895-D revisión 05a + + + El dispositivo es conforme con ADC-3 ANSI INCITS 497-2012 + + + El dispositivo es conforme con SSC-4 (versión no especificada) + + + El dispositivo es conforme con SSC-4 T10/BSR INCITS 516 revisión 2 + + + El dispositivo es conforme con SSC-4 T10/BSR INCITS 516 revisión 3 + + + El dispositivo es conforme con SSC-4 ANSI INCITS 516-2013 + + + El dispositivo es conforme con OSD-3 (versión no especificada) + + + El dispositivo es conforme con SES-3 (versión no especificada) + + + El dispositivo es conforme con SSC-5 (versión no especificada) + + + El dispositivo es conforme con SPC-5 (versión no especificada) + + + El dispositivo es conforme con SFSC (versión no especificada) + + + El dispositivo es conforme con SFSC BSR INCITS 501 revisión 01 + + + El dispositivo es conforme con SBC-4 (versión no especificada) + + + El dispositivo es conforme con ZBC (versión no especificada) + + + El dispositivo es conforme con ZBC BSR INCITS 536 revisión 02 + + + El dispositivo es conforme con ADC-4 (versión no especificada) + + + El dispositivo es conforme con SSA-TL2 (versión no especificada) + + + El dispositivo es conforme con SSA-TL2 T10.1/1147-D revisión 05b + + + El dispositivo es conforme con SSA-TL2 ANSI INCITS 308-1998 + + + El dispositivo es conforme con SSA-TL1 (versión no especificada) + + + El dispositivo es conforme con SSA-TL1 T10.1/0989-D revisión 10b + + + El dispositivo es conforme con SSA-TL1 ANSI INCITS 295-1996 + + + El dispositivo es conforme con SSA-S3P (versión no especificada) + + + El dispositivo es conforme con SSA-S3P T10.1/1051-D revisión 05b + + + El dispositivo es conforme con SSA-S3P ANSI INCITS 309-1998 + + + El dispositivo es conforme con SSA-S2P (versión no especificada) + + + El dispositivo es conforme con SSA-S2P T10.1/1121-D revisión 07b + + + El dispositivo es conforme con SSA-S2P ANSI INCITS 294-1996 + + + El dispositivo es conforme con SIP (versión no especificada) + + + El dispositivo es conforme con SIP T10/0856-D revisión 10 + + + El dispositivo es conforme con SIP ANSI INCITS 292-1997 + + + El dispositivo es conforme con FCP (versión no especificada) + + + El dispositivo es conforme con FCP T10/0993-D revisión 12 + + + El dispositivo es conforme con FCP ANSI INCITS 269-1996 + + + El dispositivo es conforme con SBP-2 (versión no especificada) + + + El dispositivo es conforme con SBP-2 T10/1155-D revisión 04 + + + El dispositivo es conforme con SBP-2 ANSI INCITS 325-1998 + + + El dispositivo es conforme con FCP-2 (versión no especificada) + + + El dispositivo es conforme con FCP-2 T10/1144-D revisión 4 + + + El dispositivo es conforme con FCP-2 T10/1144-D revisión 7 + + + El dispositivo es conforme con FCP-2 T10/1144-D revisión 7a + + + El dispositivo es conforme con FCP-2 ANSI INCITS 350-2003 + + + El dispositivo es conforme con FCP-2 T10/1144-D revisión 8 + + + El dispositivo es conforme con SST (versión no especificada) + + + El dispositivo es conforme con SST T10/1380-D revisión 8b + + + El dispositivo es conforme con SRP (versión no especificada) + + + El dispositivo es conforme con SRP T10/1415-D revisión 10 + + + El dispositivo es conforme con SRP T10/1415-D revisión 16a + + + El dispositivo es conforme con SRP ANSI INCITS 365-2002 + + + El dispositivo es conforme con iSCSI (versión no especificada) + + + El dispositivo es conforme con iSCSI revisión {0} + + + El dispositivo es conforme con SBP-3 (versión no especificada) + + + El dispositivo es conforme con SBP-3 T10/1467-D revisión 1f + + + El dispositivo es conforme con SBP-3 T10/1467-D revisión 3 + + + El dispositivo es conforme con SBP-3 T10/1467-D revisión 4 + + + El dispositivo es conforme con SBP-3 T10/1467-D revisión 5 + + + El dispositivo es conforme con SBP-3 ANSI INCITS 375-2004 + + + El dispositivo es conforme con ADP (versión no especificada) + + + El dispositivo es conforme con ADT (versión no especificada) + + + El dispositivo es conforme con ADT T10/1557-D revisión 11 + + + El dispositivo es conforme con ADT T10/1557-D revisión 14 + + + El dispositivo es conforme con ADT ANSI INCITS 406-2005 + + + El dispositivo es conforme con FCP-3 (versión no especificada) + + + El dispositivo es conforme con FCP-3 T10/1560-D revisión 3f + + + El dispositivo es conforme con FCP-3 T10/1560-D revisión 4 + + + El dispositivo es conforme con FCP-3 ANSI INCITS 416-2006 + + + El dispositivo es conforme con FCP-3 ISO/IEC 14776-223 + + + El dispositivo es conforme con ADT-2 (versión no especificada) + + + El dispositivo es conforme con ADT-2 T10/1742-D revisión 06 + + + El dispositivo es conforme con ADT-2 T10/1742-D revisión 08 + + + El dispositivo es conforme con ADT-2 T10/1742-D revisión 09 + + + El dispositivo es conforme con ADT-2 ANSI INCITS 472-2011 + + + El dispositivo es conforme con FCP-4 (versión no especificada) + + + El dispositivo es conforme con FCP-4 T10/1828-D revisión 01 + + + El dispositivo es conforme con FCP-4 T10/1828-D revisión 02 + + + El dispositivo es conforme con FCP-4 T10/1828-D revisión 02b + + + El dispositivo es conforme con FCP-4 ANSI INCITS 481-2012 + + + El dispositivo es conforme con ADT-3 (versión no especificada) + + + El dispositivo es conforme con SPI (versión no especificada) + + + El dispositivo es conforme con SPI T10/0855-D revisión 15a + + + El dispositivo es conforme con SPI ANSI INCITS 253-1995 + + + El dispositivo es conforme con SPI T10/0855-D revisión 15a con SPI Amnd revisión 3a + + + El dispositivo es conforme con SPI ANSI INCITS 253-1995 con SPI Amnd ANSI INCITS 253/AM1-1998 + + + El dispositivo es conforme con Fast-20 (versión no especificada) + + + El dispositivo es conforme con Fast-20 T10/1071 revisión 06 + + + El dispositivo es conforme con Fast-20 ANSI INCITS 277-1996 + + + El dispositivo es conforme con SPI-2 (versión no especificada) + + + El dispositivo es conforme con SPI-2 T10/1142-D revisión 20b + + + El dispositivo es conforme con SPI-2 ANSI INCITS 302-1999 + + + El dispositivo es conforme con SPI-3 (versión no especificada) + + + El dispositivo es conforme con SPI-3 T10/1302-D revisión 10 + + + El dispositivo es conforme con SPI-3 T10/1302-D revisión 13a + + + El dispositivo es conforme con SPI-3 T10/1302-D revisión 14 + + + El dispositivo es conforme con SPI-3 ANSI INCITS 336-2000 + + + El dispositivo es conforme con EPI (versión no especificada) + + + El dispositivo es conforme con EPI T10/1134 revisión 16 + + + El dispositivo es conforme con EPI ANSI INCITS TR-23 1999 + + + El dispositivo es conforme con SPI-4 (versión no especificada) + + + El dispositivo es conforme con SPI-4 T10/1365-D revisión 7 + + + El dispositivo es conforme con SPI-4 T10/1365-D revisión 9 + + + El dispositivo es conforme con SPI-4 ANSI INCITS 362-2002 + + + El dispositivo es conforme con SPI-4 T10/1365-D revisión 10 + + + El dispositivo es conforme con SPI-5 (versión no especificada) + + + El dispositivo es conforme con SPI-5 T10/1525-D revisión 3 + + + El dispositivo es conforme con SPI-5 T10/1525-D revisión 5 + + + El dispositivo es conforme con SPI-5 T10/1525-D revisión 6 + + + El dispositivo es conforme con SPI-5 ANSI INCITS 367-2003 + + + El dispositivo es conforme con SAS (versión no especificada) + + + El dispositivo es conforme con SAS T10/1562-D revisión 01 + + + El dispositivo es conforme con SAS T10/1562-D revisión 03 + + + El dispositivo es conforme con SAS T10/1562-D revisión 04 + + + El dispositivo es conforme con SAS T10/1562-D revisión 05 + + + El dispositivo es conforme con SAS ANSI INCITS 376-2003 + + + El dispositivo es conforme con SAS-1.1 (versión no especificada) + + + El dispositivo es conforme con SAS-1.1 T10/1601-D revisión 9 + + + El dispositivo es conforme con SAS-1.1 T10/1601-D revisión 10 + + + El dispositivo es conforme con SAS-1.1 ANSI INCITS 417-2006 + + + El dispositivo es conforme con SAS-1.1 ISO/IEC 14776-151 + + + El dispositivo es conforme con SAS-2 (versión no especificada) + + + El dispositivo es conforme con SAS-2 T10/1760-D revisión 14 + + + El dispositivo es conforme con SAS-2 T10/1760-D revisión 15 + + + El dispositivo es conforme con SAS-2 T10/1760-D revisión 16 + + + El dispositivo es conforme con SAS-2 ANSI INCITS 457-2010 + + + El dispositivo es conforme con SAS-2.1 (versión no especificada) + + + El dispositivo es conforme con SAS-2.1 T10/2125-D revisión 04 + + + El dispositivo es conforme con SAS-2.1 T10/2125-D revisión 06 + + + El dispositivo es conforme con SAS-2.1 T10/2125-D revisión 07 + + + El dispositivo es conforme con SAS-2.1 ANSI INCITS 478-2011 + + + El dispositivo es conforme con SAS-2.1 ANSI INCITS 478-2011 con Amnd 1 ANSI INCITS 478/AM1-2014 + + + El dispositivo es conforme con SAS-2.1 ISO/IEC 14776-153 + + + El dispositivo es conforme con SAS-3 (versión no especificada) + + + El dispositivo es conforme con SAS-3 T10/BSR INCITS 519 revisión 05a + + + El dispositivo es conforme con SAS-3 T10/BSR INCITS 519 revisión 06 + + + El dispositivo es conforme con SAS-3 ANSI INCITS 519-2014 + + + El dispositivo es conforme con SAS-4 (versión no especificada) + + + El dispositivo es conforme con FC-PH (versión no especificada) + + + El dispositivo es conforme con FC-PH ANSI INCITS 230-1994 + + + El dispositivo es conforme con FC-PH ANSI INCITS 230-1994 with Amnd 1 ANSI INCITS 230/AM1-1996 + + + El dispositivo es conforme con FC-AL (versión no especificada) + + + El dispositivo es conforme con FC-AL ANSI INCITS 272-1996 + + + El dispositivo es conforme con FC-AL-2 (versión no especificada) + + + El dispositivo es conforme con FC-AL-2 T11/1133-D revisión 7.0 + + + El dispositivo es conforme con FC-AL-2 ANSI INCITS 332-1999 con AM1-2003 & AM2-2006 + + + El dispositivo es conforme con FC-AL-2 ANSI INCITS 332-1999 con Amnd 2 AM2-2006 + + + El dispositivo es conforme con FC-AL-2 ISO/IEC 14165-122 con AM1 y AM2 + + + El dispositivo es conforme con FC-AL-2 ANSI INCITS 332-1999 + + + El dispositivo es conforme con FC-AL-2 ANSI INCITS 332-1999 con Amnd 1 AM1-2003 + + + El dispositivo es conforme con FC-PH-3 (versión no especificada) + + + El dispositivo es conforme con FC-PH-3 ANSI INCITS 303-1998 + + + El dispositivo es conforme con FC-FS (versión no especificada) + + + El dispositivo es conforme con FC-FS T11/1331-D revisión 1.2 + + + El dispositivo es conforme con FC-FS T11/1331-D revisión 1.7 + + + El dispositivo es conforme con FC-FS ANSI INCITS 373-2003 + + + El dispositivo es conforme con FC-FS ISO/IEC 14165-251 + + + El dispositivo es conforme con FC-PI (versión no especificada) + + + El dispositivo es conforme con FC-PI ANSI INCITS 352-2002 + + + El dispositivo es conforme con FC-PI-2 (versión no especificada) + + + El dispositivo es conforme con FC-PI-2 T11/1506-D revisión 5.0 + + + El dispositivo es conforme con FC-PI-2 ANSI INCITS 404-2006 + + + El dispositivo es conforme con FC-FS-2 (versión no especificada) + + + El dispositivo es conforme con FC-FS-2 ANSI INCITS 242-2007 + + + El dispositivo es conforme con FC-FS-2 ANSI INCITS 242-2007 con AM1 ANSI INCITS 242/AM1-2007 + + + El dispositivo es conforme con FC-LS (versión no especificada) + + + El dispositivo es conforme con FC-LS T11/1620-D revisión 1.62 + + + El dispositivo es conforme con FC-LS ANSI INCITS 433-2007 + + + El dispositivo es conforme con FC-SP (versión no especificada) + + + El dispositivo es conforme con FC-SP T11/1570-D revisión 1.6 + + + El dispositivo es conforme con FC-SP ANSI INCITS 426-2007 + + + El dispositivo es conforme con FC-PI-3 (versión no especificada) + + + El dispositivo es conforme con FC-PI-3 T11/1625-D revisión 2.0 + + + El dispositivo es conforme con FC-PI-3 T11/1625-D revisión 2.1 + + + El dispositivo es conforme con FC-PI-3 T11/1625-D revisión 4.0 + + + El dispositivo es conforme con FC-PI-3 ANSI INCITS 460-2011 + + + El dispositivo es conforme con FC-PI-4 (versión no especificada) + + + El dispositivo es conforme con FC-PI-4 T11/1647-D revisión 8.0 + + + El dispositivo es conforme con FC-PI-4 ANSI INCITS 450-2009 + + + El dispositivo es conforme con FC 10GFC (versión no especificada) + + + El dispositivo es conforme con FC 10GFC ANSI INCITS 364-2003 + + + El dispositivo es conforme con FC 10GFC ISO/IEC 14165-116 + + + El dispositivo es conforme con FC 10GFC ISO/IEC 14165-116 con AM1 + + + El dispositivo es conforme con FC 10GFC ANSI INCITS 364-2003 con AM1 ANSI INCITS 364/AM1-2007 + + + El dispositivo es conforme con FC-SP-2 (versión no especificada) + + + El dispositivo es conforme con FC-FS-3 (versión no especificada) + + + El dispositivo es conforme con FC-FS-3 T11/1861-D revisión 0.9 + + + El dispositivo es conforme con FC-FS-3 T11/1861-D revisión 1.0 + + + El dispositivo es conforme con FC-FS-3 T11/1861-D revisión 1.10 + + + El dispositivo es conforme con FC-FS-3 ANSI INCITS 470-2011 + + + El dispositivo es conforme con FC-LS-2 (versión no especificada) + + + El dispositivo es conforme con FC-LS-2 T11/2103-D revisión 2.11 + + + El dispositivo es conforme con FC-LS-2 T11/2103-D revisión 2.21 + + + El dispositivo es conforme con FC-LS-2 ANSI INCITS 477-2011 + + + El dispositivo es conforme con FC-PI-5 (versión no especificada) + + + El dispositivo es conforme con FC-PI-5 T11/2118-D revisión 2.00 + + + El dispositivo es conforme con FC-PI-5 T11/2118-D revisión 3.00 + + + El dispositivo es conforme con FC-PI-5 T11/2118-D revisión 6.00 + + + El dispositivo es conforme con FC-PI-5 T11/2118-D revisión 6.10 + + + El dispositivo es conforme con FC-PI-5 ANSI INCITS 479-2011 + + + El dispositivo es conforme con FC-PI-6 (versión no especificada) + + + El dispositivo es conforme con FC-FS-4 (versión no especificada) + + + El dispositivo es conforme con FC-LS-3 (versión no especificada) + + + El dispositivo es conforme con FC-SCM (versión no especificada) + + + El dispositivo es conforme con FC-SCM T11/1824DT revisión 1.0 + + + El dispositivo es conforme con FC-SCM T11/1824DT revisión 1.1 + + + El dispositivo es conforme con FC-SCM T11/1824DT revisión 1.4 + + + El dispositivo es conforme con FC-SCM INCITS TR-47 2012 + + + El dispositivo es conforme con FC-DA-2 (versión no especificada) + + + El dispositivo es conforme con FC-DA-2 T11/1870DT revisión 1.04 + + + El dispositivo es conforme con FC-DA-2 T11/1870DT revisión 1.06 + + + El dispositivo es conforme con FC-DA-2 INCITS TR-49 2012 + + + El dispositivo es conforme con FC-DA (versión no especificada) + + + El dispositivo es conforme con FC-DA T11/1513-DT revisión 3.1 + + + El dispositivo es conforme con FC-DA ANSI INCITS TR-36 2004 + + + El dispositivo es conforme con FC-DA ISO/IEC 14165-341 + + + El dispositivo es conforme con FC-Tape (versión no especificada) + + + El dispositivo es conforme con FC-Tape T11/1315 revisión 1.16 + + + El dispositivo es conforme con FC-Tape T11/1315 revisión 1.17 + + + El dispositivo es conforme con FC-Tape ANSI INCITS TR-24 1999 + + + El dispositivo es conforme con FC-FLA (versión no especificada) + + + El dispositivo es conforme con FC-FLA T11/1235 revisión 7 + + + El dispositivo es conforme con FC-FLA ANSI INCITS TR-20 1998 + + + El dispositivo es conforme con FC-PLDA (versión no especificada) + + + El dispositivo es conforme con FC-PLDA T11/1162 revisión 2.1 + + + El dispositivo es conforme con FC-PLDA ANSI INCITS TR-19 1998 + + + El dispositivo es conforme con SSA-PH2 (versión no especificada) + + + El dispositivo es conforme con SSA-PH2 T10.1/1145-D revisión 09c + + + El dispositivo es conforme con SSA-PH2 ANSI INCITS 293-1996 + + + El dispositivo es conforme con SSA-PH3 (versión no especificada) + + + El dispositivo es conforme con SSA-PH3 T10.1/1146-D revisión 05b + + + El dispositivo es conforme con SSA-PH3 ANSI INCITS 307-1998 + + + El dispositivo es conforme con IEEE 1394 (versión no especificada) + + + El dispositivo es conforme con ANSI IEEE 1394-1995 + + + El dispositivo es conforme con IEEE 1394a (versión no especificada) + + + El dispositivo es conforme con IEEE 1394b (versión no especificada) + + + El dispositivo es conforme con ATA/ATAPI-6 (versión no especificada) + + + El dispositivo es conforme con ATA/ATAPI-6 ANSI INCITS 361-2002 + + + El dispositivo es conforme con ATA/ATAPI-7 (versión no especificada) + + + El dispositivo es conforme con ATA/ATAPI-7 T13/1532-D revisión 3 + + + El dispositivo es conforme con ATA/ATAPI-7 ANSI INCITS 397-2005 + + + El dispositivo es conforme con ATA/ATAPI-7 ISO/IEC 24739 + + + El dispositivo es conforme con ATA/ATAPI-8 ATA8-AAM (versión no especificada) + + + El dispositivo es conforme con ATA/ATAPI-8 ATA8-APT Parallel Transport (versión no especificada) + + + El dispositivo es conforme con ATA/ATAPI-8 ATA8-AST Serial Transport (versión no especificada) + + + El dispositivo es conforme con ATA/ATAPI-8 ATA8-ACS ATA/ATAPI Command Set (versión no especificada) + + + El dispositivo es conforme con ATA/ATAPI-8 ATA8-AAM ANSI INCITS 451-2008 + + + El dispositivo es conforme con ATA/ATAPI-8 ATA8-ACS ANSI INCITS 452-2009 con Anexo 1 + + + El dispositivo es conforme con Universal Serial Bus Specification, revisión 1.1 + + + El dispositivo es conforme con Universal Serial Bus Specification, revisión 2.0 + + + El dispositivo es conforme con USB Mass Storage Class Bulk-Only Transport, revisión 1.0 + + + El dispositivo es conforme con UAS (versión no especificada) + + + El dispositivo es conforme con UAS T10/2095-D revisión 02 + + + El dispositivo es conforme con UAS T10/2095-D revisión 04 + + + El dispositivo es conforme con UAS ANSI INCITS 471-2010 + + + El dispositivo es conforme con UAS ISO/IEC 14776-251:2014 + + + El dispositivo es conforme con ACS-2 (versión no especificada) + + + El dispositivo es conforme con ACS-2 ANSI INCITS 482-2013 + + + El dispositivo es conforme con ACS-3 (versión no especificada) + + + El dispositivo es conforme con UAS-2 (versión no especificada) + + + El dispositivo es conforme con SAT (versión no especificada) + + + El dispositivo es conforme con SAT T10/1711-D revisión 8 + + + El dispositivo es conforme con SAT T10/1711-D revisión 9 + + + El dispositivo es conforme con SAT ANSI INCITS 431-2007 + + + El dispositivo es conforme con SAT-2 (versión no especificada) + + + El dispositivo es conforme con SAT-2 T10/1826-D revisión 06 + + + El dispositivo es conforme con SAT-2 T10/1826-D revisión 09 + + + El dispositivo es conforme con SAT-2 ANSI INCITS 465-2010 + + + El dispositivo es conforme con SAT-3 (versión no especificada) + + + El dispositivo es conforme con SAT-3 T10/BSR INCITS 517 revisión 4 + + + El dispositivo es conforme con SAT-3 T10/BSR INCITS 517 revisión 7 + + + El dispositivo es conforme con SAT-3 ANSI INCITS 517-2015 + + + El dispositivo es conforme con SAT-4 (versión no especificada) + + + El dispositivo es conforme con SPL (versión no especificada) + + + El dispositivo es conforme con SPL T10/2124-D revisión 6a + + + El dispositivo es conforme con SPL T10/2124-D revisión 7 + + + El dispositivo es conforme con SPL ANSI INCITS 476-2011 + + + El dispositivo es conforme con SPL ANSI INCITS 476-2011 + SPL AM1 INCITS 476/AM1 2012 + + + El dispositivo es conforme con SPL ISO/IEC 14776-261:2012 + + + El dispositivo es conforme con SPL-2 (versión no especificada) + + + El dispositivo es conforme con SPL-2 T10/BSR INCITS 505 revisión 4 + + + El dispositivo es conforme con SPL-2 T10/BSR INCITS 505 revisión 5 + + + El dispositivo es conforme con SPL-2 ANSI INCITS 505-2013 + + + El dispositivo es conforme con SPL-3 (versión no especificada) + + + El dispositivo es conforme con SPL-3 T10/BSR INCITS 492 revisión 6 + + + El dispositivo es conforme con SPL-3 T10/BSR INCITS 492 revisión 7 + + + El dispositivo es conforme con SPL-3 ANSI INCITS 492-2015 + + + El dispositivo es conforme con SPL-4 (versión no especificada) + + + El dispositivo es conforme con SOP (versión no especificada) + + + El dispositivo es conforme con SOP T10/BSR INCITS 489 revisión 4 + + + El dispositivo es conforme con SOP T10/BSR INCITS 489 revisión 5 + + + El dispositivo es conforme con SOP ANSI INCITS 489-2014 + + + El dispositivo es conforme con PQI (versión no especificada) + + + El dispositivo es conforme con PQI T10/BSR INCITS 490 revisión 6 + + + El dispositivo es conforme con PQI T10/BSR INCITS 490 revisión 7 + + + El dispositivo es conforme con PQI ANSI INCITS 490-2014 + + + El dispositivo es conforme con SOP-2 (versión no especificada) + + + El dispositivo es conforme con PQI-2 (versión no especificada) + + + El dispositivo es conforme con IEEE 1667 (versión no especificada) + + + El dispositivo es conforme con IEEE 1667-2006 + + + El dispositivo es conforme con IEEE 1667-2009 + + + El dispositivo es conforme con estándar de código desconocido 0x{0:X4} + + + El dispositivo es conforme con ECMA-111: Interfaz de Sistema de Ordenadores Pequeños SCSI + + + El dispositivo es conforme con ANSI X3.131:1986 (SCSI-1) + + + El dispositivo es conforme con ANSI X3.131:1994 (SCSI-2) + + + El dispositivo es conforme con ANSI X3.301:1997 (SPC-1) + + + El dispositivo es conforme con ANSI X3.351:2001 (SPC-2) + + + El dispositivo es conforme con ANSI X3.408:2005 (SPC-3) + + + El dispositivo es conforma con ANSI X3.408:2005 (SPC-4) + + + El dispositivo es conforme con ISO/IEC 9316:1995 + + + El dispositivo es conforme con un estándar SCSI ANSI desconocido valor 0x{0:X2}) + + + El dispositivo es conforme con un estándar SCSI ECMA desconocido valor 0x{0:X2}) + + + El dispositivo es conforme con un estándar SCSI ISO/IEC desconocido valor 0x{0:X2}) + + + El dispositivo limpia cualquier condición de atención en todos los LUNs después de reportar sobre cualquier LUN + + + DEVICE CONFIGURATION IDENTIFY DMA y DEVICE CONFIGURATION SET DMA están soportados + + + El conjunto de funcionalidades de superposición de la configuración del dispositivo están soportadas + + + El conjunto de funcionalidades de superposición de la configuración del dispositivo están soportadas y activadas + + + El dispositivo contiene un coordinador de control de acceso + + + El dispositivo contiene un componente de servicios de carcasa integrado + + + El dispositivo contiene un componente de controlador de matriz de almacenamiento integrado + + + El dispositivo contiene o está conectado a un intercambiador de medios + + + El contenido del dispositivo es original + + + El dispositivo actualmente direcciona sectores de 4096 bytes + + + El dispositivo actualmente direcciona sectores de 512 bytes + + + El dispositivo actualmente direcciona sectores de tamaño desconocido indicado por el código {0} + + + El dispositivo actualmente usa ECC de tipo BCH(542, 512) + + + El dispositivo no usa ECC actualmente + + + El dispositivo actualmente usa ECC de tipo desconocido código {0} + + + El dispositivo no es conforme con ningún estándar SCSI ANSI + + + El dispositivo no es conforme con ningún estandar SCSI ECMA + + + El dispositivo no es conforme con ningún estándar SCSI ISO/IEC + + + El dispositivo no reporta un tamaño de lectura óptimo + + + El dispositivo no reporta un tamaño de recorte óptimo + + + El dispositivo no reporta un tamaño de escritura óptimo + + + El dispositivo no necesita SET FEATURES para iniciar y la respuesta de IDENTIFY DEVICE está completa. + + + El dispositivo no necesita SET FEATURES para iniciar y la respuesta de IDENTIFY DEVICE está incompleta. + + + El dispositivo no rota. + + + El dispositivo no soporta acceso asimétrico. + + + El dispositivo no soporta CPRM + + + El dispositivo no utiliza CPRM + + + El dispositivo emula un sector de tamaño desconocido indicado por el código {0} + + + El dispositivo encripta todos los datos de usuario + + + Los grupos de borrado del dispositivo son de {0} KiB + + + El dispositivo ha excedido su tiempo de vida estimado máximo + + + El dispositivo es conforme con la especificacón CFast + + + El dispositivo sigue el conjunto de comandos de compatibilidad MMC. + + + El dispositivo es conforme con IEEE-1667 + + + El dispositivo sigue la especificación Secure Digital Physical Layer versión 1.0x + + + El dispositivo sigue la especificación Secure Digital Physical Layer versión 1.10 + + + El dispositivo sigue la especificación Secure Digital Physical Layer versión 2.00 + + + El dispositivo sigue la especificación Secure Digital Physical Layer versión 3.0x + + + El dispositivo sigue la especificación Secure Digital Physical Layer versión 4.xx + + + El dispositivo sigue la especificación Secure Digital Physical Layer versión 5.xx + + + El dispositivo sigue la especificación Secure Digital Physical Layer versión 6.xx + + + El dispositivo sigue la especificación Secure Digital Physical Layer versión 7.xx + + + El dispositivo sigue la especificación Secure Digital Physical Layer versión 8.xx + + + El dispositivo sigue la especificación Secure Digital Physical Layer versión desconocida {0}.{1}.{2}.{3} + + + El dispositivo sigue el conjunto de comandos estándar MMC versión 4.0 + + + El dispositivo sigue el conjunto de comandos estándar MMC con código de versión desconocida {0}. + + + El dispositivo sigue el conjunto de comandos desconocido MMC con código {0} y revisión código {1}. + + + El dispositivo tiene {0} bloques + + + El dispositivo tiene {0} bytes + + + El dispositivo tiene {0} GiB + + + El dispositivo tiene {0} KiB + + + El dispositivo tiene {0} KiB de caché + + + El dispositivo tiene {0} MiB + + + El dispositivo tiene {0} sectores + + + El dispositivo tiene {0} TiB + + + El dispositivo tiene una partición de arranque de {0} KiB + + + El dispositivo tiene un bloque de memoria de repetición de {0} KiB + + + El dispositivo tiene una caché no-volátil + + + El dispositivo tiene un tamaño de página de {0} KiB + + + El dispositivo tiene una caché volátil + + + El dispositivo tiene un World Wide Name + + + El dispositivo tiene operaciones críticas pendientes + + + El dispositivo tiene desactivadas las comprobaciónes de protección de información + + + El dispositivo tiene activado el encolado de comandos + + + El dispositivo tiene operaciones no críticas pendientes + + + El dispositivo no tiene caché + + + El dispositivo no tiene operaciones pendientes en segundo plano + + + El dispositivo tiene operaciones pendientes que afectan al rendimiento + + + El dispositivo tiene activada la protección segura contra escritura + + + El dispositivo tiene un modo de tiempo desconocido {0}. + + + El dispositivo implementa manejo alternativo del reinicio + + + El dispositivo implementa fase configurable del controlador + + + El dispositivo implementa HPI usando CMD12 + + + El dispositivo implementa HPI usando CMD13 + + + El dispositivo implementa RESET como reinicio suave + + + El dispositivo indica un valor mínimo específico del temporizador de espera + + + El dispositivo informa estar en buena salud + + + El dispositivo informa que debería ser reemplazado pronto + + + El dispositivo informa que debería ser reemplazado inmediatamente + + + La gestión de energía iniciada por el dispositivo está soportada + + + La gestión de energía iniciada por el dispositivo está soportada y activada + + + El dispositivo es un dispositivo dual soportando ópticos CD y no-CD + + + El dispositivo se direcciona por bytes + + + El dispositivo es capaz de reconocer tanto particiones como formato de medios + + + El dispositivo es capaz de reconocer formato de medios + + + El dispositivo es capaz de reconocer particiones de medio + + + El dispositivo está conectado y soportado. + + + El dispositivo está conectado pero no soportado. + + + El dispositivo está emulando sectores de 512 bytes + + + El dispositivo es fijo + + + El dispositivo está formateado como un disquete usando Microsoft FAT + + + El dispositivo está formateado como un disco duro + + + El dispositivo usa sectores duros + + + El dispositivo está en el nivel de consumo de energía relativamente más alto + + + El dispositivo está en modo Alta Velocidad. + + + El dispositivo está en modo HS-200. + + + El dispositivo está en modo HS-400. + + + El dispositivo está en un nivel de consumo de energía relativamente intermedio + + + El dispositivo está en el nivel de consumo de energía relativamente más bajo + + + El dispositivo está en modo de bajo consumo + + + El dispositivo no está activado para arrancar + + + El dispositivo no es capaz de reconocer ni particiones ni formato del medio + + + El dispositivo no usa codificación MFM + + + El dispositivo está permanentemente protegido contra escritura + + + El dispositivo se está encendiendo + + + El dispositivo es extraíble + + + El dispositivo es SDHC, SDXC o superior + + + El dispositivo se direcciona por sectores + + + El dispositivo usa sectores flojos + + + El dispositivo está soportado pero no conectado. + + + El dispositivo está protegido contra escritura temporalmente + + + El dispositivo es UHS-II o superior + + + El dispositivo está usando un bus de datos de 1-bit + + + El dispositivo está usando un bus de datos de 4-bits + + + El dispositivo está usando un bus de datos DDR de 4-bits + + + El dispositivo está usando un bus de datos de 8-bits + + + El dispositivo está usando un bus de datos DDR de 8-bits + + + El dispositivo está usando sectores de tamaño nativo + + + El dispositivo está usando un bus de datos desconocido código {0} + + + El dispositivo está dividido en zonas + + + El dispositivo fue fabricado en el mes {0} de {1} + + + El dispositivo puede ser mayor de 2GiB y tener su tamaño real definido en el CSD extendido + + + El dispositivo puede borrar cualquiera o todas las particiones al recibir un MODE SELECT para particionado + + + El dispositivo debe borrar un mínimo de {0} bloques a la vez + + + Nombre del dispositivo: {0} + + + El dispositivo usa sectores de 4096 bytes nativamente + + + El dispositivo usa sectores de 512 bytes nativamente + + + El dispositivo usa nativamente sectores de un tamaño desconocido indicado por el código {0} + + + El dispositivo necesita un cartucho de limpieza + + + El tamaño nominal del dispositivo tiene el valor desconocido {0} + + + El tamaño nominal del dispositivo es 1,8" + + + El tamaño nominal del dispositivo es 2,5" + + + El tamaño nominal del dispositivo es 3,5" + + + El tamaño nominal del dispositivo es 5,25" + + + El tamaño nominal del dispositivo es de menos de 1,8" + + + El dispositivo sólo soporta el acceso asimétrico explícito + + + El dispositivo sólo soporta el acceso asimétrico implícito + + + El consumo de energía del dispositivo está dictaminado por el identificado {0} del VPD de consumo de energía + + + El dispositivo imprime directamente + + + El dispositivo reconoce una única partición que ocupa todo el medio + + + Nivel de versión del dispositivo: {0} + + + El dispositivo requiere SET FEATURES para iniciarse y la respuesta de IDENTIFY DEVICE está completa + + + El dispositivo requiere SET FEATURES para iniciarse y la respuesta de IDENTIFY DEVICE está incompleta + + + DEVICE RESET está soporta y activado + + + El dispositivo respondió al comando ATA {0:X2}h + + + El dispositivo respondió al comando ATA IDENTIFY DEVICE. + + + El dispositivo respondió al comando ATA IDENTIFY PACKET DEVICE. + + + El dispositivo rota a {0} rpm. + + + El dispositivo envía reconocimiento de arranque + + + El dispositivo debería activar INTRQ cuando DRQ esté puesto a uno + + + El dispositivo debería borrar todas las particiones de tamaño distinto en un MODE SELECT de particionado + + + El dispositivo debería borrar todas las particiones en un MODE SELECT de particionado + + + El dispositivo no debería borrar ninguna partición en un MODE SELECT de particionado + + + El dispositivo debería devolver información de datos sense en formato de descriptor al devolverlo en las mismas transacciones que un CHECK CONDITION + + + El dispositivo debería establecer DRQ en 3ms de la recepción de un PACKET + + + El dispositivo debería establecer DRQ en 50µs de la recepción de un PACKET + + + El dispositivo debería usar un número de segmentos de caché o un tamaño de segmento de caché + + + Tamaño del dispositivo en modo LBA de 28-bits: {0} bytes, {1} Gb, {2} GiB + + + Tamaño del dispositivo en modo LBA de 28-bits: {0} bytes, {1} Mb, {2} MiB + + + Tamaño del dispositivo en modo LBA de 28-bits: {0} bytes, {1} Tb, {2} TiB + + + Tamaño del dispositivo en modo LBA de 48-bits: {0} bytes, {1} Gb, {2} GiB + + + Tamaño del dispositivo en modo LBA de 48-bits: {0} bytes, {1} Mb, {2} MiB + + + Tamaño del dispositivo en modo LBA de 48-bits: {0} bytes, {1} Tb, {2} TiB + + + Tamaño del dispositivo en modo CHS: {0} bytes, {1} Mb, {2} MiB + + + El tamaño del grupo de protección contra escritura más pequeño del dispositivo consta de {0} grupos de borrado + + + El dispositivo soporta transferencias de datos de 16-bits de ancho + + + El dispositivo soporta direccionado SCSI de 16-bits de ancho + + + El dispositivo soporta el bus de datos de 1-bit + + + El dispositivo soporta el modo de 26MHz + + + El dispositivo soporta transferencias de datos de 32-bits de ancho + + + El dispositivo soporta direccionado SCSI de 32-bits de ancho + + + El dispositivo soporta el bus de datos de 4-bits + + + El dispositivo soporta el modo de 52MHz + + + El dispositivo soporta el método de arranque alternativo + + + El dispositivo soporta la Capacidad de Reporte Asíncrona de Eventos + + + El dispositivo soporta el borrado automático de los bloques defectuosos retirados + + + El dispositivo soporta un máximo de {0} bytes para datos de sense + + + El dispositivo soporta un máximo de {0} lecturas empaquetadas y {1} escrituras empaquetadas + + + El dispositivo soporta operaciones de segundo plano + + + El dispositivo soporta encolado básico + + + El dispositivo soporta comandos de seguridad basados en capacidades + + + El dispositivo soporta el encolado de comandos con una profundidad de {0} + + + El dispositivo soporta la protección de contenido + + + El dispositivo soporta los comandos CONTINUE TASK y TARGET TRANSFER DISABLE + + + El dispositivo soporta la etiqueta de datos + + + El dispositivo soporta el modo DDR de 52MHz a 1,2V + + + El dispositivo soporta el modo DDR de 52MHz a 1,8V o 3V + + + El dispositivo soporta desactivar la corrección con WRITE LONG + + + El dispositivo soporta E/S de doble palabra + + + El dispositivo soporta arrancar en ratio de datos dual + + + El dispositivo soporta el modo intermitente mejorado + + + El dispositivo soporta seguridad extendida + + + El dispositivo soporta comandos de extensión de registro multi-bloque + + + El dispositivo soporta comandos de extensión de registro de bloque único + + + El dispositivo soporta FFU + + + El dispositivo soporta agrupamiento + + + El dispositivo soporta la activación en reinicio duro para nuevo microcódigo + + + El dispositivo soporta cabeza de cola + + + El dispositivo soporta frecuencia de alta velocidad en el arranque + + + El dispositivo soporta el modo HS-200 (SDR 200MHz) a 1,2V + + + El dispositivo soporta el modo HS-200 (SDR 200MHz) a 1,8V + + + El dispositivo soporta el modo HS-400 (DDR 200MHz) a 1,2V + + + El dispositivo soporta el modo HS-400 (DDR 200MHz) a 1,8V + + + El dispositivo soporta los accesos asimétricos implícitos y explícitos + + + El dispositivo soporta la transferencia de unidades de información + + + El dispositivo soporta la fuera del controlador de E/S tipo 4. + + + El dispositivo soporta la fuera del controlador de E/S tipo 1. + + + El dispositivo soporta la fuera del controlador de E/S tipo 3. + + + El dispositivo soporta la fuera del controlador de E/S tipo 2. + + + El dispositivo soporta la fuera del controlador de E/S tipo 0. + + + El dispositivo soporta comandos enlazados + + + El dispositivo soporta Control de Reporte de Errores de Alineación de Sectores Físicos Largos + + + El dispositivo soporta el direccionamiento jerárquico de LUNs + + + El dispositivo soporta marcar un bloque como incorregible usando WRITE LONG + + + El dispositivo soporta particiones extendidas no persistendes + + + El dispositivo sólo soporta el reloj DT + + + El dispositivo sólo soporta el reloj ST + + + El dispositivo soporta las funcionalidades de particionamiento + + + El dispositivo soporta la activación en encendido para nuevo microcódigo + + + El dispositivo soporta prioridad + + + El dispositivo soporta información de protección + + + El dispositivo soporta intervalos de información de protección + + + El dispositivo soporta Selección y Arbitrio Rápidos + + + El dispositivo soporta referencias + + + El dispositivo soporta direccionado relativo + + + El dispositivo soporta intercambios de confirmaciónes y de solicitud + + + El dispositivo soporta operaciones de purga + + + El dispositivo soporta operaciones de escritura segura + + + El dispositivo soporta establecer un máximo de {0} sectores + + + El dispositivo soporta establecer ACA normal + + + El dispositivo soporta el comando de contar bloques + + + El dispositivo soporta el comando de control de clase de velocidad + + + El dispositivo soporta el conjunto de comandos estándar de MMC + + + El dispositivo soporta los relojes ST y DT + + + El dispositivo soporta las operaciones de recorte seguras e inseguras + + + El dispositivo soporta la transferencia de datos síncrona + + + El dispositivo soporta particiones extendidas con código de sistema + + + El dispositivo soporta Recuperación de Desastre de Cinta + + + El dispositivo soporta el Espejo de Transmisión de la Cinta + + + El dispositivo soporta la cola TCQ + + + El dispositivo soporta el comando TERMINATE TASK + + + El dispositivo soporta el comando de barrera + + + El dispositivo soporta el atributo de tarea ORDERED + + + El dispositivo soporta la operación de sanitización + + + El dispositivo soporta el atributo de tarea SIMPLE + + + El dispositivo soporta comandos de copia de terceras partes + + + El dispositivo soporta datos de sense con llave específica a la condición de atención de la unidad + + + El dispositivo soporta el conjunto de comandos desconocido 0x{0:X2} + + + El dispositivo soporta activación específica del fabricante para nuevo microcódigo + + + El dispositivo soporta un modo específico del fabricante + + + El dispositivo soporta medios WORM + + + El dispositivo soporta WORM versión {0} + + + El dispositivo soporta las clases de comando {0} + + + La frecuencia del reloj del dispositivo: {0}{1} + + + La caché de escritura del dispositivo no es volátil + + + El dispositivo toma un máximo de {0} por defecto para apagarse después de una notificación del comando SWITCH + + + El dispositivo toma un máximo de {0}ms por defecto en el comando SWITCH + + + El dispositivo toma un máximo de {0}ms para borrar un único grupo de borrado + + + El dispositivo toma un máximo de {0}ms para inicializar después del particionado + + + El dispositivo toma un máximo de {0}ms para borrar con seguridad un único grupo de borrado + + + El dispositivo toma un máximo de {0}ms para recortar con seguridad un único grupo de borrado + + + El dispositivo toma un máximo de {0}ms para recortar un único grupo de borrado + + + El dispositivo toma un máximo de {0}ms para moverse al estado de reposo + + + El dispositivo toma un máximo de {0}ms para cambiar el estado de alerta de producción + + + El dispositivo toma un máximo de {0}ms para transicionar entre los estados de reposo y espera + + + El dispositivo toma un máximo de {0}ns para transicionar entre los estados de reposo y espera + + + El dispositivo toma un máximo de {0}s para moverse al estado de reposo + + + El dispositivo toma un máximo de {0}s para cambiar el estado de alerta de producción + + + El dispositivo toma un máximo de {0}µs para moverse al estado de reposo + + + El dispositivo toma un máximo de {0}µs para cambiar el estado de alerta de producción + + + El dispositivo toma un máximo de {0}µs para transicionar entre los estados de reposo y espera + + + La velocidad de transferencia del dispositivo es > 5 Mb/s pero <= 10Mb/s + + + La velocidad de transferencia del dispositivo es <= 5 Mb/s + + + La velocidad de transferencia del dispositivo es > 10Mb/s + + + Velocidad de transferencia del dispositivo: {0}{1} + + + El dispositivo ha usado entre un 10% y un 20% de su vida útil estimada + + + El dispositivo ha usado entre un 20% y un 30% de su vida útil estimada + + + El dispositivo ha usado entre un 30% y un 40% de su vida útil estimada + + + El dispositivo ha usado entre un 40% y un 50% de su vida útil estimada + + + El dispositivo ha usado entre un 50% y un 60% de su vida útil estimada + + + El dispositivo ha usado entre un 60% y un 70% de su vida útil estimada + + + El dispositivo ha usado entre un 70% y un 80% de su vida útil estimada + + + El dispositivo ha usado entre un 80% y un 90% de su vida útil estimada + + + El dispositivo ha usado entre un 90% y un 100% de su vida útil estimada + + + El dispositivo ha usado entre un 0% y un 10% de su vida útil estimada + + + El área de usuario está activada para arrancar + + + El dispositivo usa {0} mA en Vccq en reposo + + + El dispositivo usa {0} mA en Vcc en reposo + + + El dispositivo usa {0} µA en Vccq en reposo + + + El dispositivo usa {0} µA en Vcc en reposo + + + El dispositivo usa una política FIFO para el vaciado de caché + + + El dispositivo usa un máximo de 0.5mA para leer al voltaje mínimo + + + El dispositivo usa un máximo de 1mA para leer al voltaje mínimo + + + El dispositivo usa un máximo de 5mA para leer al voltaje mínimo + + + El dispositivo usa un máximo de 10mA para leer al voltaje mínimo + + + El dispositivo usa un máximo de 25mA para leer al voltaje mínimo + + + El dispositivo usa un máximo de 35mA para leer al voltaje mínimo + + + El dispositivo usa un máximo de 60mA para leer al voltaje mínimo + + + El dispositivo usa un máximo de 100mA para leer al voltaje mínimo + + + El dispositivo usa un máximo de 1mA para leer al voltaje máximo + + + El dispositivo usa un máximo de 5mA para leer al voltaje máximo + + + El dispositivo usa un máximo de 10mA para leer al voltaje máximo + + + El dispositivo usa un máximo de 25mA para leer al voltaje máximo + + + El dispositivo usa un máximo de 35mA para leer al voltaje máximo + + + El dispositivo usa un máximo de 45mA para leer al voltaje máximo + + + El dispositivo usa un máximo de 80mA para leer al voltaje máximo + + + El dispositivo usa un máximo de 200mA para leer al voltaje máximo + + + El dispositivo usa un máximo de 0.5mA para escribir al voltaje mínimo + + + El dispositivo usa un máximo de 1mA para escribir al voltaje mínimo + + + El dispositivo usa un máximo de 5mA para escribir al voltaje mínimo + + + El dispositivo usa un máximo de 10mA para escribir al voltaje mínimo + + + El dispositivo usa un máximo de 25mA para escribir al voltaje mínimo + + + El dispositivo usa un máximo de 35mA para escribir al voltaje mínimo + + + El dispositivo usa un máximo de 60mA para escribir al voltaje mínimo + + + El dispositivo usa un máximo de 100mA para escribir al voltaje mínimo + + + El dispositivo usa un máximo de 1mA para escribir al voltaje máximo + + + El dispositivo usa un máximo de 5mA para escribir al voltaje máximo + + + El dispositivo usa un máximo de 10mA para escribir al voltaje máximo + + + El dispositivo usa un máximo de 25mA para escribir al voltaje máximo + + + El dispositivo usa un máximo de 35mA para escribir al voltaje máximo + + + El dispositivo usa un máximo de 45mA para escribir al voltaje máximo + + + El dispositivo usa un máximo de 80mA para escribir al voltaje máximo + + + El dispositivo usa un máximo de 200mA para escribir al voltaje máximo + + + El dispositivo usa una caché de impresión + + + El dispositivo usa una caché de escritura + + + El dispositivo usa una caché de escritura pero no vuelve hasta que la caché está vaciada + + + El dispositivo usa ECC de tipo BCH(542, 512) por defecto + + + El dispositivo usa CPRM según la especificación versión 1.01 + + + El dispositivo usa CPRM según la especificación versión 2.00 + + + El dispositivo usa CPRM según la especificación versión 3.xx + + + El dispositivo usa la velocidad por defecto + + + El dispositivo usa medios no magnéticos + + + El dispositivo no usa ECC por defecto + + + El dispositivo usa ATA paralelo. + + + El dispositivo usa ATA en serie. + + + El dispositivo usa la velocidad {0} + + + El dispositivo usa intermitencia durante las respuestas de salida de datos y CRC + + + El dispositivo usa intermitencia durante las respuestas de salida de datos, CRC y CMD + + + El dispositivo usa Formato Universal de Fichero + + + El dispositivo usa CPRM según la especificación desconocido con código {0} + + + El dispositivo usa ECC de tipo desconocido según código {0} por defecto + + + El dispositivo usa un formato de fichero desconocido según código {0} + + + El dispositivo usa un formato de fichero desconocido según código {0} y grupo del formato 1 + + + El dispositivo usa un transporte desconocido según código {0} + + + Fabricante: {0} + + + Versión: {0} + + + Ancho del dispositivo: {0} bits + + + El dispositivo arrancará con un ancho del bus hasta x1 SDR o x4 DDR + + + El dispositivo arrancará con un ancho del bus hasta x4 SDR o DDR + + + El dispositivo arrancará con un ancho del bus hasta x8 SDR o DDR + + + El dispositivo no reducirá su rendimiento para alargar su vida + + + El dispositivo reiniciará las condiciones de arranque al modo de compatibilidad después de la operación de arranque + + + El dispositivo mantendrá las condiciones de arranque después de la operación de arranque + + + El dispositivo usará el ratio de datos dual en la operación de arranque. + + + El dispositivo usa tamaño de unidades de borrado de alta capacidad, y definiciones de tiempo de espera y tamaño del grupo de protección contra escritura + + + El dispositivo usará el ratio de datos simple con reloj compatible en la operación de arranque + + + El dispositivo usará el ratio de datos simple con reloj de alta velocidad en la operación de arranque + + + El dispositivo usará un método desconocido de arranque con código 3. + + + El dispositivo escribe directamente en el medio + + + Se permite la copia digital de la pista + + + Se prohíbe la copia digital de la pista + + + Dispositivo de acceso directo + + + Código de aplicación del disco: {0} + + + Código de barras del disco: {0} + + + El tipo de libro del disco es {0} + + + El disco arranca nativamente. + + + El disco arranca usando el cargador desconocido: {0}. + + + El disco arranca usando Windows CE. + + + El disco no puede ser jugado en ninguna región. + + + El disco puede ser grabado con o sin carcasa + + + El disco puede ser jugado en las siguientes regiones: + + + El disco puede ser jugando en cualquier región. + + + El disco es conforme a ECMA-267 + + + El disco es conforme a ECMA-268 + + + El disco es conforme a ECMA-272 + + + El disco es conforme a ECMA-274 + + + El disco es conforme a ECMA-279 + + + El disco es conforme a ECMA-330 + + + El disco es conforme a ECMA-337 + + + El disco es conforme a ECMA-338 + + + El disco es conforme a ECMA-349 + + + El disco es conforme a ECMA-359 + + + El disco es conforme a ECMA-364 + + + El disco es conforme a ECMA-365 + + + El disco es conforme a ECMA-371 + + + El disco es conforme a ECMA-374 + + + El disco es conforme a ECMA-382 + + + El disco es conforme a ECMA-384 + + + Clase del disco: {0} + + + El disco viene en un cartucho + + + El disco contiene información extendida para VCPS + + + El disco no tiene una BCA. + + + El disco no especifica una velocidad de transferencia máxima. + + + Disco para uso restringido. + + + Disco para uso no restringido. + + + Disco para uso en unidades especiales según el valor de intención {0} + + + El disco tiene {0} capas + + + El disco tiene {0} sesiones + + + El disco tiene {0} zonas + + + El disco tiene un diámetro de 120mm + + + El disco tiene un diámetro de 80mm + + + El disco tiene una BCA. + + + El disco tiene una velocidad de transferencia máxima de {0} Mbit/seg. + + + El disco ha sido certificado por el fabricante + + + El disco ha sido certificado por un usuario + + + El disco ha sido extraído del cartucho + + + El disco no tiene encriptación. + + + El disco tiene inihibda la escritura por la razón desconocida {0} + + + ID del disco: {0:X6} + + + El disco es un {0} {1} versión {2} + + + El disco es un disco óptico de Nintendo Gamecube (GOD) + + + El disco es un disco óptico de Nintendo Wii (WOD) + + + El disco es un CD-R + + + El disco es un CD-RW + + + El disco es un DDCD-R + + + El disco es un DDCD-RW + + + El disco está definido para el uso restringido + + + El disco está definido para el uso no restringido + + + El disco está vacío + + + El disco está encriptado usando AACS. + + + El disco está encriptado usando CPRM. + + + El disco está encriptado usando CSS o CPPM. + + + El disco está encriptado usando un algoritmo desconocido con ID {0}. + + + El disco es borrable + + + El disco está finalizado + + + El disco es un CD-R de alta velocidad (CAV) + + + El disco es un CD-RW High-Speed + + + El disco está incompleto + + + El disco es un medio de tipo A, CD-R de categoría beta alta (A+) + + + El disco es un medio de tipo B, CD-RW de categoría beta alta (B+) + + + El disco es un medio de tipo B, CD-R de categoría beta alta (B+) + + + El disco es un medio de tipo C, CD-RW de categoría beta alta (C+) + + + El disco es un medio de tipo C, CD-R de categoría beta alta (C+) + + + El disco es un medio de tipo A, CD-R de categoría beta baja (A-) + + + El disco es un medio de tipo B, CD-R de categoría beta baja (B-) + + + El disco es un medio de tipo B, CD-RW de categoría beta baja (B-) + + + El disco es un medio de tipo C, CD-RW de categoría beta baja (C-) + + + El disco es un medio de tipo C, CD-R de categoría beta baja (C-) + + + El disco es un CD-R de velocidad normal (CLV) + + + El disco es RW (regrabable) + + + El disco es R (grabable) + + + El disco es un CD-RW Ultra-Speed + + + El disco es un CD-RW Ultra-Speed+ + + + El disco tiene inhibida la escritura por haber sido extraído del cartucho + + + El disco tiene inhibida la escritura por una razón desconocida + + + Disco fabricado por: {0} + + + ID del fabricante del disco: "{0}" + + + El fabricante del disco es {0} + + + La información suplementaria del fabricante del disco es {0} + + + La velocidad de transferencia máxima del disco es 10,08 Mbit/seg. + + + La velocidad de transferencia máxima del disco es 20,16 Mbit/seg. + + + La velocidad de transferencia máxima del disco es 2,52 Mbit/seg. + + + La velocidad de transferencia máxima del disco es 30,24 Mbit/seg. + + + La velocidad de transferencia máxima del disco es 5,04 Mbit/seg. + + + La velocidad de transferencia máxima del disco está especificada por el código desconocido {0} + + + La velocidad de transferencia máxima del disco no está especificada + + + El disco se puede escribir sin un cartucho + + + Medio del disco: {0} + + + El ID del tipo de medio del disco es: "{0}" + + + El tipo de medio del disco es {0} + + + Disco número {0} de {1} + + + La revisión de producto del disco es {0} + + + Número de revisión de producto del disco: {0} + + + La reflectividad del disco está entre el 18% y el 30% + + + La reflectividad del disco está entre el 45% y el 85% + + + El disco debería escribirse sin carcasa + + + El disco no debería escribirse sin un cartucho + + + Tamaño del disco: 120mm + + + Tamaño del disco: 80mm + + + Tamaño del disco: código desconocido {0} + + + La superficie del disco tiene el estado de protección contra escritura + + + Fechado del disco: 0x{0:X2} + + + La pendiente de pista es de 0,74µm + + + Tipo de disco: {0} + + + El disco está declarado como un CD-DA o un CD-ROM + + + El disco está declarado como un CD-i + + + El disco está declarado como un CD-ROM XA + + + Identificador del tipo de disco: "{0}" + + + El tipo de disco no está definido + + + 1er campo específico del tipo de disco: 0x{0:X2} + + + 2º campo específico del tipo de disco: 0x{0:X8} + + + El disco usa un canal de 69,0nm dando 27Gb por capa. + + + El disco usa un canal de 74,5nm dando 25Gb por capa. + + + El disco usa un tipo de colorante de larga estrategia (Cianina, AZO, etc...) + + + El disco usa polaridad negativa. + + + El disco usa cambio de fase + + + El disco usa polaridad positiva + + + El disco usa un tipo de colorante de corta estrategia (Ftalocianina, etc...) + + + El disco tiene un código de BCA desconocido: {0} + + + El disco usa una longitud de canal desconocido con código {0} + + + El disco usa una polaridad desconocida con código {0} + + + El disco usa una polaridad de reflectividad grabada desconocida con código {0} + + + El uso del disco es restringido + + + El uso del disco no es restringido + + + Versión del disco: {0} + + + Formato de la unidad DI: 0x{0:X2} + + + La unidad DI ocupa {0} bytes + + + Secuencia de la unidad DI: {0} + + + DLTtape III comprimida + + + DLTtape III a 42500 bpp + + + DLTtape III con 56 pistas + + + DLTtape III a 62500 bpp + + + DLTtape IIIxt + + + DLTtape IIIxt comprimida + + + DLTtape IV + + + DLTtape IV comprimida + + + DLTtape IV a 123090 bpp comprimida + + + DLTtape IV a 85937 bpp comprimida + + + DLTtape IV a 98250 bpp comprimida + + + DLTtape IV a 123090 bpp + + + DLTtape IV a 85937 bpp + + + DLTtape IV a 98250 bpp + + + DMA soportado + + + La auto-activación de la configuración DMA está soportada + + + La auto-activación de la configuración DMA está soportada y activada + + + Modo de reloj DMA: {0} + + + Título doméstico: {0} + + + Se utiliza un código de caracteres de doble byte + + + DOWNLOAD MICROCODE DMA está soportado + + + DOWNLOAD MICROCODE está soportado + + + DOWNLOAD MICROCODE está soportado y activado + + + La unidad acepta un máximo de {0} bloques en un comando READ durante una reconstrucción + + + La unidad acepta un máximo de {0} bloques en un comando REGENERATE + + + La unidad acepta un máximo de {0} bloques en un único comando XOR WRITE + + + La unidad acepta datos empaquetados del subcanal R-W + + + La unidad acepta datos sin procesar del subcanal R-W + + + La unidad permite sobreescribir todas las etiquetas de formato + + + La unidad permite sobreescribir una cabecera de pista + + + La unidad y el medio insertado soportan SecurDisc + + + La unidad y el medio insertado soportan VCPS + + + La unidad puede leer DVD+MRW así como leer y escribir CD-MRW + + + La unidad puede leer el subcanal R-W del Lead-In sin procesar + + + Los segmentos de caché de la unidad deberían ser {0} bloques de largo + + + Los segmentos de caché de la unidad deberían ser {0} bytes de largo + + + La unidad no puede almacenar extents de LBA + + + La unidad puede ser usada como un dispositivo de disquete de sistema + + + La unidad puede cambiar el lado del disco + + + La unidad puede continuar en una pérdida de transmisión + + + La unidad puede proveer una transmisión compuesta de audio y video + + + La unidad puede hacer un formateo de inicio rápido + + + La unidad puede hacer una prueba de escritura + + + La unidad puede expulsar el medio + + + La unidad puede ampliar el área de reserva en un disco BD-RE formateado + + + La unidad puede re-formatear rápidamente discos BD-RE + + + La unidad puede formatear discos BD-RE con certificación completa + + + La unidad puede formatear discos BD-RE con certificación rápida + + + La unidad puede formatear discos BD-RE sin asignar reservas + + + La unidad puede formatear discos BD-R en formato RRM + + + La unidad puede formatear el medio en bloques lógicos + + + La unidad puede generar datos de estado de defectos durante el formateo + + + La unidad puede bloquear el medio + + + La unidad puede sobreescribir una pista TAO con otra en los CD-RW + + + La unidad puede reproducir audio + + + La unidad puede leer y escribir CD-MRW + + + La unidad puede leer y escribir CD-MRW y DVD+MRW + + + La unidad puede leer y escribir CD-R + + + La unidad puede leer y escribir CD-RW + + + La unidad puede leer y escribir DVD+MRW + + + La unidad puede leer y escribir DVD+R + + + La unidad puede leer y escribir DVD+RW DL + + + La unidad puede leer y escribir DVD+R DL + + + La unidad puede leer y escribir DVD-R + + + La unidad puede leer y escribir DVD-RAM + + + La unidad puede leer y escribir DVD+RW + + + La unidad puede leer el código de barras + + + La unidad puede leer el Burst Cutting Area de un Blu-ray + + + La unidad puede leer BD-RE de versión anterior a la 1.0 + + + La unidad puede leer BD-RE versión 1 + + + La unidad puede leer BD-RE versión 2 + + + La unidad puede leer BD-ROM de versión anterior a la 1.0 + + + La unidad puede leer BD-ROM versión 1 + + + La unidad puede leer BD-R de versión anterior a la 1.0 + + + La unidad puede leer BD-R versión 1 + + + La unidad puede leer ambos lados de un disco + + + La unidad puede leer CD-MRW + + + La unidad puede leer CD-MRW y DVD+MRW + + + La unidad puede leer CD-R + + + La unidad puede leer CD-RW + + + La unidad puede leer DDCD + + + La unidad puede leer los datos de estado de defectos grabados en el medio + + + La unidad puede leer audio digital + + + La unidad puede leer medios DVD + + + La unidad puede leer DVD+R + + + La unidad puede leer DVD+RW + + + La unidad puede leer DVD+RW DL + + + La unidad puede leer DVD-R + + + La unidad puede leer DVD-RAM + + + La unidad puede leer DVD-ROM + + + La unidad puede leer DVD-RW DL en todos los modos de grabación + + + La unidad puede leer DVD-R DL en todos los modos de grabación + + + La unidad puede leer HD DVD-ROM y HD DVD-RW + + + La unidad puede leer HD DVD-ROM, HD DVD-RW y HD DVD-R + + + La unidad puede leer HD DVD-ROM, HD DVD-RW y HD DVD-RAM + + + La unidad puede leer HD DVD-ROM, HD DVD-RW, HD DVD-R y HD DVD-RAM + + + La unidad puede leer el ISRC + + + La unidad puede leer el número de catálogo del medio + + + La unidad puede leer sectores en formato Modo 2 Forma 1 + + + La unidad puede leer sectores en formato Modo 2 Forma 2 + + + La unidad puede leer los subcanales R-W sin corrección y entrelazados + + + La unidad puede leer, desentrelazar y corregir los subcanales R-W + + + La unidad puede devolver el CD-Text del Lead-In + + + La unidad puede devolver información sobre el área de reemplazo + + + La unidad puede parar una operación inmediata larga + + + La unidad puede almacenar {0} extents de LBA + + + La unidad puede almacenar 256 extents de LBA + + + La unidad puede escribir BD-RE de versión anterior a la 1.0 + + + La unidad puede escribir BD-RE versión 1 + + + La unidad puede escribir BD-RE versión 2 + + + La unidad puede escribir BD-R en modo Seudo-Sobre-Escritura SRM + + + La unidad puede escribir BD-R de versión anterior a la 1.0 + + + La unidad puede escribir BD-R versión 1 + + + La unidad puede escribir CDs en modo sin procesar: + + + La unidad puede escribir CDs en modos sin procesar y Sesión por Vez (SAO): + + + La unidad puede escribir CDs en modo Sesión por Vez (SAO): + + + La unidad puede escribir CDs en modo Pista por Vez (TAO): + + + La unidad puede escribir CD-RW + + + La unidad puede escribir HD DVD-RW + + + La unidad puede escribir HD DVD-RW y HD DVD-R + + + La unidad puede escribir HD DVD-RW y HD DVD-RAM + + + La unidad puede escribir HD DVD-RW, HD DVD-R y HD DVD-RAM + + + La unidad puede escribir CD-RW High-Speed + + + La unidad puede escribir CDs multi-sesión en modo sin procesar + + + La unidad puede escribir esta densidad + + + La unidad puede escribir datos provistos por el usuario en los subcanales R-W + + + La unidad clama la capacidad de leer todos los formatos de CD según la Especificación Multi-Lectura de OSTA + + + La unidad clama soporte de reportar la Información de Recursos de Pista + + + La unidad clama conformidad con la Especificacón de Unidad DVD de Multi Lectura + + + La unidad contiene un intercambiador que puede reportar el contenido exacto de las ranuras + + + Copyright de la unidad: {0} + + + La velocidad actual de lectura de la unidad es de {0} Kbyte/seg. + + + La velocidad actual de escritura de la unidad es de {0} Kbyte/seg. + + + La velocidad actual de escritura en modo CLV de la unidad es de {0} Kbyte/seg. + + + La velocidad actual de escritura en modo CAV puro de la unidad es de {0} Kbyte/seg. + + + La fecha/hora de la unidad es: {0} + + + La unidad no permite sobreescribir ningún bloque lógico + + + La unidad no hace distinción entre los datos leídos cacheados + + + La unidad no hace distinción entre los datos escritos cacheados + + + La unidad no soporta la compresión de datos + + + La unidad no usa la compresión + + + Versión de la EEPROM de la unidad: {0} + + + El firmware de la unidad está fechado a {0} + + + La unidad genera fin-de-datos + + + Versión del hardware de la unidad: {0} + + + La unidad tiene {0} zonas de caché DBI + + + La unidad tiene {0} entradas DBI + + + La unidad tiene un incremento {0} de unidad de tiempo del Grupo 3 + + + La unidad tiene {0} Kbyte de búfer + + + La unidad tiene {0} ranuras + + + La unidad tiene disponibles {0} cambios controlados por el usuario. + + + La unidad tiene disponibles {0} reinicios del fabricante. + + + La unidad tiene {0} niveles de volumen + + + La unidad tiene una salida de audio analógica + + + La unidad ha estado operando {0} + + + La unidad ha sido encendida {0} veces + + + La unidad ha estado encendida un total de {0} segundos + + + La unidad ha estado encendida esta vez los últimos {0} segundos + + + La unidad tiene la encriptación activada + + + La unidad no tiene una región establecida. + + + La unidad tiene establecidas las siguientes regiones: + + + La unidad tiene dos LUNs siendo el de reescritura el + + + La unidad informa de un perfil desconocido código 0x{0:X4} + + + La unidad es capaz de acceder a discos híbridos + + + La unidad es capaz de mantener la capa de formato en líne en un reinicio o apagado + + + La unidad puede silenciar los canales por separado + + + La unidad es capaz de realizar la gestión de energía controlada por sí misma y por el sistema + + + La unidad puede leer el número de serie del medio + + + La unidad puede reportar el contenido de las ranuras después de un reinicio o cambio + + + La unidad es un intercambiador con cartuchos + + + La unidad es un intercambiador de discos individuales + + + La unidad es un dispositivo óptico no CD + + + La unidad es capaz de vincular con pérdida cero + + + La unidad está desactivada hasta un ciclo de energía + + + La unidad está emulando una unidad de CD-ROM + + + La unidad ha sido escrita con el firmware Kreon {0}. + + + La unidad está bloqueada, el medio no puede ser expulsado ni insertado + + + La unidad está bloqueada, el medio no puede ser expulsado, pero si está vacía, sí puede ser insertado + + + La unidad no sigue ningún perfil + + + La unidad no está emulando una unidad de CD-ROM + + + La unidad no está bloqueada, el medio puede ser expulsado e insertado + + + La unidad está operando en modo WORM + + + La unidad se abre por arriba + + + La unidad está libre de regiones. + + + La unidad está protegida contra escritura a través de software hasta su apagado + + + Los puentes de la unidad eligen el ID SCSI {0} + + + La velocidad máxima de lectura de la unidad es de {0} Kbyte/seg. + + + La velocidad máxima de escritura de la unidad es de {0} Kbyte/seg. + + + El medio es extraíble + + + La unidad necesita un mínimo de {0} ms entre comandos READ durante una reconstrucción + + + La unidad necesita {0} pulsos de paso por cilindro + + + La unidad opera usando un modo de direccionamiento explícito + + + La unidad opera usando un modo de direccionamiento implícito + + + La unidad se enciende bloqueada + + + La región de la unidad está establecida permanentemente, pero puede reiniciarse por el fabricante si es necesario. + + + La región de la unidad está establecida. + + + La región de la unidad está establecida, con restricciones adicionales requeridas para cambiarla. + + + La unidad reporta un número de perfil reservado + + + La unidad reporta advertancias tempranas + + + La unidad reporta marcas + + + La unidad reponde al ID SCSI {0} + + + Número de parte del servo de la unidad: {0} + + + La unidad debería asignar {0} bytes al búfer incluso cuando no se puede expulsar ningún dato de la caché + + + La unidad debería ser capaz de proveer un espacio de direccionado libre de defectos contiguo + + + La unidad debería tener la abilidad de sobreescribir bloques lógicos sólo en conjuntos fijos cada vez + + + La unidad debería anotar condiciones de excepción informacionales + + + La unidad debería mantener su posición en un reinicio + + + La unidad debería posicionarse al principio de la partición de datos por defecto en un reinicio + + + La unidad debería reportar la página de Recuperación de Errores de Lectura/Escritura + + + La unidad debería reportar los errores corregidos + + + La unidad debería tener {0} segmentos de caché + + + La unidad no debería reordenar la secuencia de los comandos de escritura para ser más rápida + + + La unidad da pasos en {0} ns + + + La unidad da pasos en {0} µs + + + La unidad soporta {0} AGIDs concurrentemente + + + La unidad soporta {0} LUNs + + + La unidad soporta {0} niveles de volumen + + + La unidad soporta AACS versión {0} + + + La unidad soporta AACS versión {0} y el disco actual está encriptado + + + La unidad soporta el modo de reserva de direccionamiento en el comando RESERVE TRACK + + + La unidad soporta Almacenamiento Avanzado - Magneto-Óptico + + + La unidad soporta un máximo de {0} bytes en una sola hoja de referencia + + + La unidad soporta BD-RE + + + La unidad soporta BD-ROM + + + La unidad soporta BD-R RRM + + + La unidad soporta BD-R SRM + + + La unidad soporta ambas formar de parar un formateo en segundo plano + + + La unidad soporte la grabación libre de insuficiencias del búfer + + + La unidad soporta encriptación del bus + + + La unidad soporta Punteros de Error C2 + + + La unidad soporta punteros C2 + + + La unidad soporta CD-R + + + La unidad soporta CD-ROM + + + La unidad soporta CD-RW + + + La unidad soporta subtipos de CD-RW + + + La unidad soporta los tipos de bloque de datos: + + + La unidad soporta la compresión de datos + + + La unidad soporta el DCB {0:X8}h + + + La unidad soporta DDCD-R + + + La unidad soporta DDCD-ROM + + + La unidad soporta DDCD-RW + + + La unidad soporta eventos de dispositivo ocupado + + + La unidad soporta los bits DPO y FUA + + + La unidad soporta el modo DRT-DM + + + La unidad soporta CPRM para DVD versión {0} + + + La unidad soporta CPRM para DVD versión {0} y el disco actual está o puede ser encriptado + + + La unidad soporta CSS y/o CPPM para DVD + + + La unidad soporta CSS y/o CPPM para DVD versión {0} + + + La unidad soporta CSS y/o CPPM para DVD versión {0} y el disco actual está encriptado + + + La unidad soporta DVD-Download + + + La unidad soporta DVD+R + + + La unidad soporta DVD+RW + + + La unidad soporta DVD+RW DL + + + La unidad soporta DVD+R DL + + + La unidad soporta DVD-R + + + La unidad soporta DVD-RAM + + + La unidad soporta DVD-ROM + + + La unidad soporta DVD-RW DL + + + La unidad soporta encriptación + + + La unidad soporta EVPD, Código de Página y Longitud de Asignación de 16-bits tal como describe SPC-3 + + + La unidad soporta generar el nonce vinculante + + + La unidad soporta el formateo en sectores duros + + + La unidad soporta HDBurn CD-R + + + La unidad soporta HDBurn CD-ROM + + + La unidad soporta HDBurn CD-RW + + + La unidad soporta HD DVD-R + + + La unidad soporta HD DVD-RAM + + + La unidad soporta HD DVD-ROM + + + La unidad soporta HD DVD-RW + + + La unidad soporta HD DVD-RW DL + + + La unidad soporta HD DVD-R DL + + + La unidad soporta salida digital IEC-958 en el puerto 1 + + + La unidad soporta salida digital IEC-958 en el puerto 2 + + + La unidad soporta DVD-R grabados con salto de capa + + + La unidad soporta OSPBs vinculados + + + La unidad soporta medios Magneto-Ópticos + + + La unidad soporta medios que requieren borrando antes de su escritura + + + La unidad soporta actualizar el microcódigo + + + La unidad soporta discos multi-sesión y/o Photo-CD + + + La unidad soporta medios intercambiables no extraíbles + + + La unidad sólo soporta preguntar GET EVENT STATUS NOTIFICATION + + + La unidad sólo soporta la parada de lectura de compatibilidad + + + La unidad soporta eventos de solicitud / notificación de cambio operacional + + + La unidad soporta medios ópticos de escritura única + + + La unidad soporta el modo DM persistente + + + La unidad soporta GET EVENT STATUS NOTIFICATION preguntados y asíncronos + + + La unidad soporta actualizar el PSA en medios de escritura única + + + La unidad soporta el formateo rápido + + + La unidad soporta leer CD-R empaquetados + + + La unidad soporta leer el Media Key Block de CPRM + + + La unidad soporta leer el Certificado de la Unidad + + + La unidad soporte leer/escribir el PAC de protección contra escritura en medios BD-R y BD-RE + + + La unidad soporta recuperar datos del búfer + + + La unidad soporta reportar el progreso del formateo + + + La unidad soporta la sobreescritura restringida en DVD-RW + + + La unidad soporta medios reescribibles y estraíbles + + + La unidad soporta SecurDisc + + + La unidad soporta un volumen separado por canal + + + La unidad soporta DVD-RW grabados secuencialmente + + + La unidad soporta DVD-R DL grabados secuencialmente + + + La unidad soporta Establecer Rendimiento Mínimo con el comando SET STREAMING + + + La unidad soporta establecer/liberar el estado de PWP + + + La unidad soporta S.M.A.R.T. + + + La unidad soporta el formateo en sectores flojos + + + La unidad soporta la escritura en transmisión + + + La unidad soporta la prueba de escritura + + + La unidad soporta el comando BLANK + + + La unidad soporta el bit de bloqueo en el comando READ BUFFER CAPACITY + + + La unidad soporta el bit DAP en los comandos READ CD y READ CD MSF + + + La unidad soporte el Grupo 3 en la página de modo de Protección y Tiempo de espera 1Dh + + + La unidad soporta la página de modo de Control de Excepciones Informacionales 1Ch + + + La unidad soporta el comando SCAN + + + La unidad soporta el comando SET CD SPEED + + + La unidad soporta el bit SWPP de la página de modo de Protección y Tiempo de espera + + + La unidad soporta la Clase del Subsistema de Seguridad Óptica del Grupo de Computación Confiable + + + La unidad soporta los datos de velocidad de escritura en GET PERFORMANCE y el campo WRC en SET STREAMING + + + La unidad soporta los bloques de descripción del rendimiento de escritura en la página de modo MMC 2Ah + + + La unidad soporta la página de modo de Protección y Tiempo de espera 1Dh + + + La página soporta validad el Modo de 5-bits de los comandos READ BUFFER y WRITE BUFFER + + + La unidad soporta VCPS + + + La unidad soporta escribir sin ningún requisito de verificación + + + La unidad soporta escribir a {0} Kbyte/seg. en modo CLV + + + La unidad soporta escribir a {0} Kbyte/seg. en modo CAV puro + + + La unidad soporta escribir DDCD-R + + + La unidad soporta escribir DDCD-RW + + + La unidad soporta escribir DVD-R + + + La unidad soporta escribir DVD-R y DVD-RW + + + La unidad soporta escribir DVD-R y DVD-R DL + + + La unidad soporta escribir DVD-R, DVD-RW y DVD-R DL + + + La unidad soporta escribir en un estado de sesión intermediaria y el formateo rápido + + + La unidad soporta el DCB de inhibición de escritura en medios DVD+RW + + + La unidad soporta escribir con encriptación del bus + + + La unidad soporta enlazado de pérdida cero + + + El tiempo de la unidad está sincronizado con una fuente NTP + + + El tiempo de la unidad está en UTC + + + La unidad usa una interfaz ATAPI + + + La unidad usa una interfaz IEEE-1394A + + + La unidad usa una interfaz IEEE-1394B + + + La unidad usa una interfaz IEEE-1394 + + + La unidad usa una interfaz desconocida con código {0} + + + La unidad usa una interfaz física no especificada + + + La unidad usa una interfaz USB + + + La unidad usa una interfaz Fibre Channel + + + La unidad usa una interfaz SCSI + + + La unidad usa una interfaz ATAPI serial + + + La unidad usa una bandeja + + + La unidad usa una interfaz propietaria del fabricante + + + La unidad utiliza la compresión por defecto + + + La unidad usa un carrito para el medio + + + La unidad usa la compresión desconocida {0} + + + La unidad usa el mecanismo de carga desconocido {0} + + + La unidad abortará al detectar un error de escritura + + + La unidad demorará {0} ms antes de que los datos del búfer sean escritor a la fuerza en el medio incluso antes de que el búfer se llene + + + La unidad no hará nada con un medio WORM manipulado + + + La unidad expulsará los cartuchos de limpieza ante un error + + + La unidad expulsará los cartuchos de datos ante un error + + + La unidad expulsará los cartuchos de firmware ante un error + + + La unidad empleará un máximo de {0} ms para recuperar datos + + + La unidad se liberará y posicionará por sí misma en un reinicio de LUN o destino + + + La unidad mantendrá la posición en un reinicio de LUN o destino + + + La unidad no aceptará bajar el firmware con una cinta FMR + + + La unidad no saldrá de la emulación automáticamente + + + La unidad sólo grabará un disco en formato OSSC + + + La unidad sólo responderá a los comandos si ha recibido una reserva + + + La unidad solicitará limpieza periódicamente + + + La unidad pre-leerá hasta llenar el búfer + + + La unidad pre-leerá hasta detectar una marca de fichero + + + La unidad pre-leerá hasta detectar tres marcas de fichero + + + La unidad pre-leerá hasta detectar dos marcaa de fichero + + + La unidad se mantendrá en el mismo estado 125 ms después de una operación de posicionamiento, lectura o escritura + + + La unidad se mantendrá en el mismo estado 250 ms después de una operación de posicionamiento, lectura o escritura + + + La unidad se mantendrá en el mismo estado 500 ms después de una operación de posicionamiento, lectura o escritura + + + La unidad se mantendrá en el mismo estado 1 segundo después de una operación de posicionamiento, lectura o escritura + + + La unidad se mantendrá en el mismo estado 2 segundos después de una operación de posicionamiento, lectura o escritura + + + La unidad se mantendrá en el mismo estado 4 segundos después de una operación de posicionamiento, lectura o escritura + + + La unidad se mantendrá en el mismo estado 8 segundos después de una operación de posicionamiento, lectura o escritura + + + La unidad se mantendrá en el mismo estado 16 segundos después de una operación de posicionamiento, lectura o escritura + + + La unidad se mantendrá en el mismo estado 32 segundos después de una operación de posicionamiento, lectura o escritura + + + La unidad se mantendrá en el mismo estado 1 minuto después de una operación de posicionamiento, lectura o escritura + + + La unidad se mantendrá en el mismo estado 2 minutos después de una operación de posicionamiento, lectura o escritura + + + La unidad se mantendrá en el mismo estado 4 minutos después de una operación de posicionamiento, lectura o escritura + + + La unidad se mantendrá en el mismo estado 8 minutos después de una operación de posicionamiento, lectura o escritura + + + La unidad se mantendrá en el mismo estado 16 minutos después de una operación de posicionamiento, lectura o escritura + + + La unidad se mantendrá en el mismo estado 32 minutos después de una operación de posicionamiento, lectura o escritura + + + La unidad se mantendrá en el mismo estado durante un tiempo específico del fabricante después de una operación de posicionamiento, lectura o escritura + + + La unidad se mantendrá en el estado de mantener la pista 125 ms después de un posicionamiento o lectura + + + La unidad se mantendrá en el estado de mantener la pista 250 ms después de un posicionamiento o lectura + + + La unidad se mantendrá en el estado de mantener la pista 500 ms después de un posicionamiento o lectura + + + La unidad se mantendrá en el estado de mantener la pista 1 segundo después de un posicionamiento o lectura + + + La unidad se mantendrá en el estado de mantener la pista 2 segundos después de un posicionamiento o lectura + + + La unidad se mantendrá en el estado de mantener la pista 4 segundos después de un posicionamiento o lectura + + + La unidad se mantendrá en el estado de mantener la pista 8 segundos después de un posicionamiento o lectura + + + La unidad se mantendrá en el estado de mantener la pista 16 segundos después de un posicionamiento o lectura + + + La unidad se mantendrá en el estado de mantener la pista 32 segundos después de un posicionamiento o lectura + + + La unidad se mantendrá en el estado de mantener la pista 1 minuto después de un posicionamiento o lectura + + + La unidad se mantendrá en el estado de mantener la pista 2 minutos después de un posicionamiento o lectura + + + La unidad se mantendrá en el estado de mantener la pista 4 minutos después de un posicionamiento o lectura + + + La unidad se mantendrá en el estado de mantener la pista 8 minutos después de un posicionamiento o lectura + + + La unidad se mantendrá en el estado de mantener la pista 16 minutos después de un posicionamiento o lectura + + + La unidad se mantendrá en el estado de mantener la pista 32 minutos después de un posicionamiento o lectura + + + La unidad se mantendrá en el estado de mantener la pista un tiempo específico del fabricante después de una operación de posicionamiento o lectura + + + La unidad repetirá las operaciones de lectura {0} veces + + + La unidad repetirá las operaciones de verificación {0} veces + + + La unidad repetirá las operaciones de escritura {0} veces + + + La unidad reportará los errores de auto-prueba en segundo plano + + + La unidad responderá al ID SCSI {0} en la activación del Puerto A + + + La unidad retornará CHECK CONDITION con un medio WORM manipulado + + + La unidad volverá del comando de reproducción inmediatamente + + + La unidad volverá del comando de reproducción cuando esta termine + + + La unidad establecerá CHECK CONDITION cuando sea necesaria una limpieza + + + La unidad establecerá CHECK CONDITION cuando se cumplan los criterios de medio muerto + + + La unidad detendrá la reproducción al finalizar la pista + + + La unidad sincronizará el búfer con el medio ante advertencias tempranas + + + La unidad transferirá la longitud solicitada completa sin demora al realizar recuperación de errores + + + La unidad usará primero los métodos más oportunos de recuperación de errores + + + El conjunto de funcionalidades DSN está soportado + + + El conjunto de funcionalidades DSN está soportado y activado + + + DT1825 está soportado + + + DT1825 está soportado y activado + + + El colorante es orgánico + + + El colorante es de cambio de fase + + + Cada canal puede silenciarse independientemente + + + El volumen de cada canal puede controlarse independientemente + + + Cada minuto tiene {0} segundos + + + Cada segundo tiene {0} fotogramas + + + Cada pulso de paso dura {0} ms + + + ECMA-46 & ANSI X3.56-1986: Cartucho de Cinta Magnética de 6,30 mm, Codificación por Fase, 63 bpmm + + + ECMA-62 & ANSI X3.22-1983: Cinta Magnética de 9 pistas y 12,7 mm, 32 tfpmm, NRZI, 32 cpmm + + + ECMA-62 & ANSI X3.54-1986: Cinta Magnética de 9 pistas y 12,7 mm, 356 tfpmm, NRZI, 245 cpmm GCR + + + ECMA-62 & ANSI X3.39-1986: Cinta Magnética de 9 pistas y 12,7 mm, 126 tfpmm, Codificación por Fase, 63 cpmm + + + ECMA-79 & ANSI X3.116-1986: Cartucho de Cinta Magnética de 6,30 mm, 252 tfpmm, MFM + + + ECMA-98: Cartucho de Cinta Magnética de 6.30 mm, NRZI, 394 tfpmm + + + ECMA TC17: Cartucho de Cinta Magnética de 8 mm, 1789 bpmm, RLL + + + Versión del formato de la EEPROM: {0}.{1} + + + Dispositivo de servicios de carcasa + + + Tiempo final del intervalo que debe ser esquivado: {0:D2}:{1:D2}:{2:D2} + + + Fin de fichero. + + + Encontrado fin de medio o partición + + + Fin de registro. + + + Epílogo {0:X2}{1:X2}{2:X2} + + + El rango de memoria borrado debería ser '{0}'. + + + Bloque de borrado: {0} bytes + + + El ratio de energía de borrado no está especificado + + + Error de clase {0} tipo {1} + + + Error de clase {0} tipo {1} occurido en el bloque {2} + + + La corrección de errores está desactivada + + + PAL (Europa) + + + EXB-8200 + + + EXB-8200 comprimida + + + EXB-8500 + + + EXB-8500 comprimida + + + Se esperaba un tamaño de CDFullTOC ({0} bytes) que no es el recibido ({1} bytes), no se descodificará + + + Se esperaba un tamaño de CDSessionInfo ({0} bytes) que no es el recibido ({1} bytes), no se descodificará + + + Se esperaba un tamaño de ATIP de CD (32 bytes) que no es el recibido ({0} bytes), no se descodificará + + + Se esperaba un tamaño de PMA de CD ({0} bytes) que no es el recibido ({1} bytes), no se descodificará + + + Se esperaba un tamaño de CD-Text ({0} bytes) que no es el recibido ({1} bytes), no se descodificará + + + Se esperaba un tamaño de CD TOC ({0} bytes) que no es el recibido ({1} bytes), no se descodificará + + + La Lealtad Contingente Extendida está activada + + + Las Condiciones Extendidas de Energía están soportadas + + + Las Condiciones Extendidas de Energía están soportadas y activada + + + El auto-text extendido toma {0} en completarse + + + El Reporte Extendido de Estado está soportado + + + El Reporte Extendido de Estado está soportado y activado + + + El extent comienza en el PSN {0:X6}h y termina en el PSN {1:X6}h + + + El código de prueba de fábrica 1 está desactivado + + + El código de prueba de fábrica 2 está desactivado + + + El código de prueba de fábrica está desactivado + + + La unidad puede expulsar el medio + + + La unidad puede cargar el medio + + + La unidad puede bloquear el medio + + + La unidad es un intercambiador que usa cartuchos + + + La unidad es un intercambiador de discos individuales + + + La unidad se abre desde arriba + + + La unidad enciende bloqueada + + + La unidad reporta eventos de Clase de Dispositivo Ocupado en la carga/descarga del medio + + + La unidad usa una bandeja + + + La unidad usa un carrito para el medio + + + La unidad usa un mecanismo de carga desconocido tipo {0} + + + Medio extraíble MMC: + + + La unidad puede leer DVD+R DL + + + La unidad es capaz de detectar y reportar medios escribibles defectuosos y comportarse adecuadamente + + + El comportamiento de la reja es normal + + + Fibre Channel + + + Encontrada marca de fichero o genérica + + + Número de fichero: {0} + + + Terminado el sector en {0} + + + Cartucho de firmware insertado + + + Personalidad del firmware: {0} + + + Sub-personalidad del firmware: {0} + + + Las actualizaciones del firmware están permanentemente desactivadas + + + Firmware versión: {0} + + + Firmware versión: {0}.{1} + + + Número de dirección de la primera zona de datos en esta capa: {0} + + + Número de la primera sesión completa: {0} + + + Primer PSN de la Lista de Defectos: 0x{0:X8} + + + Primer PSN del Área de la Unidad: 0x{0:X8} + + + Primer bloque de entrada + + + Primer bloque de salida + + + La primera pista de la última sesión es la pisa {0} + + + Número de la primera pista: {0} ( + + + Número de la primera pista en la primera sesión completa: {0} + + + Número de la primera pista en la último sesión completa: {0} + + + La primera pista del disco es la pista {0} + + + Número de la primera pista de video: {0} + + + FLUSH CACHE EXT está soportado + + + FLUSH CACHE EXT está soportado y activado + + + FLUSH CACHE está soportado + + + FLUSH CACHE está soportado y activado + + + Formateo en progreso. + + + El formateo sólo está usando la certificación parcial + + + Progreso del formateo {0:P} + + + Se requiere la tolerancia de separación de la velocidad del formateo + + + Forma 1. + + + Forma 2. + + + Encontrado tamaño de BCA de Blu-ray incorrecto ({0} bytes) + + + Encontrado tamaño de Estado del Cartucho de Blu-ray incorrecto ({0} bytes) + + + Encontrado tamaño de Información del Disco de Blu-ray incorrecto ({0} bytes) + + + Encontrada firma de DDS incorrecta (0x{0:X4}) + + + Encontrado identificador de tipo de disco desconocido "{0}" + + + Cuarto bloque de entrada + + + El conjunto de funcionalidades de control de caída libre están soportados + + + El conjunto de funcionalidades de control de caída libre están soportados y activados + + + La sensibilidad de caída libre está establecida en {0} + + + Página de Control de Verificación de Fujitsu: + + + El juego requiere el controlador analógico horizontal. + + + El juego requiere el gatillo L analógico. + + + El juego requiere el gatillo R analógico. + + + El juego requiere el controlador analógico vertical. + + + El juego requiere los botones A + B + Start y el D-Pad. + + + El juego requiere el botón C. + + + El juego requiere el botón D. + + + El juego requiere el controlador analógico horizontal extendido. + + + El juego requiere el controlador analógico vertical extendido. + + + El juego requiere los botones de dirección extendidos + + + El juego requiere el botón X. + + + El juego requiere el botón Y. + + + El juego requiere el botón Z. + + + El juego soporta el controlador analógico. + + + El juego soporta el controlador analógico de giro. + + + El juego soporta la pistola. + + + El juego soporta el JoyPad. + + + El juego soporta el teclado. + + + El juego soporta la pistola de luz. + + + El juego soporta el JoyPad de la Master System. + + + El juego soporta la tarjeta de memoria. + + + El juego soporta el micrófono. + + + El juego soporta el ratón. + + + El juego soporta el multitap. + + + El juego soporta otra expansión. + + + El juego soporta el controlador de paleta. + + + El juego soporta la interfaz de impresora. + + + El juego soporta el paquete Puru Puru. + + + El juego soporta la interfaz serie (RS-232C). + + + El juego soporta la interfaz de tableta. + + + El juego soporta la caja VGA. + + + El juego soporta el trackball. + + + El juego soporta la máscara de periféricos desconocida {0:X2} + + + El juego soporta el periférico desconocido {0}. + + + El juego soporta la región desconocida {0}. + + + El juego usa Windows CE. + + + Disco de propósito general para uso en unidades de propósito general + + + Las Anotaciones de Propósito General están soportadas + + + Las Anotaciones de Propósito General están soportadas y activadas + + + No generar sense en excepciones informativas + + + Generar atención de unidad en excepciones informativas + + + Geometría: + + + un óptico de sobreescritura directa + + + ECMA-100 y ANSI X3.137: Cartucho de Disco Flexible de 90 mm usando grabación MFM a 7859 tfprad en ambas caras; 5,3 pistas por mm + + + ECMA-54: Cartucho de Disco Flexible de 200 mm usando grabación de frecuencia dual a 13262 tfprad en una cara + + + ECMA-59 y ANSI X3.121-1984: Cartucho de Disco Flexible de 200 mm usando grabación de frecuencia dual a 13262 tfprad en ambas caras + + + ECMA-66: Cartucho de disco flexible de 130 mm usando grabación de frecuencia dual a 7958 tfprad en una cara + + + ECMA-69: Cartucho de disco flexible de 200 mm usando grabación MFM a 13262 tfprad en ambas caras + + + ECMA-70 y ANSI X3.125-1985: Cartucho de disco flexible de 130 mm usando grabación MFM a 7958 tfprad en ambas caras; 1,9 pistas por mm + + + ECMA-78 y ANSI X3.126-1986: Cartucho de disco flexible de 130 mm usando grabación MFM a 7958 tfprad en ambas caras; 3,8 pistas por mm + + + ECMA-99 y ISO 8630-1985: Cartucho de disco flexible de 130 mm usando grabación MFM a 13262 tfprad en ambas caras; 3,8 pistas por mm + + + un óptico borrable + + + 3,5-pulgadas, 135 ppp, 15916 bits/radián, MFM de doble capa (1,44Mb) + + + un disco Sony Hi-MD + + + un óptico de sólo lectura + + + un óptico combinación de sólo lectura y escritura única + + + 3,5-pulgadas, 135 ppp, 12362 bits/radián, MFM de doble capa (1,25Mb) + + + un óptico de escritura única y lecturas múltiples + + + ANSI X3.73-1980: 200 mm, 6631 tfprad, 1,9 pistas por mm, 1 cara + + + ANSI X3.73-1980: 200 mm, 6631 tfprad, 1,9 pistas por mm, 2 caras + + + ANSI X3.80-1980: 130 mm, 3979 tfprad, 1,9 pistas por mm, 1 cara + + + El objetivo global de anotación está desactivado + + + Obtenidos {0} bytes de separación + + + Dispositivo de artes gráficas pre-prensa (definido en ASC IT8) + + + El grupo {0} ha sido certificado por un usuario + + + El grupo {0} está siendo parcialmente certificado + + + El grupo {0} está siendo formateado + + + El control de funcionalidades de hardware está soportado + + + El control de funcionalidades de hardware está soportado y activado + + + ID del hardware: {0} + + + Cabezas: {0} + + + Cabezas: {0} máx., {1} actualmente + + + Las cabezas aparcan en el cilindro {0} + + + Las cabezas se estabilizan en {0} µs + + + El tiempo de cambio entre cabezas es superior a 15 µs. + + + La cabeza tarda {0} ms en cargarse + + + La cabeza tarda {0} ms en descargarse + + + HI-TC1: Cartucho de cinta magnética de 12,7mm y 24 pistas, 500 bpmm, GCR + + + HI-TC2: Cartucho de cinta magnética de 12,7mm y 24 pistas, 999 bpmm, GCR + + + Dispositivo Hi-MD. + + + Bytes 44 a 45, específicos de Hi-MD + + + Dispositivo de bloques por zonas gestionado por el anfitrión + + + El Área Protegida del Anfitrión está soportada + + + El Área Protegida del Anfitrión está soportada y activada + + + Como deben descargarse las cintas en un ciclo de corriente, incompatibilidad de cinta, descarga de firmware o final de limpieza: + + + Página de modo de recuperación de desastre / emulación de CD de HP: + + + Página de modo de tiempo del dispositivo HP: + + + Página de niveles de revisión ACI de la unidad HP: + + + Página de niveles de revisión del firmware de la unidad HP: + + + Página de niveles de revisión del hardware de la unidad HP: + + + Página de niveles de revisión del ensamblado del cabezal de la unidad HP: + + + Página de niveles de revisión del mecanismo de la unidad HP: + + + Página de niveles de revisión del PCA de la unidad HP: + + + Página de modo de la sustitución de número de series de HP: + + + Página de modo del reinicio extendido de HP: + + + Información específica del fabricante de HP: + + + Borrador ECMA y ANSI X3B5/87-099: Cartucho de cinta magnética de 12,7mm y 18 pistas, 1944 tfpmm, IFM, GCR (IBM 3480, 3490, 3490E) + + + IBM 3490E + + + IBM 3590 + + + IBM 3590E + + + IBM 3590E extendido + + + IBM 3590 extendido + + + IBM ALDC con búfer de 1024 bytes + + + IBM ALDC con búfer de 2048 bytes + + + IBM ALDC con búfer de 512 bytes + + + Página de modo de la configuración del comportamiento de IBM: + + + Página de niveles de revisión de los componentes de la unidad IBM: + + + Página de números de serie dela unidad IBM: + + + IBM IDRC + + + Página de modo LEOT de IBM: + + + Campo específico OEM de IBM: {0} + + + Página de modo de controles específicos del fabricante de IBM: + + + Página de información específica del fabricante de IBM: + + + El identificador pertenece a la unidad lógica direccionada + + + El identificador pertenece a un dispositivo destino que contiene la unidad lógica direccionada + + + El identificador pertenece al puerto de destino + + + El identificado tiene una asociación desconocida con código {0} + + + IDLE IMMEDIATE con UNLOAD FEATURE está soportado + + + IDLE IMMEDIATE con UNLOAD FEATURE está soportado y activado + + + IEEE 1394 + + + IEEE EUI-64: {0} + + + IEEE EUI-64: {0:X2} + + + Si ACA está establecido, el conjunto de comandos de tareas debería resumir al desestablecerse, si no deberían terminar con un CHECK CONDITION + + + Si está establecido, el destino debería reportar condiciones de excepción de anotación + + + Campo ilegal en el CDB + + + Campo ilegal en los parámetros de datos + + + El Acceso Asimétrico Implícito a la Unidad Lógica está activado + + + Respuesta de identificación incompleta + + + Paquete de CD-Text de tipo incorrecto {0}, no se descodificará + + + ECC P incorrecto. + + + ECC Q incorrecto. + + + EDC incorrect. + + + Indicador de longitud incorrecto + + + Contenido del sector incorrecto. + + + Relleno de ceros incorrecto. + + + Potencia Indicativa de Escritura Objetivo: 0x{0:X2} + + + Las excepciones informativas están desactivadas + + + Las excepciones informativas están activadas + + + El reporte de las excepciones informativas no debería afectar el rendimiento de la unidad + + + Las condiciones de excepción informativa se reportarán un máximo de {0} veces + + + La prioridad inicial es {0} + + + Dirección inicial del programa: 0x{0:X8} + + + Punto de entrada inicial del programa: 0x{0:X8} + + + Tamaño de carga inicial del programa: {0} bytes + + + RAM de trabajo inicial del programa: {0} bytes + + + La separación interior tiene {0} bytes + + + El descriptor de INQUIRY contiene: {0} + + + El descriptor de INQUIRY contiene los datos binarios (hexadecimal): {0} + + + El descriptor de INQUIRY contiene el tipo desconocido de datos {1} (hexadecimal): {0} + + + El descriptor de INQUIRY de tipo {2} contiene el tipo desconocido de datos {1} (hexadecimal): {0} + + + El cartucho insertado es LTO + + + Internet SCSI + + + La separación entre bloques es {0} veces el tamaño definido por el dispositivo + + + La separación entre bloques es suficientemente larga para soportar la actualización in-situ + + + La separación entre bloques tiene un valor desconocido {0} + + + Modo 3 inválido + + + Campo de propósito inválido con valor {0} + + + tamaño inválido + + + Valor inválido en el bit {0} del campo {1} del CDB + + + Valor inválido en el campo {0} del CDB + + + La entrega de datos por orden está soportada + + + La entrega de datos por orden está soportada y activada + + + IORDY está soportado + + + IORDY está soportado y puede ser desactivado + + + Tamaño ISA0: {0} + + + Tamaño ISA1: {0} + + + ISO/IEC 10090: Disco óptico de 86 mm de lectura/escritura y una cara con 12500 pistas + + + ISO/IEC 13614: Disco óptico de 300 mm y doble caras + + + NTSC (Japonés) + + + kilobytes + + + El multiplicador máximo de la unidad larga es {0}. + + + El tamaño de la unidad larga es {0} MiB + + + El último bloque lógico direccionable es {0} + + + Número de unidad de la última dirección de la zona de datos de esta capa: {0} + + + Número de la última sesión completa: {0} + + + Los últimos datos leídos estaban comprimidos con + + + Los últimos datos leídos estaban descomprimidos + + + El último error de seguridad extendida fue {0} + + + La última dirección posible para el Lead-Out es {0} (como LBA) o {1:X2}:{2:X2}:{3:X2} + + + La última sesión está completa + + + La última sesión está dañada + + + La última sesión está vacía + + + La última sesión está incompleta + + + La dirección del Lead-In de la última sesión es {0} (como LBA) o {1:X2}:{2:X2}:{3:X2} + + + La última pista en la última sesión es la pista {0} + + + Número de la última pista: {0} ( + + + Número de la última pista en la última sesión completa: {0} + + + LSN 0 del último área de datos de usuario: 0x{0:X8} + + + Último PSN de datos de usuari para el disco: {0} + + + Número de la última pista de video: {0} + + + Dirección del último bloque ECC escribible: 0x{0:X6} + + + El último comando WRITE MULTIPLE programó {0} sectores correctamente + + + Las capas están en el camino de pista opuesto + + + Las capas están en el camino de pista paralelo + + + La capa {0} es de tipo Blu-ray + + + La capa {0} es de tipo CD + + + La capa {0} es de tipo DVD + + + La capa {0} es de tipo HD DVD + + + La capa {0} es de tipo desconocido 0x{1:X4} + + + La capa 0 termina en el PSN {0:X}h + + + El extent de LBA {0} comienza en el LBA {1} y dura {2} sectores + + + El Lead-In está pre-grabado + + + El Lead-Out es de tipo audio + + + El Lead-Out es de tipo datos + + + El Lead-Out está pre-grabado + + + Posición de comienzo del Lead-Out: {0:D2}:{1:D2}:{2:D2} + + + Posición de comienzo del Lead-Out: {3:D2}:{0:D2}:{1:D2}:{2:D2} + + + Valor antiguo: 0x{0:X2} + + + La interfaz de la librería emite un bit de parada por byte + + + La interfaz de la librería emite dos bits de parada por byte + + + La interfaz de la libreria operará a 115200 baudios en el siguiente reinicio + + + La interfaz de la libreria operará a 19200 baudios en el siguiente reinicio + + + La interfaz de la libreria operará a 38400 baudios en el siguiente reinicio + + + La interfaz de la libreria operará a 57600 baudios en el siguiente reinicio + + + La interfaz de la libreria operará a 9600 baudios en el siguiente reinicio + + + La librería está presente + + + La hora de la librería es {0} + + + Bloque vínculo + + + La ETIQUETA DE APLICACIÓN DEL BLOQUE LÓGICO no debe ser modificada + + + El reporte de errores de provisionado de bloques lógicos está activado + + + Tamaño del sector lógico: {0} bytes + + + El sector lógico comienza en la posición {0} del sector físico + + + Identificador del grupo de unidad lógica: {0} + + + La unidad lógica soporta protección de bloques lógicos + + + La unidad lógica soporta los tipos de protección 1, 2 y 3 + + + La unidad lógica soporta los tipos de protección 1 y 2 + + + La unidad lógica soporta los tipos de protección 1 y 3 + + + La unidad lógica soporta los tipos de protección 2 y 3 + + + La unidad lógica soporta el tipo de protección 1 + + + La unidad lógica soporta el tipo de protección 2 + + + La unidad lógica soporta el tipo de protección 3 + + + La unidad lógica soporta un tipo de protección desconocido definido por el código {0} + + + La configuración del alineamiento físico largo es {0} + + + La lectura adelantada está soportada + + + La lectura adelantada está soportada y activada + + + El LSN 0 está en el PSN {0:X}h + + + LTO Ultrium-2 en modo de emulación de CD + + + LTO Ultrium-3 en modo de emulación de CD + + + LTO Ultrium-4 en modo de emulación de CD + + + LTO Ultrium-5 en modo de emulación de CD + + + LTO en modo de emulación de CD-ROM + + + LTO Ultrium-2 o T9840 + + + LTO Ultrium-3 o T9940 + + + LTO Ultrium-4 o T9840D + + + LTO Ultrium o Super AIT-1 + + + Insertado cartucho LTO Ultrium 1 Tipo A + + + Insertado cartucho LTO Ultrium 1 Tipo B + + + Insertado cartucho LTO Ultrium 1 Tipo C + + + Insertado cartucho LTO Ultrium 1 Tipo D + + + Insertado cartucho LTO Ultrium 2 + + + Insertado cartucho de limpieza LTO Ultrium + + + La LUN debe desactivar la condición de atención de unidad reportada en el mismo nexo + + + La LUN no debe desactivar la condición de atención de unidad reportada en el mismo nexo + + + La LUN no debe desactivar la condición de atención de unidad reportada en el mismo nexo y debe establecer una condición de atención de unidad para el iniciador + + + Mammoth-2 + + + Fabricante: {0} + + + Tupa de Identificación del Fabricante PCMCIA: + + + ID del fabricante: {0} + + + Número de serie de fabricación: {0} + + + Código de revisión de la contraseña maestra: {0} + + + Tipo de material: 0x{0:X2} + + + Máximo {0} entradas de información de mezcla de extents + + + Revisión ATA soportada máxima: + + + El tamaño de datos de sense máximo sería de {0} bytes + + + Comienzo máximo del Lead-Out más externo del área grabable del disco: {0:D2}:{1:D2}:{2:D2} + + + Comienzo máximo del Lead-Out más externo del área grabable del disco: {3:D2}:{0:D2}:{1:D2}:{2:D2} + + + El tiempo de espera máximo para cambiar el comando cuando se establece un valor en el campo de códigos del modo de operación es {0:D2}ms + + + El tiempo de espera máximo para cambiar el comando cuando se establece un valor en el campo de códigos del modo de operación es {0:D2}s + + + El tiempo de espera máximo para cambiar el comando cuando se establece un valor en el campo de códigos del modo de operación es {0:D2}µs + + + La ID máxima de contexto es {0}. + + + MBit/s + + + MD5 del identificador de la unidad lógica: {0} + + + MD5 del identificador de la unidad lógica: {0:X2} + + + El atributo del medio es {0} + + + El formateo del medio en segundo plano ha terminado + + + El set de comandos de tarjetas de memoria está soportado + + + El set de comandos de tarjetas de memoria está soportado y activado + + + El medio ha sido extraído, o insertado en, el cartucho + + + El medio tiene el bit de salida marcado, no debería + + + El medio tiene el bit de protección contra escritura marcado, no debería + + + ID del medio: + + + El medio está siendo formateado actualmente en segundo plano + + + El medio está insertado en un cartucho + + + El medio no está en un cartucho + + + El medio está protegido contra escritura + + + Versión del firmware del cargador de medios: {0} + + + Versión del hardware del cargador de medios: {0} + + + El cargador de medios está presente + + + Versión de la mecánica del cargador de medios: {0} + + + El número de serie del medio está soportado + + + El número de serie del medio está soportado y es válido + + + La superficie del medio activa la protección contra escritura + + + El medio estaba siendo formateado en segundo plano pero ha sido parado y está incompleto + + + Compact Disc Digital Audio de 120 mm + + + Compact Disc Digital Audio de 80mm + + + CD-R de 120 mm con sólo datos + + + CD-R de 120 mm + + + CD-R de 80 mm + + + CD-RW de 120 mm con sólo datos + + + CD-RW de 80 mm con sólo datos + + + CD-RW de 120 mm con sólo audio + + + CD-RW de 80 mm con sólo audio + + + CD-RW de 120 mm con datos y audio + + + CD-RW de 80 mm con datos y audio + + + CD-R de 80 mm con sólo datos + + + CD-R de 120 mm con sólo audio + + + CD-R de 80 mm con sólo audio + + + CD-R de 120 mm con datos y audio + + + Disco HD de 120 mm + + + Disco HD de 80mm + + + Disco híbrido (Photo CD) de 120 mm + + + Disco CD-R híbrido (Photo CD) de 120 mm + + + Disco CD-RW híbrido (Photo CD) de 120 mm + + + Disco CD-RW híbrido (Photo CD) de 80 mm + + + Disco CD-R híbrido (Photo CD) cd 80 mm + + + Disco Compacto de 120 mm con datos y audio + + + Disco Compacto de 80 mm con datos y audio + + + CD-R de tamaño desconocido + + + CD-RW de tamaño desconocido + + + Disco HD de tamaño desconocido + + + CompactTape I, Exatape 28m, CompactTape II, VXA-2 o VXA-3 + + + DAT-72 + + + DC-2900SL + + + DC-9200 o DDS-4 + + + Cartucho de limpieza DDS + + + DLTtape S4 + + + Exatape 106m, DLTtape IV o Travan 5 + + + Exatape 160m XL o Super DLTtape I + + + Exatape 112m + + + Exatape 125m + + + Exatape 150m + + + Exatape 15m, IBM MagStar o VXA + + + Exatape 170m + + + Exatape 225m + + + Exatape 22m + + + Exatape 22m AME + + + Exatape 40m + + + Exatape 45m + + + Exatape 54m o DLTtape III + + + Exatape 75m + + + Exatape 76m + + + Exatape 80m o DLTtape IIIxt + + + LTO Ultrium + + + LTO Ultrium-2 + + + LTO Ultrium-3 + + + LTO Ultrium-3 WORM + + + LTO Ultrium-4 + + + LTO Ultrium-4 WORM + + + LTO Ultrium-5 + + + LTO Ultrium-5 WORM + + + LTO Ultrium-6 + + + LTO Ultrium-6 WORM + + + LTO Ultrium-7 + + + LTO Ultrium-7 WORM + + + LTO Ultrium WORM o cartucho de limpieza + + + MLR1-26GB o DDS-3 + + + Super DLTtape II + + + SLR-32 + + + SLR-32SL + + + SLR-40, SLR-60 o SLR-100 + + + SLR-5 + + + SLR-5SL + + + SLRtape-100 + + + SLRtape-140 + + + SLRtape-24 + + + SLRtape-24 SL + + + SLRtape-40 + + + SLRtape-50 + + + SLRtape-50 SL + + + SLRtape-60 o SLRtape-75 + + + SLRtape-7 + + + SLRtape-7 SL + + + Cinta de 6,3mm con 12 pistas a 394 tfpmm o DC-9250 + + + Cinta de 6,3mm con 24 pistas a 394 tfpmm o MLR1-26GBSL + + + Travan 7 + + + sin definir + + + VStape I + + + Dispositivo de intercambio de medios + + + Descripción del medio: {0} + + + El medio tiene una longitud nominal de {0} m en una cinta de {1} mm de ancho + + + El medio ha definido {0} particiones + + + El medio es + + + El medio es {0} + + + El medio está protegido contra escritura + + + El medio rota a {0} rpm + + + El medio soporta IDs de bloques + + + El medio soporta los siguientes códigos de densidad: + + + Tipo de medio "{0}" definido por "{1}". + + + Código de tipo de medio: {0:X2}h + + + megabytes + + + El tamaño mínimo de solicitud es {0} + + + Versión menor de ATA no especificada + + + MLR1-26GB + + + MLR1-26GBSL + + + MMC Lectura de Blu-ray + + + MMC Escritura de Blu-ray + + + MMC Lectura de CD + + + MMC Funcionalidad base: + + + MMC Lectura de DVD + + + MMC Intercambiador integrado: + + + MMC Función de reporte mejorado de defectos: + + + MMC Formateable: + + + MMC Gestión de defectos por hardware: + + + MMC Escribible por transmisión incremental: + + + MMC Grabación de salto de capa: + + + MMC Morfismo: + + + MMC Lectura aleatoria + + + MMC Escritura aleatoria: + + + MMC Transmisión en tiempo real: + + + MMC Sobreescritura rígidamente restringida + + + MMC perfiles soportados: + + + MMC Escritura única + + + MMC Protección contra escritura: + + + Modo 0. + + + Modo 1. + + + Modo 2. + + + Revisión del módulo: {0} + + + Momento de inercia: 0x{0:X2} + + + El MRW está corrupto + + + Registro de Identificación del Dispositivo MultiMediaCard: + + + Registro de Datos Específicos del Dispositivo MultiMediaCard: + + + Registro de Datos Específicos Extendidos del Dispositivo MultiMediaCard: + + + Registro de Condiciones de Operación MultiMediaCard: + + + Dispositivo multi-puerto + + + DMA multi-palabra: + + + silenciado + + + NAA: {0} + + + NAA: {0:X2} + + + El auto-sense de NCQ está soportado + + + NCQ está soportado + + + La prioridad NCQ está soportada + + + La gestión de cola NCQ está soportada + + + La transmisión NCQ está soportada + + + Nunca aplicar la operación de verificación + + + El primer sector del siguiente Border-In es el PSN {0:X}h + + + Caché no volátil: + + + La caché no volátil es de {0} bytes + + + La caché no volátil está desactivada + + + La compensación no-cero del búfer está soportada + + + La compensación no-cero del búfer está soportada y activada + + + NOP está soportado + + + NOP está soportado y activado + + + Comportamiento de reinicio normal + + + NTSC (Norteamérica). + + + No todos los comandos de 28-bits están soportados. + + + Sin información adicional. + + + No se reportará un error retrasado a un comando de rebobinado + + + No hay disco insertado, bandeja cerrada o carrito insertado + + + No hay configuración de región de la unidad. + + + No hay texto de información del fabricante. + + + No se realizará una pre-lectura. + + + No hay texto de nombre del producto. + + + No se reportará la condición de excepción informativa + + + no específico + + + No habrá atención de unidad en la liberación + + + El número y tamaño de las particiones se pueden definir manualmente + + + El número de las particiones puede ser definido pero su tamaño lo definirá el dispositivo + + + Número de punteros de intervalos de salto: {0} + + + Número de punteros de saltos de pista: {0} + + + Dispositivo de almacenamiento basado en objetos + + + Sólo se está formateando un grupo + + + Sólo se reportará la condición de excepción informativa bajo demanda + + + Sólo se usarán el CIRC y los reintentos. + + + Sólo se usarán los reintentos. + + + En el bloque lógico {0} + + + Al insertar un medio, se cargará sólo para acceso a la memoria auxiliar + + + Al insertar un medio, se cargará para acceso completo + + + Al insertar un medio, no se cargará + + + Al leer un bloque actualizado la unidad devolverá RECOVERED ERROR + + + En el segmento {0} + + + Valores de OPC para {0}Kbit/seg.: {1}, {2}, {3}, {4}, {5}, {6} + + + El soporte de sistemas operativos es el estándar LTO + + + El soporte de sistemas operativos es el código desconocido {0} + + + Dispositivo de tarjeta óptica de lectura/escritura + + + Dispositivo de memoria óptica + + + El tamaño óptimo de lectura es de {0} KiB + + + El tamaño óptimo de recorte es de {0} KiB + + + El tamaño óptimo de escritura es de {0} KiB + + + Potencia óptica de grabado: 0x{0:X2} + + + Tamaño OSA: {0} + + + El puerto de salida 0 tiene canales + + + El puerto de salida 1 tiene canales + + + El puerto de salida 2 tiene canales + + + El puerto de salida 3 tiene canales + + + Título extranjero: {0} + + + OVERWRITE EXT está soportado + + + PACKET está soportado + + + PACKET está soportado y activado + + + El comportamiento de reja de pánico está activado + + + Dispositivo ATA paralelo: + + + SCSI paralelo + + + Los parámetros se puede guardar + + + Las particiones se definen en bytes + + + Las particiones se definen en kilobytes + + + Las particiones se definen en megabytes + + + Las particiones se definen en unidades de {0} bytes + + + Las particiones están fijadas en las definiciones del dispositivo + + + La partición {0} mide {1} {2} + + + La partición {0} mide {1} unidades + + + La partición {0} continúa el resto del medio + + + Alineación de partición: {0} bytes + + + Los parámetros de partición no se aplicarán hasta que se reciba un comando FORMAT MEDIUM + + + Parte versión {0} + + + PCI Express + + + Tuplas de Geometría del Dispositivo PCMCIA: + + + Tupla de Información del Producto / Versión Nivel 1 PCMCIA: + + + El rendimiento está limitado usando el factor {0} + + + El rendimiento no está limitado + + + Periféricos: + + + La protección contra escritura permanente está desactivada. + + + La protección contra escritura permanente de las áreas de arranque está desactivada. + + + La protección contra escritura permanente se aplicará al grupo seleccionado. + + + La protección contra escritura permanente está activada. + + + La protección contra escritura persistente está activada. + + + El PFI de la zona borde extra comienza en el PSN {0:X}h + + + Tamaño del sector físico: {0} bytes + + + Los contadores de eventos PHY están soportados + + + El pin 1 indica reinicio de cambio de disco cuando está activo alto + + + El pin 1 indica reinicio de cambio de disco cuando está activo bajo + + + El pin 1 indica función desconocida {0} cuando está activo alto + + + El pin 1 indica función desconocida {0} cuando está activo bajo + + + El pin 1 está desconectado + + + El pin 2 indica función desconocida {0} cuando está activo alto + + + El pin 2 indica función desconocida {0} cuando está activo bajo + + + El pin 34 indica función desconocida {0} cuando está activo alto + + + El pin 1 indica función desconocida {0} cuando está activo alto + + + El pin 34 indica función desconocida {0} cuando está activo bajo + + + El pin 1 indica función desconocida {0} cuando está activo bajo + + + El pin 2 está desconectado + + + El pin 34 indica que el disco ha cambiado cuando está activo alto + + + El pin 34 indica que el disco ha cambiado cuando está activo bajo + + + El pin 34 indica que la unidad está lista cuando está activo alto + + + El pin 34 indica que la unidad está lista cuando está activo bajo + + + El pin 34 está desconectado + + + El pin 4 indica que la unidad está en uso cuando está activo alto + + + El pin 4 indica que la unidad está en uso cuando está activo bajo + + + El pin 4 indica expulsión cuando está activo alto + + + El pin 4 indica expulsión cuando está activo bajo + + + El pin 4 indica carga de la cabeza cuando está activo alto + + + El pin 4 indica carga de la cabeza cuando está activo bajo + + + El pin 4 está desconectado + + + Modo de reloj PIO: {0} + + + La pendiente de pista es 0,147 µm/bit + + + La pendiente de pista es 0,153 µm/bit + + + La pendiente de pista es 0,267 µm/bit + + + La pendiente de pista es 0,353 µm/bit + + + La pendiente de pista está entre 0,130 µm/bit y 0.140 µm/bit + + + La pendiente de pista está entre 0,140 µm/bit y 0.148 µm/bit + + + La pendiente de pista está entre 0,409 µm/bit y 0.435 µm/bit + + + Dispositivo POP + + + El enlace del puerto A está caído + + + El puerto A usa una interfaz SCSI paralela Ultra-160 + + + Posición {0:X2}:{1:X2}:{2:X2} (LBA {3}) + + + La protección contra escritura en el ciclo de energía está desactivada. + + + La protección contra escritura de las áreas de arranque en el ciclo de energía está desactivada. + + + La protección contra escritura se aplicará al grupo seleccionado en el ciclo de energía. + + + La gestión de energía está soportada + + + La gestión de energía está soportada y activada + + + El conjunto de funcionalidades del modo de energía está soportado + + + El conjunto de funcionalidades del modo de energía está soportado y activado + + + El auto-test en el encendido está desactivado + + + El auto-test en el encendido está activado + + + El encendido en esperá está soportado + + + El encendido en esperá está soportado y activado + + + La pre-lectura puede seguir a través de descontinuidades (como cilindros o pistas) + + + La pre-lectura deberá abortarse al recibir un nuevo comando + + + Los valores de pre-lectura indican un multiplicador de bloque + + + La pre-lectura se hará para los comandos READ de {0} bloques o menos + + + Código primaro: {0:X2}h + + + El área de reemplazo primaria comienza en el PSN {0:X}h y termina en el PSN {1:X}h, inclusivos + + + Dispositivo de impresión + + + Dispositivo procesador + + + Productor: {0} + + + Código de producto: {0} + + + CRC de producto: 0x{0:X8} + + + Familia de producto: {0} + + + La familia del producto es 10,0/20,0 GB + + + La familia del producto es 15,0/30,0 GB + + + La familia del producto es 20,0/40,0 GB + + + La familia del producto es 2,6 GB + + + La familia del producto es 6,0 GB + + + La familia del producto no está especificada + + + Nombre del producto: {0} + + + Revisión del producto: {0:X2}.{1:X2} + + + Número de serie del producto: {0} + + + Versión del producto: {0} + + + Perfil {0}: {1} + + + Prólogo encontrado en {0} + + + La comprobación de información del protector está desactivada + + + Descriptor específico del protocolo (ATA/ATAPI) con formato desconocido (hexadecimal): {0} + + + Descriptor específico del protocolo (Interfaz de Transporte de Automatización/Unidad) con formato desconocido (hexadecimal): {0} + + + Descriptor específico del protocolo (Fibre Channel) con formato desconocido (hexadecimal): {0} + + + Descriptor específico del protocolo (IEEE 1394) con formato desconocido (hexadecimal): {0} + + + Descriptor específico del protocolo (Internet SCSI) con formato desconocido (hexadecimal): {0} + + + Descriptor específico del protocolo (SCSI paralelo) con formato desconocido (hexadecimal): {0} + + + Descriptor específico del protocolo (PCI Express) con formato desconocido (hexadecimal): {0} + + + Descriptor específico del protocolo (SCSIe) con formato desconocido (hexadecimal): {0} + + + Descriptor específico del protocolo (Acceso Directo a Memoria Remota SCSI) con formato desconocido (hexadecimal): {0} + + + Descriptor específico del protocolo (SCSI de conexión en serie) con formato desconocido (hexadecimal): {0} + + + Descriptor específico del protocolo (SSA) con formato desconocido (hexadecimal): {0} + + + Descriptor específico del protocolo (UAS): Dirección USB {0} interfaz {1} + + + Descriptor específico del protocolo (código desconocido {0}) con formato desconocido (hexadecimal): {1} + + + Descriptor específico del protocolo (desconocido) con formato desconocido (hexadecimal): {0} + + + PSN del LSN 0 del área de datos de usuario: 0x{0:X8} + + + QIC-11 + + + QIC-120: Cartucho de cinta magnética de 6,3 mm y 15 pistas, 394 bpmm, GCR + + + QIC-1350: Cartucho de cinta magnética de 6,3 mm y 30 pistas, 2034 bmpp, RLL + + + QIC-150: Cartucho de cinta magnética de 6,3 mm y 18 pistas, 394 bpmm, GCR + + + QIC-320: Cartucho de cinta magnética de 6,3mm y 26 pistas, 630 bpmm, GCR + + + Pista de audio cuadrafónico con pre-énfasis de 50/15 µs + + + Pista de audio cuadrafónico sin pre-énfasis + + + Checksum de la EEPROM del firmware: 0x{0:X4} + + + Página de información de versión del firmware de Quantum: + + + Fecha de versión del firmware de lectura/escritura: {0} + + + Checksum del firmware de lectura/escritura: 0x{0:X8} + + + Checksum del firmware del servo: 0x{0:X4} + + + Información específica del fabricante de Quantum: + + + Subcanal Q modo {0} + + + Subcanal Q sin modo + + + El subcanal Q contiene la posición actual + + + El subcanal Q contiene el ISRC + + + El subcanal Q contiene el número de catálogo del medio + + + El subcanal Q contiene el puntero a pista + + + El subcanal Q contiene el puntero a pista de video + + + La lectura después de TRIM es determinista + + + La lectura después de TRIM devuelve datos vacíos + + + La lectura adelantada está desactivada + + + Bloque de lectura: {0} bytes + + + La logitud del bloque de lectura es {0} bytes + + + El tamaño del bloque de lectura está definido en el CSD extendido + + + READ BUFFER DMA está soportado + + + READ BUFFER está soportado + + + READ BUFFER está soportado y activado + + + El búfer de lectura debe tener un ratio de vacío de {0} antes de leer más datos del medio + + + La caché de lectura está activada + + + Los comandos de lectura puede cruzar los límites de los bloques físicos + + + READ DMA QUEUED y WRITE DMA QUEUED están soportados + + + READ DMA QUEUED y WRITE DMA QUEUED están soportados y activados + + + READ LOG DMA EXT está soportado + + + Dispositivo de bloques de sólo lectura + + + Dispositivo de bloques de lectura/escritura + + + READ/WRITE DMA EXT GPL está soportado + + + READ/WRITE DMA EXT GPL está soportado y activado + + + READ/WRITE LONG tiene {0} bytes extra + + + Bloque en tiempo real. + + + La recepción de solicitudes de gestión de energía iniciadas por el anfritrión están soportadas + + + RECEIVE FPDMA QUEUED y SEND FPDMA QUEUED están soportados + + + El ratio recomendado de energía de borrado es {0} ε + + + La energía de grabación recomendada es de {0} mW + + + Las marcas grabadas tienen una reflectividad superior que las no grabadas (disco LTH). + + + Las marcas grabadas tienen una reflectividad inferior que las no grabadas (disco HTL). + + + La potencia de grabación no está especificada + + + Los datos recuperados del búfer llegan en orden FIFO + + + Los datos recuperados del búfer llegan en orden LIFO + + + Se reportarán los errores corregidos. + + + Se reportarán los errores corregidos y se abortará con CHECK CONDITION. + + + No se reportarán los errores corregidos. + + + La velocidad de referencia es 2x + + + La velocidad de referencia es 4x + + + La velocidad de referencia es 8x + + + La velocidad de referencia establecida es desconocida: {0} + + + La velocidad de referencia es 3,49 m/s + + + Regiones soportadas: + + + Registro versión 1.0 + + + Registro versión 1.1 + + + Registro versión 1.2 + + + Registro versión 2.0 + + + La versión del registró está especificada en el Registro de Datos Extendidos Específicos del Dispositivo + + + Identificador relativo de puerto objetivo: {0} + + + Fecha de salida: {0} + + + Versión del firmware: {0} + + + La liberación está soportada + + + La liberación está soportada y activada + + + Dispositivo extraíble + + + El conjunto de funcionalidades de medios extraíbles está soportado + + + El conjunto de funcionalidades de medios extraíbles está soportado y activado + + + El conjunto de funcionalidades de notificación del estado del medio extraíble está soportado + + + La notificación del estado del medio extraíble está soportada + + + La notificación del estado del medio extraíble está soportada y activada + + + Número de serie reportado: {0} + + + La excepción reportada en la compresión es {0} + + + Reservado1 = 0x{0:X2} + + + Reservado2 = 0x{0:X2} + + + Reservado3 = 0x{0:X8} + + + Reservado4 = 0x{0:X8} + + + Reservado5 = 0x{0:X8} + + + Reservado6 = 0x{0:X8} + + + Reservado7 = 0x{0:X8} + + + Reservado4 = 0x{0:X16} + + + Reservado7 = 0x{0:X2} + + + Reservado8 = 0x{0:X2} + + + Reservado9 = 0x{0:X8} + + + Reservado3 = 0x{0:X2} + + + Reservado4 = 0x{0:X2} + + + Reservado5 = 0x{0:X2} + + + Reservado6 = 0x{0:X2} + + + El modo {0} reservado de auto-carga está establecido + + + Bytes reservados 74 a 95 + + + Byte reservado 56, bits 7 a 4 = 0x{0:X2} + + + Byte reservado 57 = 0x{0:X2} + + + Byte reservado 5, bits 2 a 1 = 0x{0:X2} + + + Valor reservado {0} de control de desconexión de la transferencia de datos + + + Reservado = 0x{0:X2} + + + Valores reservados 0x{0:X2} establecidos + + + El valor reservado 2 para QErr está establecido + + + El valor reservado 1 para UA_INTLCK_CTRL está establecido + + + El valor reservado 0x02 se ha encontrado en el campo de reloj de SPI + + + Valor reservado establecido en el calificador de periférico + + + Modificador de respuesta: {0} + + + Valor de respuesta: 0x{0:X8} + + + La tolerancia a la velocidad de rotación es superior al 0,5% + + + El fechado puede inicializerse por métodos externos a los estándares SCSI, pero SET TIMESTAMP deberá tener preferencia sobre ellos + + + Valor S4: 0x{0:X6} + + + SANITIZE ANTIFREEZE LOCK EXT está soportado + + + Los comandos de sanitización están especificados por ACS-2 + + + Los comandos de sanitización están especificados por ACS-3 o superior + + + El conjunto de funciones de sanitización están soportados + + + SATA 1,5Gb/s está soportado + + + SATA 3,0Gb/s está soportado + + + SATA 6,0Gb/s está soportado + + + Dispositivo SATA Express + + + Dispositivo escáner + + + Página SCSI de control en segundo plano: + + + Página SCSI de modo de caché: + + + Página SCSI de parámetros de control de audio del CD-ROM: + + + Página SCSI de capacidades de CD-ROM: + + + Página SCSI de parámetros de CD-ROM: + + + Página SCSI de extensión de control: + + + Página SCSI de modo de control: + + + Página SCSI de compresión de datos: + + + Página SCSI de configuración del dispositivo: + + + Página SCSI de identificación del dispositivo + + + Página SCSI del modo de Desconexión-Reconexión: + + + Pagína SCSI del modo de operación de la unidad: + + + Página SCSI de datos extendidos de INQUIRY: + + + Página SCSI de disco flexible: + + + Página SCSI de formato del dispositivo: + + + Pagína SCSI de definiciones de operación implementadas: + + + Página SCSI de control de excepciones informativas: + + + Página SCSI de direcciones de red de gestión: + + + Página SCSI del modo de configuración del medio: + + + Página SCSI de partición del medio: + + + Página SCSI de partición del medio (extra): + + + Página SCSI de tipos de medio soportados: + + + Cabecera del MODE SENSE SCSI: + + + Identificador de nombre SCSI: {0} + + + Identificador de nombre SCSI (hexadecimal): {0} + + + Memoria óptica SCSI: + + + SCSI sobre PCI Express + + + El puerto SCSI está desactivado + + + El puerto SCSI está activado + + + El puerto SCSI se desactivará en el siguiente encendido + + + El puerto SCSI se activará en el siguiente encendido + + + Página SCSI de consumo energético: + + + Página SCSI de recuperación de errores de lectura para dispositivos MultiMedia: + + + Página SCSI de recuperación de errores de lectura/escritura: + + + Acces Directo a Memoria Remota SCSI + + + Página SCSI de capacidades de acceso a bloques extraíbles + + + Página SCSI de geometría del disco rígido: + + + SCSI SENSE: {0} + + + Capacidades del dispositivo SCSI de acceso secuencial: + + + Identificadores de la interfaz software SCSI: + + + Página SCSI de temporizador y protección: + + + Datos de la capa de traducción SCSI a ATA: + + + El comando UNLOAD no expulsará el cartucho + + + Página SCSI de verificación de recuperación de errores: + + + Página SCSI de verificación de recuperación de errores para dispositivos MultiMedia: + + + Página SCSI del modo de control XOR: + + + Las tablas de datos SCT están soportadas + + + El control de recuperación de errores SCT está soportado + + + Las funciones de control SCT están soportadas + + + Las direcciones largas de sector SCT están soportadas + + + La misma escritura SCT está soportada + + + Super DLTtape I + + + Super DLTtape I comprimida + + + Super DLTtape 1 a 133000 bpp + + + Página de números del firmware de Seagate: + + + Página de información específica del fabricante de Seagate: + + + Código secundario: {0:X2}h + + + Segundo bloque de entrada + + + Segundo bloque de salida + + + Sectores direccionables en modo CHS: {0} + + + Sectores direccionables en modo CHS: {0} máx, {1} actualmente + + + Sectores por pista: {0} + + + Sectores por pista: {0} máx., {1} actualmente + + + Los sectores empiezan por 1 + + + Sector {0} + + + Las direcciones de sectores incrementan progresivamente en un cilindro antes de pasar al siguiente + + + Las direcciones de sectores incrementan progresivamente en una superficia antes de pasar a la siguiente + + + Registro de Configuración del Dispositivo SecureDigital: + + + Registro de Identificación del Dispositivo SecureDigital: + + + Registro de Datos Específicos del Dispositivo SecureDigital: + + + Registro de Condiciones de Operación de SecureDigital: + + + Seguridad: + + + El contador de seguridad ha expirado + + + El contador de seguridad no ha expirado + + + La seguridad está activada + + + La seguridad está congelada + + + La seguridad está bloqueada + + + La seguridad no está activada + + + La seguridad no está congelada + + + La seguridad no está bloqueada + + + El nivel de seguridad es alto + + + El nivel de seguridad es máximo + + + Dispositivo Gestor de Segurdad + + + El modo de seguridad está soportado + + + El modo de seguridad está soportado y activado + + + INFORMACIÓN DEL IP.BIN DE SEGA: + + + La funcionalidad segmentada en DOWNLOAD MICROCODE está soportada + + + La funcionalidad segmentada en DOWNLOAD MICROCODE está soportada y activada + + + La fuerza seleccionada del controlador es de tipo {0}. + + + En el bloque lógico {0} + + + Dispositivo de acceso secuencial + + + Dispositivo ATA en serie: + + + SCSI de Conexión en Serie + + + Número de serie: {0} + + + El número de serie no es el valor por defecto del fabricante + + + El número de serie es el valor por defecto del fabricante + + + La interrupción de SERVICE está soportada + + + La interrupción de SERVICE está soportada y activada + + + Versión del firmware del servo: {0} + + + Sesión {0} + + + SET FEATURES es requerido antes del inicio + + + La extensión de seguridad a SET MAX está soportada + + + La extensión de seguridad a SET MAX está soportada y activada + + + SET PASSWORD DMA y SET UNLOCK DMA están soportados + + + Dispositivo simplificado de acceso directo + + + DMA de palabra única: + + + La asignación {0} del intervalo de tiempo de omisión dice que desde {1:D2}:{2:D2}:{3:D2} hasta {4:D2}:{5:D2}:{6:D2} deben ser omitidos + + + La asignación {0} del intervalo de tiempo de omisión dice que desde {4}:{1:D2}:{2:D2}:{3:D2} hasta {8}:{5:D2}:{6:D2}:{7:D2} deben ser omitidos + + + Omitir pista {0} + + + La asignación de omisión de pista {0} dice que la pista {1} debe omitirse + + + SLR-32 SL + + + SLR40, SLR60 o SLR100 + + + SLR-5 SL + + + En transporte de comandos S.M.A.R.T. está soportado + + + Transporte de comandos S.M.A.R.T. (SCT): + + + El registro de errores de S.M.A.R.T. está soportado + + + El registro de errores de S.M.A.R.T. está soportado y activado + + + S.M.A.R.T. está soportado + + + S.M.A.R.T. está soportado y activado + + + La auto-prueba S.M.A.R.T. está soportada + + + La auto-prueba S.M.A.R.T. está soportada y activado + + + La conversación de los ajustes de software está soportada + + + La conversación de los ajustes de software está soportada y activada + + + La protección contra escritura está activada hasta el siguiente apagado + + + La protección contra escritura está activada + + + La protección contra escritura está activada + + + Valores completos del área de reserva: 0x{0:X2} + + + Encontrado tamaño incorrecto de la información sobre el área de reserva de Blu-ray ({0} bytes) + + + El control del motor giratorio está implementado + + + La sincronización del motor giratorio está desactivada o no está soportada + + + SSA + + + Los valores del tiempo de reposo son estándar + + + Comienzo del posible siguiente programa en el área grabable del disco: {0:D2}:{1:D2}:{2:D2} + + + Comienzo del posible siguiente programa en el área grabable del disco: {3:D2}:{0:D2}:{1:D2}:{2:D2} + + + Posición de comienzo de la parte exterior del área del Lead-In: {0:D2}:{1:D2}:{2:D2} + + + Posición de comienzo de la parte exterior del área del Lead-In: {3:D2}:{0:D2}:{1:D2}:{2:D2} + + + Tiempo de comienzo del intervalo que se debe omitir: {0:D2}:{1:D2}:{2:D2} + + + Tiempo de comienzo del primer área de Lead-In del disco: {0:D2}:{1:D2}:{2:D2} + + + Tiempo de comienzo del primer área de Lead-In del disco: {3:D2}:{0:D2}:{1:D2}:{2:D2} + + + Pista de audio estéreo con un pre-énfasis de 50/15 µs + + + Pista de audio estéreo sin pre-énfasis + + + Posición de parada de la parte interna del área del Lead-Out: {0:D2}:{1:D2}:{2:D2} + + + Posición de parada de la parte interna del área del Lead-Out: {3:D2}:{0:D2}:{1:D2}:{2:D2} + + + Transmisión: + + + La latencia de acceso en transmisión es de {0} + + + El conjunto de funciones de transmisión están soportados + + + El conjunto de funciones de transmisión están soportados y activados + + + La granularidad del rendimiento de la transmisión es {0} + + + El tiempo de transmisión en DMA es {0} + + + El tiempo de transmisión en PIO es {0} + + + {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: área de {4}, {5}, {6}, {7}, Q: {8:X2} {9:X2} {10:X2} {11:X2} {12:X2} {13:X2} {14:X2} {15:X2} {16:X2} {17:X2} CRC 0x{18:X2}{19:X2} ({20}), R-W {21} + + + {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: área de {4}, {5}, {6}, {7}, Q modo {8}, {9} punteros de intervalo de omisión, {10} asignaciones de pistas omitidas, CRC 0x{11:X2}{12:X2} ({13}), R-W {14} + + + {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: área de {4}, {5}, {6}, {7}, Q modo {8}, valores de ATIP {9:X2}, {10:X2}, {11:X2}, el primer Lead-In del disco empieza en {12:X2}{13:X2}{14:X2} (LBA {15}), CRC 0x{16:X2}{17:X2} ({18}), R-W {19} + + + {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: área de {4}, {5}, {6}, {7}, Q modo {8} ISRC: {9} fotograma {10:X2} CRC 0x{11:X2}{12:X2} ({13}), R-W {14} + + + {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: área de {4}, {5}, {6}, {7}, Q modo {8} MCN: {9} fotograma {10:X2} CRC 0x{11:X2}{12:X2} ({13}), R-W {14} + + + {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: área de {4}, {5}, {6}, {7}, Q modo {8} el siguiente área de programa puede empezar en {9:X2}:{10:X2}:{11:X2} (LBA {12}), última sesión, {13} punteros de modo 5, CRC 0x{14:X2}{15:X2} ({16}), R-W {17} + + + {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: área de {4}, {5}, {6}, {7}, Q modo {8} el siguiente área de programa puede empezar en {9:X2}:{10:X2}:{11:X2} (LBA {12}), Lead-Out máximo en {13:X2}:{14:X2}:{15:X2} (LBA {16}), {17} punteros de modo 5, CRC 0x{18:X2}{19:X2} ({20}), R-W {21} + + + {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: área de {4}, {5}, {6}, {7}, Q modo {8} posición: {9:X2}:{10:X2}:{11:X2} (LBA {12}), pista {13:X} es la primera pista del área de programa en formato {14}, Q CRC 0x{15:X2}{16:X2} ({17}), R-W {18} + + + {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: área de {4}, {5}, {6}, {7}, Q modo {8} posición: {9:X2}:{10:X2}:{11:X2} (LBA {12}), pista {13:X} es la última pista del área de programa, Q CRC 0x{14:X2}{15:X2} ({16}), R-W {17} + + + {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: área de {4}, {5}, {6}, {7}, Q modo {8} posición: {9:X2}:{10:X2}:{11:X2} (LBA {12}), pista {13:X} comienza en {14:X2}:{15:X2}:{16:X2} (LBA {17}), Q CRC 0x{18:X2}{19:X2} ({20}), R-W {21} + + + {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: área de {4}, {5}, {6}, {7}, Q modo {8} tiempo de comienzo del intervalo de omisión {9:X2}{10:X2}{11:X2}, tiempo de parada del intervalo de omisión {12:X2}{13:X2}{14:X2}, CRC 0x{15:X2}{16:X2} ({17}), R-W {18} + + + {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: área de {4}, {5}, {6}, {7}, Q modo {8}, la pista {9} debe omitirse, CRC 0x{10:X2}{11:X2} ({12}), R-W {13} + + + {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: área de {4}, {5}, {6}, {7}, Q modo {8} posición: pista {9:X} índice {10:X} posición relativa {11:X2}:{12:X2}:{13:X2} (LBA {14}), posición absoluta {15:X2}:{16:X2}:{17:X2} (LBA {18}), Q CRC 0x{19:X2}{20:X2} ({21}), R-W {22} + + + INCORRECTO + + + CD-DA / CD-ROM + + + CD-i + + + CD-ROM XA + + + copia permitida + + + copia prohibida + + + pausa corrupta + + + vacío + + + datos incrementales + + + Lead-In + + + Lead-Out + + + no está vacío + + + no está en pausa + + + OK + + + pausa + + + programa + + + audio cuadrafónico sin pre-énfasis + + + audio cuadrafónico con pre-enfasis + + + valor de control {0} reservado + + + audio estéreo sin pre-énfasis + + + audio estéreo con pre-énfasis + + + datos ininterrumpidos + + + desconocido {0:X2} + + + Las copias de las subcabeceras son diferentes. + + + Versiones ATA soportadas: + + + Tipo de medio soportado cuatro: {0} + + + Tipo de medio soportado uno: {0} + + + Tipo de medio soportado tres: {0} + + + Tipo de medio soportado dos: {0} + + + Definiciones de operación soportadas: + + + Soporta información de protección y longitudes de bloques + + + Soporta transiciones automáticas de parcial a reposo por el dispositivo + + + Soporta borrado de seguridad mejorada + + + Soporta transiciones automáticas de parcial a reposo por el anfitrión + + + Nombre del sistema: {0} + + + Dirección del programa de sistema: 0x{0:X8} + + + Dirección de entrada del programa de sistema: 0x{0:X8} + + + Tamaño de carga del programa de sistema: {0} bytes + + + RAM de trabajo del programa de sistema: {0} bytes + + + T10000A + + + T10000B + + + T10000C + + + T10000D + + + T9840C + + + T9940 + + + El etiquedato del encolado está desactivado + + + Las etiquetas deben estar en unidades de {0} sectores. + + + El tamaño de los recursos de etiqueta es {0}. + + + Mammoth + + + Versión del directorio de formato de la cinta: {0} + + + La cinta se desenroscará + + + La cinta se desenroscará y descargará + + + La cinta permanecerá enroscada al comienzo + + + El valor del entrelazado dependiende del objetivo es {0} + + + Identificador del grupo objetivo: {0} + + + El objetivo tiene permitido re-ordenar la transferencia de datos + + + El objetivo puede lanzar una notificación de evento asíncrona en lugar de un error diferido + + + El objetivo puede lanzar una notificación de evento asíncrona en lugar de una condición de atención de unidad + + + El objetivo puede lanzar una notificación de evento asíncrona al completar su inicialización + + + El objetivo opera como un maestro sincronizado con la rotación + + + El objetivo opera como el control maestro sincronizado con la rotación + + + El objetivo opera como el contro esclavo sincronizado con la rotación + + + El objetivo no debe liberar la señal de encendido del motor + + + El objetivo no debe transferir datos para un comando durante la misma interconexión + + + El objetivo debe esperar {0} segundos desde que la unidad está lista antes de abortar intentos de acceso al medio + + + El objetivo debe esperar {0} segundos antes de intentar acceder al medio cuando se active la señal de encendido del motor + + + El objetivo debe esperar {0} segundos antes de librar la señal de encendido del motor después de entrar en reposo + + + Las operaciones abortadas por las acciones de otros iniciadores deben terminar con TASK ABORTES + + + La operación de escritura de prueba está restringida durante las operaciones de lectura o escritura. + + + Campo de texto: "{0}" + + + Hay {0} bloques por cada segundo de audio + + + Hay {0} por bloque + + + Hay comandos pendientes de re-envío + + + No hay direcciones + + + No hay identificadores + + + No hay definiciones soportadas + + + Hay acceso a la partición {0} de propósito general + + + Hay una señal de unidad lista + + + No hay acceso a la partición de arranque + + + No hay ningún cartucho introducido + + + No hay límite al tiempo máximo que se permite permanecer ocupado + + + Hay acceso de lectura/escritura a la partición de arranque 1 + + + Hay acceso de lectura/escritura a la partición de arranque 2 + + + Hay acceso de lectura/escritura al bloque de memoria protegido contra repetición + + + El tipo de dispositivo que se proveería en la respuesta a INQUIRY es {0} + + + La unidad lógica no hace cumplir los Controls de Región de Reproducción (RPC). + + + La unidad lógica mantiene un conjunto de tareas para todos los nexos + + + La unidad lógica mantiene conjuntos de tareas separados para cada nexo + + + La unidad lógica debe adherirse a la especificación y requisitos del acuerdo de licencia de CSS al respecto de RPC. + + + La unidad lógica usa un esquema de cumplimiento de regiones desconocido. + + + La señal del motor activo debe permanecer libre + + + Tercer bloque de entrada + + + Este descriptor está duplicado + + + El disco contiene una capa CD-ROM. + + + El disco contiene una capa CD-RW. + + + El disco contiene una capa CD-R. + + + El disco contiene una capa DVD-ROM. + + + El disco contiene una capa DVD-RW. + + + El disco contiene una capa DVD-R. + + + El disco no contiene una capa CD. + + + El disco no contiene una capa DVD. + + + El disco tiene {0} capas + + + Este DI continúa la unidad anterior + + + Este DI se refiere a la capa {0} + + + Este DI comienza una nueva unidad + + + Esta es la densidad por defecto de la unidad + + + Esta es la capa por defecto. + + + Esta es la capa actualmente en uso. + + + El intervalo del temporizador es de {0} ms. + + + El intervalo del temporizador es específico del fabricante. + + + Fechado: {0} + + + El fechado puede ser inicializado por métodos externos a los estándares SCSI + + + Número total de Media Key Blocks de CPRM disponibles para transferir: {0} + + + Número total de Media Key Blocks disponibles para transferir: {0} + + + pista {0} + + + Pista {0} (Datos, grabada incrementalmente) comienza en {1:D2}:{2:D2}:{3:D2} y termina en {4:D2}:{5:D2}:{6:D2} + + + Pista {0} (Datos, grabada ininterrumpidamente) comienza en {1:D2}:{2:D2}:{3:D2} y termina en {4:D2}:{5:D2}:{6:D2} + + + Pista {0} (Audio cuadrafónico con pre-énfasis de 50/15 µs) comienza en {1:D2}:{2:D2}:{3:D2} y termina en {4:D2}:{5:D2}:{6:D2} + + + Pista {0} (Audio estéreo con pre-énfasis de 50/15 µs) comienza en {4}:{1:D2}:{2:D2}:{3:D2} y termina en {8}:{5:D2}:{6:D2}:{7:D2} + + + Pista {0} (Audio cuadrafónico sin pre-énfasis) comienza en {1:D2}:{2:D2}:{3:D2} y termina en {4:D2}:{5:D2}:{6:D2} + + + Pista {0} (Audio estéreo sin pre-énfasis) comienza en {1:D2}:{2:D2}:{3:D2} y termina en {4:D2}:{5:D2}:{6:D2} + + + Pista {0} (Datos, grabada incrementalmente) comienza en {4}:{1:D2}:{2:D2}:{3:D2} y termina en {8}:{5:D2}:{6:D2}:{7:D2} + + + Pista {0} (Datos, grabada ininterrumpidamente) comienza en {4}:{1:D2}:{2:D2}:{3:D2} y termina en {8}:{5:D2}:{6:D2}:{7:D2} + + + Pista {0} (Audio cuadrafónico con pre-énfasis de 50/15 µs) comienza en {4}:{1:D2}:{2:D2}:{3:D2} y termina en {8}:{5:D2}:{6:D2}:{7:D2} + + + Pista {0} (Audio cuadrafónico sin pre-énfasis) comienza en {4}:{1:D2}:{2:D2}:{3:D2} y termina en {8}:{5:D2}:{6:D2}:{7:D2} + + + Pista {0} (Audio estéreo con pre-énfasis de 50/15 µs) comienza en {1:D2}:{2:D2}:{3:D2} y termina en {4:D2}:{5:D2}:{6:D2} + + + Pista {0} (Audio estéreo sin pre-énfasis) comienza en {4}:{1:D2}:{2:D2}:{3:D2} y termina en {8}:{5:D2}:{6:D2}:{7:D2} + + + Pista número: {0} + + + Pista número: Lead-Out + + + La opción de compensación de pista está disponible + + + El tamaño de la pista es 0,34 µm + + + El tamaño de la pista es 0,40 µm + + + El tamaño de la pista es 0,615 µm + + + El tamaño de la pista es 0,74 µm + + + El tamaño de la pista es 0,80 µm + + + La pista comienza en el LBA {0}, o el MSF {1:X2}:{2:X2}:{3:X2} + + + Velocidad de transferencia: {0} kbit/s + + + La transferencia se terminará al detectar un error + + + Nombre de la capa de traducción: {0} + + + Versión de la capa de traducción: {0} + + + Fabricante de la capa de traducción: {0} + + + Travan 5 + + + Bandeja cerrada o carrito insertado pero error del medio + + + Bandeja abierto o carrito no insertado + + + Bloque gatillo. + + + El conjunto de funciones de la Computación Confiable está soportado + + + Ultra DMA: + + + Generar errores recuperados incondicionalmente ante excepciones informativas + + + unidades + + + unidades de {0} bytes + + + La unidad está reservada por el iniciador con ID {0:X16} + + + MHz + + + ms + + + ns + + + desconocida + + + µs + + + Código de comportamiento ATAPI DRQ desconocido ({0}) + + + Código de tamaño del paquete ATAPI desconocido ({0}) + + + Revisión ATA desconocida (0x{0:X4}) + + + Código de modo {0} de auto-carga desconocido + + + Código de auto-descarga desconocido ({0}) + + + Dispositivo de bloques desconocido + + + Condición de arranque para el ancho del bus desconocida con código 3. + + + Código de modo del búfer desconocido (0x{0:X2}) + + + Código de formato del cartucho desconocido ({0}) + + + Código de tipo del cartucho desconocido ({0}) + + + Subtipo de disco CD-RW desconocido: {0} + + + Subtipo de disco CD-R desconocido: {0} + + + Código de comportamiento de limpieza desconocido ({0}) + + + con código {0} desconocido + + + Código de reenvío de comandos desconocido ({0}) + + + Código de control de compresión desconocido ({0}) + + + Insertado cartucho de datos desconocido + + + Valor {0} de prioridad de retención de demanda de lectura desconocido + + + Valor {0} de prioridad de retención de demanda de escritura desconocido + + + código de densidad 0x{0:X2} desconocido + + + Descriptor de tipo {1} desconocido contiene: {0} + + + Descriptor de tipo {1} desconocido contiene datos binarios (hexadecimal): {0} + + + Modo {0} desconocido de acceso al dispositivo + + + Configuración específica desconocida (0x{0:X4}) del dispositivo + + + Valor del campo de tipo de dispositivo desconocido (0x{0:X2}) + + + tipo de disco desconocido + + + Tipo de disco {0:X2}h desconocido + + + ID de tipo de disco desconocida ({0}) + + + Código de tipo de carcasa de DVD-RAM desconocido ({0}) + + + Código desconocido ({0}) de activación de la partición de arranque + + + Código desconocido ({0}) de contenido de la memoria borrada + + + Código de prueba de fábrica desconocido ({0}) + + + Código de comportamiento de la reja desconocido ({0}) + + + Código de baudios de la interfaz de la librería desconocido ({0}) + + + ID del fabricante desconocida: 0x{0:X2} + + + Código de reconocimiento del medio desconocido ({0}) + + + Tipo de medio desconocido + + + tipo de medio 0x{0:X2} desconocido + + + Método {0} de reporte desconocido + + + Tipo de dispositivo desconocido o ninguno + + + Código de unidad de tamaño de la partición desconocido ({0}) + + + Código de tamaño de pendiente de pista desconocido ({0}) + + + Código de tipo del transporte del puerto A desconocido ({0}) + + + Código del auto-test al encendido desconocido ({0}) + + + Código del algoritmo modificador de la cola desconocido ({0}) + + + Parámetro de recuperación 0x{0:X2} desconocida + + + Velocidad de referencia desconocida + + + Versión del registro {0} desconocida + + + Código de comportamiento de los datos sense desconocido ({0}) + + + identificador de tamaño desconocido ({0}) + + + Tipo de conjuntos de tareas desconocido ({0}) + + + Formato de entrada de la TOC desconocido, mostrando los valores tal cual + + + Pendiente pista desconocida + + + Código de tamaño de pista desconocido ({0}) + + + Tipo de transporte 0x{0:X1} desconocido + + + Valor 0x{0:X2} desconocido en el campo de reloj SPI + + + Valor 0x{0:X2} desconocido en el campo TPGS + + + ID de fabricante 0x{0:X4} desconocido + + + Longitud de onda desconocida + + + Código de emulación WORM desconocido ({0}) + + + Código de restricciones de etiqueta WORM desconocido ({0}) + + + Se puede descargar con comandos NCQ pendientes + + + Los errores CIRC no recuperables no abortarán la transferencia. + + + Los errores CIRC no recuperables devolverán CHECK CONDITION. + + + Los errores CIRC no recuperables devolverán CHECK CONDITION y los datos sin corregir. + + + Los errores ECC no recuperables no abortarán la transferencia. + + + Los errores ECC no recuperables devolverán CHECK CONDITION. + + + Los errores ECC no recuperables devolverán CHECK CONDITION y los datos sin corregir. + + + La asignación {0} de no-omitir intervarlos dice que desde {1:D2}:{2:D2}:{3:D2} hasta {4:D2}:{5:D2}:{6:D2} no deben omitirse + + + La asignación {0} de no-omitir intervarlos dice que desde {4}:{1:D2}:{2:D2}:{3:D2} hasta {8}:{5:D2}:{6:D2}:{7:D2} no deben omitirse + + + La asignación {0} de no-omitir pistas dice la que la pista {1} no debe ser omitida + + + Dirección no especificada: {0} + + + El bit URG está soportado en los comandos READ STREAM DMA EXT y READ STREAM EXT + + + El bit URG está soportado en los comandos WRITE STREAM DMA EXT y WRITE STREAM EXT + + + NTSC (EEUU). + + + SCSI conectado por USB + + + Bloque de datos de usuario + + + sólo datos de usuario + + + datos de usuario y auxiliares + + + Usa datos sense de 35 bytes + + + Usa datos sense de 96 bytes + + + El uso de las funciones de protección con contraseña está permanentemente desactivado. + + + El uso de la protección contra escritura permanente está desactivado. + + + El descriptor del fabricante contiene: {0} + + + El descriptor del fabricante contiene datos binarios (hexadecimal): {0} + + + El descriptor del fabricante contiene datos de tipo {1} desconocido (hexadecimal): {0} + + + Modificador del tipo de dispositivo específico del fabricante = 0x{0:X2} + + + ASC ESPECÍFICO DEL FABRICANTE {0:X2}h CON ASCQ {1:X2}h + + + ASC ESPECÍFICO DEL FABRICANTE {0:X2}h CON ASCQ ESPECÍFICO DEL FABRICANTE {1:X2}h + + + El bit 5 del byte 6, específico del fabricante, está establecido en la respuesta a INQUIRY + + + Bytes 36 a 55, específicos del fabricante + + + Bytes 47 a 55, específicos del fabricante + + + Bytes 96 a {0}, específicos del fabricante + + + Control de modo específico del fabricante: {0} + + + Configuración de velocidad específica del fabricante: {0} + + + Valor {0} específico del fabricante establecido en el campo del calificador de periférico + + + La verificación tras la escritura está desactivada + + + Versión {0} + + + Bloque de video. + + + La pista de video {3} comienza en: {0:D2}:{1:D2}:{2:D2} + + + Volumen {0} + + + VStape I comprimida + + + VXA-1 + + + VXA-2 + + + VXA-3 + + + El reporte de advertencias está activado + + + La longitud de onda es 650nm + + + Unidad lógica bien conocida + + + con el código de densidad desconocido 0x{0:X2} + + + Palabra 116: 0x{0:X4} + + + Palabra 174: 0x{0:X4} + + + Palabra 175: 0x{0:X4} + + + Palabra {1}: 0x{0:X4} + + + Palabra {1} (CE-ATA): 0x{0:X4} + + + Palabra {1} (CFA): 0x{0:X4} + + + Palabra 207 (CE-ATA): 0x{0:X4} + + + Palabra 208 (CE-ATA): 0x{0:X4} + + + Palabra 219 bits 15 a 8: 0x{0:X2} + + + Palabra 220 bits 15 a 8: 0x{0:X2} + + + Palabra 221: 0x{0:X4} + + + Palabra 47 bits 15 a 8: 0x{0:X2} + + + Palabra 51 bits 7 a 0: 0x{0:X2} + + + Palabra 52 bits 7 a 0: 0x{0:X2} + + + Palabra 64 bits 15 a 8: 0x{0:X2} + + + Palabra 70: 0x{0:X4} + + + Palabra 73: 0x{0:X4} + + + Palabra 74: 0x{0:X4} + + + Palabra 9: 0x{0:X4} + + + World Wide Name: {0:X16} + + + La emulación WORM está desactivada + + + La emulación WORM está activada + + + Bloque de escritura: {0} bytes + + + La longitud del bloque de escritura es de {0} bytes + + + La longitud del bloque de escritura está definida en el CSD extendido + + + WRITE BUFFER DMA está soportado + + + WRITE BUFFER está soportado + + + WRITE BUFFER está soportado y activado + + + El búfer de escritura debe tener un ratio de llenado de {0} antes de vaciarse en el medio + + + La caché de escritura está activada + + + La caché de escritura está soportada + + + La caché de escritura está soportada y activada + + + Los comandos de escritura pueden cruzar los límites de los bloques físicos + + + La reducción de la corriente en escritura comienza en el cilindro {0} + + + WRITE DMA FUA EXT y WRITE MULTIPLE FUA EXT están soportados + + + WRITE DMA FUA EXT y WRITE MULTIPLE FUA EXT están soportados y activado + + + WRITE DMA QUEUED FUA EXT está soportado + + + WRITE DMA QUEUED FUA EXT está soportado y activado + + + Dispositivo de escritura única + + + La pre-compensación de escritura es {0} + + + La pre-compensación de escritura comienza en el cilindro {0} + + + Escribir/Leer/Verificar está soportado + + + Escribir/Leer/Verificar está soportado y activado + + + WRITE UNCORRECTABLE está soportado + + + WRITE UNCORRECTABLE está soportado y activado + + + La escritura está inihibida por alguna razón específica del medio + + + La escritura es {0} veces más lenta que la lectura + + + ANSI X3B5/86-199: Cartucho de cinta magnética de 12,7 mm y 22 pistas, 262 bpmm, MFM + + + ANSI X3B5/97-174: Cartucho de cinta magnética de 12,7 mm y 48 pistas, 1673 bpmm, MFM + + + ANSI X3B5/88-185A: Casete de cinta magnética de 3,81 mm, 2400 bpmm, DDS + + + ANSI X3.157-1987: Cartucho de cinta magnética de 12,7 mm y 9 pistas, 126 bpmm, codificación por fase + + + ANSI X3.136-1986: Cartucho de cinta magnética de 6,3 mm y 4 ó 9 pistas, 315 bpmm, GCR (QIC-24) + + + ANSI X3.158-1987: Casete de cinta magnética de 3,81 mm y 4 pistas, 315 bpmm, GCR + + + ANSI X3.191: Disco óptico de 130 mm y escritura única con 30000 pistas + + + ANSI X3.193-1990: Cartucho de cinta magnética de 12,7 mm y 48 pistas, 394 bpmm, MFM + + + ANSI X3.200: Disco óptico de 356 mm y doble cara con 56350 pistas + + + ANSI X3.202-1991: Casete de cinta magnética de 8 mm, 1703 bpmm, RLL + + + ANSI X3.211: Disco óptico de 130 mm, doble cara y escritura única con 18750 pistas + + + ANSI X3.212: Disco óptico de 130 mm, doble cara y lectura/escritura con 18750 pistas + + + ANSI X3.214: Disco óptico de 130 mm, doble cara y escritura única con 20000 pistas + + + Disco de Xbox 360 + + + Disco de Xbox + + + Las operaciones XOR están desactivadas + + + La zona {0} comienza en el LSN {1} + + + {0} particiones adicionales definidas + + + {0} bloques de reserva asignados + + + {0} bloques suplementarios de reserva asignados + + + {0} pistas asignadas en el disco + + + {0} bloques son {1} y tienen {2} bytes cada uno + + + {0} bloques son {1} y tienen una longitud variable + + + {0} bloques son {1} bytes cada uno + + + {0} bloques tienen conformidad con {1} y tienen {2} bytes cada uno + + + {0} bloques tienen conformidad con {1} y tienen una longitud variable + + + {0} bloques tienen {1} y tienen {2} bytes cada uno + + + {0} bloques tienen una longitud variable + + + {0} bytes límite de cuenta para ATAPI + + + como máximo {0} bytes pueden ser transferidos antes de una desconexión + + + como máximo {0} bytes puede ser transferidos durante un comando junto al comando de desconexión + + + {0} bytes por bloque lógico + + + {0} bytes por sector físico + + + {0} bytes por sector + + + {0} bytes por sector sin formato + + + {0} bytes por pista sin formato + + + actualmente {0} pistas del disco se pueden anexar + + + {0} cilindros + + + profundidad máxima de {0} en la cola + + + {0} sectores del firmware se programaron correctamente + + + reconocidas {0} capas de formato + + + {0} bloques de reserva libres + + + {0} cabezas + + + {0} KiB de búfer multi sector de puerto dual + + + {0} KiB de búfer multi sector de puerto dual con caché de lectura + + + {0} KiB de búfer de sector y puerto únicos + + + {0} KiB de búfer de tipo {1} desconocido + + + {0} bloques lógicos por unidad legible del medio + + + {0} bloques lógicos por unidad escribible del medio + + + máximo de {0} particiones adicionales + + + máximo posible de {0} pistas anexables en el disco + + + máximo posible de {0} pistas en el disco + + + se requieren {0} bloques del medio para el nonce vinculante + + + {0} microsegundos de retraso interposicional para la comprobación acústica ISO-7779 + + + {0} minutos para completar el borrado de seguridad mejorada + + + {0} minutos para completar el borrado seguro + + + {0} ms antes de intentar notificaciones de eventos asíncronos tras la inicialización + + + {0} ns. típicos para limpiar el bit BSY al recibir SERVICE + + + {0} ns. típicos para liberar el bus al recibir PACKET + + + {0} sectores físicos por pista + + + {0} ratio del búfer que debe estar vacío antes de intentar una reselección + + + {0} ratio del búfer que debe estar lleno antes de intentar una reselección + + + {0} entradas restantes del mapa de relocalización POW + + + {0} reemplazos POW restantes + + + {0} actualizaciones POW restantes + + + {0} segundos para terminar el auto-test extendido + + + {0} sectores entre el último bloque de un cilindro y el primer bloque del siguiente + + + {0} sectores entre el último bloque de una pista y el primer bloque de la siguiente + + + {0} sectores para el modo 3 de Escritura/Lectura/Verificación + + + {0} sectores para el modo 2 de Escritura/Lectura/Verificación + + + {0} sectores en modo LBA de 28-bits + + + {0} sectores en modo LBA de 48-bits + + + {0} sectores en la tarjeta + + + {0} sectores por pista + + + {0} sectores por zona que se deben reservar para la gestión de defectos + + + {0} pistas por LUN que se deben reservar para la gestión de defectos + + + {0} pistas por zona que se deben reservar para la gestión de defectos + + + {0} pistas por zona a usar para dividir la capacidad con el propósito de asignar sectores alternativos + + + {0} bloques de reserva primarios sin usar + + + {0} bloques de reserve suplementarios sin usar + + + {0} envolturas + + + deben pasar {0} horas entre el comienzo de una operación de escaneo en segundo plano y la siguiente + + + se permite usar el bus durante {0} µs antes de la desconexión, si se obtiene el privilegio y no está restringido + + + se permite activar BSY durante un máximo de {0} µs sin realizar el intercambio REQ/ACK + + + se permite un tiempo de espera máximo de {0} µs después de liberar el bus antes de intentar la reselección + + + 120mm + + + 13262 transiciones de flujo por radián + + + 15916 transiciones de flujo por radián + + + 1997 ó 2013 + + + 1998 ó 2014 + + + 1999 ó 2015 + + + 2000 ó 2016 + + + 2001 ó 2017 + + + 2002 ó 2018 + + + 2003 ó 2019 + + + 2004 ó 2020 + + + 2005 ó 2021 + + + 2006 ó 2022 + + + 2007 ó 2023 + + + 2008 ó 2024 + + + 2009 ó 2025 + + + LBA de 28-bits está soportado + + + LBA de 48-bits está soportado + + + LBA de 48-bits está soportado y activado + + + etiqueta de 4 bytes, datos de usuario y auxiliares + + + 60mm + + + 7958 transiciones de flujo por radían + + + 80mm + + + (activo) + + \ No newline at end of file diff --git a/Aaru.Decoders/Localization/Localization.resx b/Aaru.Decoders/Localization/Localization.resx new file mode 100644 index 000000000..d140344c5 --- /dev/null +++ b/Aaru.Decoders/Localization/Localization.resx @@ -0,0 +1,9760 @@ + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + ATAPI device + + + CompactFlash device + + + ATA device + + + Additional product ID: {0} + + + World Wide Name: {0:X16} + + + Supported ATA versions: + + + Maximum ATA revision supported: + + + Minor ATA version not specified + + + ATA (ATA-1) X3T9.2 781D prior to revision 4 + + + ATA-1 published, ANSI X3.221-1994 + + + ATA (ATA-1) X3T9.2 781D revision 4 + + + ATA-2 published, ANSI X3.279-1996 + + + ATA-2 X3T10 948D prior to revision 2k + + + ATA-3 X3T10 2008D revision 1 + + + ATA-2 X3T10 948D revision 2k + + + ATA-3 X3T10 2008D revision 0 + + + ATA-2 X3T10 948D revision 3 + + + ATA-3 published, ANSI X3.298-1997 + + + ATA-3 X3T10 2008D revision 6 + + + ATA-3 X3T13 2008D revision 7 + + + ATA/ATAPI-4 X3T13 1153D revision 6 + + + ATA/ATAPI-4 T13 1153D revision 13 + + + ATA/ATAPI-4 X3T13 1153D revision 7 + + + ATA/ATAPI-4 T13 1153D revision 18 + + + ATA/ATAPI-4 T13 1153D revision 15 + + + ATA/ATAPI-4 published, ANSI INCITS 317-1998 + + + ATA/ATAPI-5 T13 1321D revision 3 + + + ATA/ATAPI-4 T13 1153D revision 14 + + + ATA/ATAPI-5 T13 1321D revision 1 + + + ATA/ATAPI-5 published, ANSI INCITS 340-2000 + + + ATA/ATAPI-4 T13 1153D revision 17 + + + ATA/ATAPI-6 T13 1410D revision 0 + + + ATA/ATAPI-6 T13 1410D revision 3a + + + ATA/ATAPI-7 T13 1532D revision 1 + + + ATA/ATAPI-6 T13 1410D revision 2 + + + ATA/ATAPI-6 T13 1410D revision 1 + + + ATA/ATAPI-7 published ANSI INCITS 397-2005 + + + ATA/ATAPI-7 T13 1532D revision 0 + + + ACS-3 Revision 3b + + + ATA/ATAPI-7 T13 1532D revision 4a + + + ATA/ATAPI-6 published, ANSI INCITS 361-2002 + + + ATA8-ACS Revision 3c + + + ATA8-ACS Revision 6 + + + ATA8-ACS Revision 4 + + + ACS-2 Revision 2 + + + ATA8-ACS Revision 3e + + + ATA8-ACS Revision 4c + + + ATA8-ACS Revision 3f + + + ATA8-ACS Revision 3b + + + ACS-3 Revision 5 + + + ACS-2 published, ANSI INCITS 482-2012 + + + ATA8-ACS Revision 2d + + + ACS-2 Revision 3 + + + ACS-3 Revision 4 + + + Unknown ATA revision 0x{0:X4} + + + Parallel ATA device: + + + Serial ATA device: + + + SATA Express device + + + Unknown transport type 0x{0:X1} + + + ATAPI Direct-access device + + + ATAPI Sequential-access device + + + ATAPI Printer device + + + ATAPI Processor device + + + ATAPI Write-once device + + + ATAPI CD-ROM/DVD/etc device + + + ATAPI Scanner device + + + ATAPI Optical memory device + + + ATAPI Medium change device + + + ATAPI Communications device + + + ATAPI Graphics arts pre-press device (defined in ASC IT8) + + + ATAPI Array controller device + + + ATAPI Enclosure services device + + + ATAPI Simplified direct-access device + + + ATAPI Optical card reader/writer device + + + ATAPI Bridging Expanders + + + ATAPI Object-based Storage Device + + + ATAPI Automation/Drive Interface + + + ATAPI Well known logical unit + + + ATAPI Unknown or no device type + + + ATAPI Unknown device type field value 0x{0:X2} + + + Device shall set DRQ within 3 ms of receiving PACKET + + + Device shall assert INTRQ when DRQ is set to one + + + Device shall set DRQ within 50 µs of receiving PACKET + + + Unknown ATAPI DRQ behaviour code {0} + + + ATAPI device uses 12 byte command packet + + + ATAPI device uses 16 byte command packet + + + Unknown ATAPI packet size code {0} + + + Incomplete identify response + + + Device uses non-magnetic media + + + Device is removable + + + Device is fixed + + + Device transfer rate is <= 5 Mb/s + + + Device transfer rate is > 5 Mb/s but <= 10 Mb/s + + + Device transfer rate is > 10 Mb/s + + + Device is soft sectored + + + Device is hard sectored + + + Device is not MFM encoded + + + Format speed tolerance gap is required + + + Track offset option is available + + + Data strobe offset option is available + + + Rotational speed tolerance is higher than 0.5% + + + Spindle motor control is implemented + + + Head switch time is bigger than 15 µs. + + + Device does not rotate. + + + Device rotates at {0} rpm. + + + Physical sector size: {0} bytes + + + Logical sector size: {0} bytes + + + Logical sector starts at offset {0} from physical sector + + + Cylinders: {0} max., {1} current + + + Heads: {0} max., {1} current + + + Sectors per track: {0} max., {1} current + + + Sectors addressable in CHS mode: {0} max., {1} current + + + Cylinders: {0} + + + Heads: {0} + + + Sectors per track: {0} + + + Sectors addressable in CHS mode: {0} + + + {0} sectors in 28-bit LBA mode + + + {0} sectors in 48-bit LBA mode + + + Device size in CHS mode: {0} bytes, {1} Mb, {2} MiB + + + Device size in 28-bit LBA mode: {0} bytes, {1} Tb, {2} TiB + + + Device size in 28-bit LBA mode: {0} bytes, {1} Gb, {2} GiB + + + Device size in 28-bit LBA mode: {0} bytes, {1} Mb, {2} MiB + + + Device size in 48-bit LBA mode: {0} bytes, {1} Tb, {2} TiB + + + Device size in 48-bit LBA mode: {0} bytes, {1} Gb, {2} GiB + + + Device size in 48-bit LBA mode: {0} bytes, {1} Mb, {2} MiB + + + {0} sectors in card + + + {0} bytes per unformatted track + + + {0} bytes per unformatted sector + + + Device requires SET FEATURES to spin up and IDENTIFY DEVICE response is incomplete. + + + Device requires SET FEATURES to spin up and IDENTIFY DEVICE response is complete. + + + Device does not require SET FEATURES to spin up and IDENTIFY DEVICE response is incomplete. + + + Device does not require SET FEATURES to spin up and IDENTIFY DEVICE response is complete. + + + Unknown device specific configuration 0x{0:X4} + + + {0} KiB of single ported single sector buffer + + + {0} KiB of dual ported multi sector buffer + + + {0} KiB of dual ported multi sector buffer with read caching + + + {0} KiB of unknown type {1} buffer + + + READ/WRITE LONG has {0} extra bytes + + + Device capabilities: + + + Standby time values are standard + + + IORDY is supported and can be disabled + + + IORDY is supported + + + DMA is supported + + + Device indicates a specific minimum standby timer value + + + A maximum of {0} sectors can be transferred per interrupt on READ/WRITE MULTIPLE + + + Device supports setting a maximum of {0} sectors + + + Long Physical Alignment setting is {0} + + + Device supports doubleword I/O + + + ATAPI device supports interleaved DMA + + + ATAPI device supports command queueing + + + ATAPI device supports overlapped operations + + + ATAPI device requires ATA software reset + + + PIO timing mode: {0} + + + DMA timing mode: {0} + + + Advanced PIO: + + + Single-word DMA: + + + (active) + + + Multi-word DMA: + + + Ultra DMA: + + + At minimum {0} ns. transfer cycle time per word in MDMA, {1} ns. recommended + + + At minimum {0} ns. transfer cycle time per word in PIO, without flow control + + + At minimum {0} ns. transfer cycle time per word in PIO, with IORDY flow control + + + {0} depth of queue maximum + + + {0} ns. typical to release bus from receipt of PACKET + + + {0} ns. typical to clear BSY bit from receipt of SERVICE + + + SATA 1.5Gb/s is supported + + + SATA 3.0Gb/s is supported + + + SATA 6.0Gb/s is supported + + + Receipt of host initiated power management requests is supported + + + PHY Event counters are supported + + + Supports host automatic partial to slumber transitions is supported + + + Supports device automatic partial to slumber transitions is supported + + + NCQ is supported + + + NCQ priority is supported + + + Unload is supported with outstanding NCQ commands + + + NCQ queue management is supported + + + NCQ streaming is supported + + + ATAPI device supports host environment detection + + + ATAPI device supports attention on slimline connected devices + + + {0} microseconds of interseek delay for ISO-7779 acoustic testing + + + Device nominal size is 5.25" + + + Device nominal size is 3.5" + + + Device nominal size is 2.5" + + + Device nominal size is 1.8" + + + Device nominal size is smaller than 1.8" + + + Device nominal size field value {0} is unknown + + + {0} bytes count limit for ATAPI + + + CompactFlash device supports power mode 1 + + + CompactFlash power mode 1 required for one or more commands + + + CompactFlash power mode 1 is disabled + + + CompactFlash device uses a maximum of {0} mA + + + Command set and features: + + + NOP is supported and enabled + + + NOP is supported + + + READ BUFFER is supported and enabled + + + READ BUFFER is supported + + + WRITE BUFFER is supported and enabled + + + WRITE BUFFER is supported + + + Host Protected Area is supported and enabled + + + Host Protected Area is supported + + + DEVICE RESET is supported and enabled + + + DEVICE RESET is supported + + + SERVICE interrupt is supported and enabled + + + SERVICE interrupt is supported + + + Release is supported and enabled + + + Release is supported + + + Look-ahead read is supported and enabled + + + Look-ahead read is supported + + + Write cache is supported and enabled + + + Write cache is supported + + + PACKET is supported and enabled + + + PACKET is supported + + + Power management is supported and enabled + + + Power management is supported + + + Removable media feature set is supported and enabled + + + Removable media feature set is supported + + + Security mode is supported and enabled + + + Security mode is supported + + + 28-bit LBA is supported + + + 48-bit LBA is supported and enabled + + + 48-bit LBA is supported + + + FLUSH CACHE is supported and enabled + + + FLUSH CACHE is supported + + + FLUSH CACHE EXT is supported and enabled + + + FLUSH CACHE EXT is supported + + + Device Configuration Overlay feature set is supported and enabled + + + Device Configuration Overlay feature set is supported + + + Automatic Acoustic Management is supported and enabled with value {0} (vendor recommends {1} + + + Automatic Acoustic Management is supported + + + SET MAX security extension is supported and enabled + + + SET MAX security extension is supported + + + Address Offset Reserved Area Boot is supported and enabled + + + Address Offset Reserved Area Boot is supported + + + SET FEATURES is required before spin-up + + + Power-up in standby is supported and enabled + + + Power-up in standby is supported + + + Removable Media Status Notification is supported and enabled + + + Removable Media Status Notification is supported + + + Advanced Power Management is supported and enabled with value {0} + + + Advanced Power Management is supported + + + CompactFlash feature set is supported and enabled + + + CompactFlash feature set is supported + + + READ DMA QUEUED and WRITE DMA QUEUED are supported and enabled + + + READ DMA QUEUED and WRITE DMA QUEUED are supported + + + DOWNLOAD MICROCODE is supported and enabled + + + DOWNLOAD MICROCODE is supported + + + S.M.A.R.T. is supported and enabled + + + S.M.A.R.T. is supported + + + S.M.A.R.T. Command Transport is supported + + + S.M.A.R.T. self-testing is supported and enabled + + + S.M.A.R.T. self-testing is supported + + + S.M.A.R.T. error logging is supported and enabled + + + S.M.A.R.T. error logging is supported + + + IDLE IMMEDIATE with UNLOAD FEATURE is supported and enabled + + + IDLE IMMEDIATE with UNLOAD FEATURE is supported + + + URG bit is supported in WRITE STREAM DMA EXT and WRITE STREAM EXT + + + URG bit is supported in READ STREAM DMA EXT and READ STREAM EXT + + + Device has a World Wide Name + + + WRITE DMA QUEUED FUA EXT is supported and enabled + + + WRITE DMA QUEUED FUA EXT is supported + + + WRITE DMA FUA EXT and WRITE MULTIPLE FUA EXT are supported and enabled + + + WRITE DMA FUA EXT and WRITE MULTIPLE FUA EXT are supported + + + General Purpose Logging is supported and enabled + + + General Purpose Logging is supported + + + Streaming feature set is supported and enabled + + + Streaming feature set is supported + + + Media Card Pass Through command set is supported and enabled + + + Media Card Pass Through command set is supported + + + Media Serial is supported and valid + + + Media Serial is supported + + + DSN feature set is supported and enabled + + + DSN feature set is supported + + + Accessible Max Address Configuration is supported and enabled + + + Accessible Max Address Configuration is supported + + + Extended Power Conditions are supported and enabled + + + Extended Power Conditions are supported + + + Extended Status Reporting is supported and enabled + + + Extended Status Reporting is supported + + + Free-fall control feature set is supported and enabled + + + Free-fall control feature set is supported + + + Segmented feature in DOWNLOAD MICROCODE is supported and enabled + + + Segmented feature in DOWNLOAD MICROCODE is supported + + + READ/WRITE DMA EXT GPL are supported and enabled + + + READ/WRITE DMA EXT GPL are supported + + + WRITE UNCORRECTABLE is supported and enabled + + + WRITE UNCORRECTABLE is supported + + + Write/Read/Verify is supported and enabled + + + Write/Read/Verify is supported + + + {0} sectors for Write/Read/Verify mode 3 + + + {0} sectors for Write/Read/Verify mode 2 + + + Current Write/Read/Verify mode: {0} + + + DT1825 is supported and enabled + + + DT1825 is supported + + + BLOCK ERASE EXT is supported + + + OVERWRITE EXT is supported + + + CRYPTO SCRAMBLE EXT is supported + + + DEVICE CONFIGURATION IDENTIFY DMA and DEVICE CONFIGURATION SET DMA are supported + + + READ BUFFER DMA is supported + + + WRITE BUFFER DMA is supported + + + DOWNLOAD MICROCODE DMA is supported + + + SET PASSWORD DMA and SET UNLOCK DMA are supported + + + Not all 28-bit commands are supported + + + Device follows CFast specification + + + Device follows IEEE-1667 + + + Read after TRIM is deterministic + + + Read after TRIM returns empty data + + + Device supports Long Physical Sector Alignment Error Reporting Control + + + Device encrypts all user data + + + Device's write cache is non-volatile + + + Device is zoned + + + Sanitize feature set is supported + + + Sanitize commands are specified by ACS-3 or higher + + + Sanitize commands are specified by ACS-2 + + + SANITIZE ANTIFREEZE LOCK EXT is supported + + + Trusted Computing feature set is supported + + + READ LOG DMA EXT is supported + + + RECEIVE FPDMA QUEUED and SEND FPDMA QUEUED are supported + + + Non-zero buffer offsets are supported and enabled + + + Non-zero buffer offsets are supported + + + DMA Setup auto-activation is supported and enabled + + + DMA Setup auto-activation is supported + + + Device-initiated power management is supported and enabled + + + Device-initiated power management is supported + + + In-order data delivery is supported and enabled + + + In-order data delivery is supported + + + Hardware Feature Control is supported and enabled + + + Hardware Feature Control is supported + + + Asynchronous notification is supported and enabled + + + Asynchronous notification is supported + + + Software Settings Preservation is supported and enabled + + + Software Settings Preservation is supported + + + NCQ Autosense is supported + + + Automatic Partial to Slumber transitions are enabled + + + Removable Media Status Notification feature set is supported + + + Free-fall sensitivity set to {0} + + + DATA SET MANAGEMENT can receive a maximum of {0} blocks of 512 bytes + + + Security: + + + Security is enabled + + + Security is locked + + + Security is not locked + + + Security is frozen + + + Security is not frozen + + + Security count has expired + + + Security count has not expired + + + Security level is maximum + + + Security level is high + + + Security is not enabled + + + Supports enhanced security erase + + + {0} minutes to complete secure erase + + + {0} minutes to complete enhanced secure erase + + + Master password revision code: {0} + + + Streaming: + + + Minimum request size is {0} + + + Streaming transfer time in PIO is {0} + + + Streaming transfer time in DMA is {0} + + + Streaming access latency is {0} + + + Streaming performance granularity is {0} + + + S.M.A.R.T. Command Transport (SCT): + + + SCT Long Sector Address is supported + + + SCT Write Same is supported + + + SCT Error Recovery Control is supported + + + SCT Features Control is supported + + + SCT Data Tables are supported + + + Non-Volatile Cache: + + + Version {0} + + + Power mode feature set is supported and enabled + + + Power mode feature set is supported + + + Non-Volatile Cache is {0} bytes + + + Word 9: 0x{0:X4} + + + Word 47 bits 15 to 8: 0x{0:X2} + + + Word 51 bits 7 to 0: 0x{0:X2} + + + Word 52 bits 7 to 0: 0x{0:X2} + + + Word 64 bits 15 to 8: 0x{0:X2} + + + Word 70: 0x{0:X4} + + + Word 73: 0x{0:X4} + + + Word 74: 0x{0:X4} + + + Word 116: 0x{0:X4} + + + Word {1}: 0x{0:X4} + + + Word {1} (CFA): 0x{0:X4} + + + Word 174: 0x{0:X4} + + + Word 175: 0x{0:X4} + + + Word 207 (CE-ATA): 0x{0:X4} + + + Word 208 (CE-ATA): 0x{0:X4} + + + Word 219 bits 15 to 8: 0x{0:X2} + + + Word 220 bits 15 to 8: 0x{0:X2} + + + Word 221: 0x{0:X4} + + + Word {1} (CE-ATA): 0x{0:X4} + + + Found incorrect Blu-ray BCA size ({0} bytes) + + + Reserved1 = 0x{0:X2} + + + Reserved2 = 0x{0:X2} + + + Blu-ray Burst Cutting Area in hex follows: + + + Found incorrect Blu-ray Cartridge Status size ({0} bytes) + + + Reserved3 = 0x{0:X8} + + + Reserved4 = 0x{0:X8} + + + Reserved5 = 0x{0:X8} + + + Reserved6 = 0x{0:X8} + + + Reserved7 = 0x{0:X8} + + + Media is inserted in a cartridge + + + Media has been taken out, or inserted in, the cartridge + + + Media is write protected + + + Media is not in a cartridge + + + Media has out bit marked, shouldn't + + + Media has write protection bit marked, shouldn't + + + Found incorrect DDS signature (0x{0:X4}) + + + DDS Format: 0x{0:X2} + + + First PSN of Drive Area: 0x{0:X8} + + + First PSN of Defect List: 0x{0:X8} + + + PSN of User Data Area's LSN 0: 0x{0:X8} + + + Last User Data Area's LSN 0: 0x{0:X8} + + + ISA0 size: {0} + + + OSA size: {0} + + + ISA1 size: {0} + + + Spare Area Full Flags: 0x{0:X2} + + + Disc Type Specific Field 1: 0x{0:X2} + + + Disc Type Specific Field 2: 0x{0:X8} + + + Blu-ray DDS Status Bits in hex follows: + + + Blu-ray DDS Disc Type Specific Data in hex follows: + + + Reserved3 = 0x{0:X2} + + + Reserved4 = 0x{0:X16} + + + Reserved7 = 0x{0:X2} + + + Reserved8 = 0x{0:X2} + + + Reserved9 = 0x{0:X8} + + + Blu-ray DI Unit format dependent contents as hex follows: + + + Disc product revision number: {0} + + + Disc timestamp: 0x{0:X2} + + + Disc media type ID: "{0}" + + + Disc manufacturer ID: "{0}" + + + Last address unit number of data zone in this layer: {0} + + + First address unit number of data zone in this layer: {0} + + + Last user data PSN for disc: {0} + + + Disc does not specify a maximum transfer rate. + + + Disc has a maximum transfer rate of {0} Mbit/sec. + + + Disc uses unknown BCA code {0} + + + Disc has a BCA. + + + Disc doesn't have a BCA. + + + Disc uses unknown recorded reflectivity polarity with code {0} + + + Recorded marks have a higher reflectivity than unrecorded ones (LTH disc). + + + Recorded marks have a lower reflectivity than unrecorded ones (HTL disc). + + + Disc uses unknown polarity with code {0} + + + Disc uses negative polarity. + + + Disc uses positive polarity. + + + Disc uses unknown channel length with code {0} + + + Disc uses a 69.0nm channel giving 27 Gb per layer. + + + Disc uses a 74.5nm channel giving 25 Gb per layer. + + + This disc contains a CD-RW layer. + + + This disc contains a CD-R layer. + + + This disc contains a CD-ROM layer. + + + This disc does not contain a CD layer. + + + This disc contains a DVD-RW layer. + + + This disc contains a DVD-R layer. + + + This disc contains a DVD-ROM layer. + + + This disc does not contain a DVD layer. + + + This disc has {0} layers + + + Disc version: {0} + + + Disc class: {0} + + + Disc size: Unknown code {0} + + + Disc size: 80mm + + + Disc size: 120mm + + + Disc type identifier: "{0}" + + + DI Unit is {0} bytes + + + This DI starts a new unit + + + This DI continues previous unit + + + Legacy value: 0x{0:X2} + + + This DI refers to layer {0} + + + There are {0} per block + + + DI Unit Format: 0x{0:X2} + + + DI Unit Sequence: {0} + + + Found unknown disc type identifier "{0}" + + + Found incorrect Blu-ray Disc Information size ({0} bytes) + + + Found incorrect Blu-ray Spare Area Information size ({0} bytes) + + + {0} free spare blocks + + + {0} allocated spare blocks + + + Expected CD ATIP size (32 bytes) is not received size ({0} bytes), not decoding + + + Indicative Target Writing Power: 0x{0:X2} + + + Disc is DDCD-RW + + + Disc is DDCD-R + + + Reference speed is 4x + + + Reference speed is 8x + + + Reference speed set is unknown: {0} + + + ATIP Start time of Lead-in: 0x{0:X6} + + + ATIP Last possible start time of Lead-out: 0x{0:X6} + + + S4 value: 0x{0:X6} + + + Disc is CD-RW + + + Disc is High-Speed CD-RW + + + Disc is Ultra-Speed CD-RW + + + Disc is Ultra-Speed+ CD-RW + + + Disc is medium type B, low beta category (B-) CD-RW + + + Disc is medium type B, high beta category (B+) CD-RW + + + Disc is medium type C, low beta category (C-) CD-RW + + + Disc is medium type C, high beta category (C+) CD-RW + + + Unknown CD-RW disc subtype: {0} + + + Reference speed is 2x + + + Disc is CD-R + + + Disc is normal speed (CLV) CD-R + + + Disc is high speed (CAV) CD-R + + + Disc is medium type A, low beta category (A-) CD-R + + + Disc is medium type A, high beta category (A+) CD-R + + + Disc is medium type B, low beta category (B-) CD-R + + + Disc is medium type B, high beta category (B+) CD-R + + + Disc is medium type C, low beta category (C-) CD-R + + + Disc is medium type C, high beta category (C+) CD-R + + + Unknown CD-R disc subtype: {0} + + + ATIP Start time of Lead-in: {0}:{1:D2}:{2:D2} + + + ATIP Last possible start time of Lead-out: {0}:{1:D2}:{2:D2} + + + Disc use is unrestricted + + + Disc use is restricted + + + A1 value: 0x{0:X6} + + + A2 value: 0x{0:X6} + + + A3 value: 0x{0:X6} + + + Disc uses phase change + + + Disc uses long strategy type dye (Cyanine, AZO, etc...) + + + Disc uses short strategy type dye (Phthalocyanine, etc...) + + + Disc manufactured by: {0} + + + Expected CD-TEXT size ({0} bytes) is not received size ({1} bytes), not decoding + + + Incorrect CD-Text pack type {0}, not decoding + + + CD-Text pack contains title for album + + + CD-Text pack contains title for track {0} + + + CD-Text pack contains performer for album + + + CD-Text pack contains performer for track {0} + + + CD-Text pack contains songwriter for album + + + CD-Text pack contains songwriter for track {0} + + + album + + + track {0} + + + CD-Text pack contains arranger for album + + + CD-Text pack contains arranger for track {0} + + + CD-Text pack contains content provider's message for album + + + CD-Text pack contains content provider's message for track {0} + + + CD-Text pack contains disc identification information + + + CD-Text pack contains genre identification information + + + CD-Text pack contains table of contents information + + + CD-Text pack contains second table of contents information + + + CD-Text pack contains reserved data + + + CD-Text pack contains data reserved for content provider only + + + CD-Text pack contains UPC + + + CD-Text pack contains size block information + + + Double Byte Character Code is used + + + Block number {0} + + + Character position {0} + + + Text field: "{0}" + + + Binary contents: {0} + + + CRC: 0x{0:X4} + + + Expected CDFullTOC size ({0} bytes) is not received size ({1} bytes), not decoding + + + First complete session number: {0} + + + Last complete session number: {0} + + + Unknown TOC entry format, printing values as-is + + + Session {0} + + + First video track number: {0} + + + CD-V single in NTSC format with digital stereo sound + + + CD-V single in NTSC format with digital bilingual sound + + + CD-V disc in NTSC format with digital stereo sound + + + CD-V disc in NTSC format with digital bilingual sound + + + CD-V single in PAL format with digital stereo sound + + + CD-V single in PAL format with digital bilingual sound + + + CD-V disc in PAL format with digital stereo sound + + + CD-V disc in PAL format with digital bilingual sound + + + First track number: {0} ( + + + ) + + + Stereo audio track with no pre-emphasis + + + Stereo audio track with 50/15 μs pre-emphasis + + + Quadraphonic audio track with no pre-emphasis + + + Quadraphonic audio track with 50/15 μs pre-emphasis + + + Data track, recorded uninterrupted + + + Data track, recorded incrementally + + + Disc type: {0} + + + Last video track number: {0} + + + Last track number: {0} ( + + + Lead-Out start position: {3:D2}:{0:D2}:{1:D2}:{2:D2} + + + Lead-Out start position: {0:D2}:{1:D2}:{2:D2} + + + Lead-Out is audio type + + + Lead-Out is data type + + + Book type: 0x{0:X2} + + + Material type: 0x{0:X2} + + + Moment of inertia: 0x{0:X2} + + + Data track {3} starts at: {4:D2}:{0:D2}:{1:D2}:{2:D2} ( + + + Audio track {3} starts at: {4:D2}:{0:D2}:{1:D2}:{2:D2} ( + + + Data track {3} starts at: {0:D2}:{1:D2}:{2:D2} ( + + + Audio track {3} starts at: {0:D2}:{1:D2}:{2:D2} ( + + + Absolute time: {3:D2}:{0:D2}:{1:D2}:{2:D2} + + + Absolute time: {0:D2}:{1:D2}:{2:D2} + + + Video track {3} starts at: {0:D2}:{1:D2}:{2:D2} + + + Start of next possible program in the recordable area of the disc: {3:D2}:{0:D2}:{1:D2}:{2:D2} + + + Maximum start of outermost Lead-Out in the recordable area of the disc: {3:D2}:{0:D2}:{1:D2}:{2:D2} + + + Start of next possible program in the recordable area of the disc: {0:D2}:{1:D2}:{2:D2} + + + Maximum start of outermost Lead-Out in the recordable area of the disc: {0:D2}:{1:D2}:{2:D2} + + + Number of skip interval pointers: {0} + + + Number of skip track pointers: {0} + + + Skip track {0} + + + Optimum recording power: 0x{0:X2} + + + Start time of the first Lead-in area in the disc: {3:D2}:{0:D2}:{1:D2}:{2:D2} + + + Start time of the first Lead-in area in the disc: {0:D2}:{1:D2}:{2:D2} + + + Copy of information of A1 from ATIP found + + + Start position of outer part lead-in area: {3:D2}:{0:D2}:{1:D2}:{2:D2} + + + Stop position of inner part lead-out area: {3:D2}:{0:D2}:{1:D2}:{2:D2} + + + Start position of outer part lead-in area: {0:D2}:{1:D2}:{2:D2} + + + Stop position of inner part lead-out area: {0:D2}:{1:D2}:{2:D2} + + + Start time for interval that should be skipped: {0:D2}:{1:D2}:{2:D2} + + + Ending time for interval that should be skipped: {0:D2}:{1:D2}:{2:D2} + + + Disc ID: {0:X6} + + + Expected CD PMA size ({0} bytes) is not received size ({1} bytes), not decoding + + + Track {0} (Stereo audio track with no pre-emphasis) starts at {4}:{1:D2}:{2:D2}:{3:D2} and ends at {8}:{5:D2}:{6:D2}:{7:D2} + + + Track {0} (Stereo audio track with no pre-emphasis) starts at {1:D2}:{2:D2}:{3:D2} and ends at {4:D2}:{5:D2}:{6:D2} + + + Track {0} (Stereo audio track with 50/15 μs pre-emphasis) starts at {4}:{1:D2}:{2:D2}:{3:D2} and ends at {8}:{5:D2}:{6:D2}:{7:D2} + + + Track {0} (Stereo audio track with 50/15 μs pre-emphasis) starts at {1:D2}:{2:D2}:{3:D2} and ends at {4:D2}:{5:D2}:{6:D2} + + + Track {0} (Quadraphonic audio track with no pre-emphasis) starts at {4}:{1:D2}:{2:D2}:{3:D2} and ends at {8}:{5:D2}:{6:D2}:{7:D2} + + + Track {0} (Quadraphonic audio track with no pre-emphasis) starts at {1:D2}:{2:D2}:{3:D2} and ends at {4:D2}:{5:D2}:{6:D2} + + + Track {0} (Quadraphonic audio track with 50/15 μs pre-emphasis) starts at {4}:{1:D2}:{2:D2}:{3:D2} and ends at {8}:{5:D2}:{6:D2}:{7:D2} + + + Track {0} (Quadraphonic audio track with 50/15 μs pre-emphasis) starts at {1:D2}:{2:D2}:{3:D2} and ends at {4:D2}:{5:D2}:{6:D2} + + + Track {0} (Data track, recorded uninterrupted) starts at {4}:{1:D2}:{2:D2}:{3:D2} and ends at {8}:{5:D2}:{6:D2}:{7:D2} + + + Track {0} (Data track, recorded uninterrupted) starts at {1:D2}:{2:D2}:{3:D2} and ends at {4:D2}:{5:D2}:{6:D2} + + + Track {0} (Data track, recorded incrementally) starts at {4}:{1:D2}:{2:D2}:{3:D2} and ends at {8}:{5:D2}:{6:D2}:{7:D2} + + + Track {0} (Data track, recorded incrementally) starts at {1:D2}:{2:D2}:{3:D2} and ends at {4:D2}:{5:D2}:{6:D2} + + + Reserved = 0x{0:X2} + + + Skip track assignment {0} says that tracks {1} should be skipped + + + Unskip track assignment {0} says that tracks {1} should not be skipped + + + Skip time interval assignment {0} says that from {4}:{1:D2}:{2:D2}:{3:D2} to {8}:{5:D2}:{6:D2}:{7:D2} should be skipped + + + Skip time interval assignment {0} says that from {1:D2}:{2:D2}:{3:D2} to {4:D2}:{5:D2}:{6:D2} should be skipped + + + Unskip time interval assignment {0} says that from {4}:{1:D2}:{2:D2}:{3:D2} to {8}:{5:D2}:{6:D2}:{7:D2} should not be skipped + + + Unskip time interval assignment {0} says that from {1:D2}:{2:D2}:{3:D2} to {4:D2}:{5:D2}:{6:D2} should not be skipped + + + CD sector. + + + CD-ROM sector. + + + Position {0:X2}:{1:X2}:{2:X2} (LBA {3}) + + + Mode 0. + + + Mode 1. + + + Mode 2. + + + Invalid mode 3. + + + User data block + + + Fourth run-in block + + + Third run-in block + + + Second run-in block + + + First run-in block + + + Link block + + + Second run-out block + + + First run-out block + + + Correct sector contents. + + + Incorrect sector contents. + + + Correct EDC. + + + Incorrect EDC. + + + Correct ECC P. + + + Incorrect ECC P. + + + Correct ECC Q. + + + Incorrect ECC Q. + + + Correct zero fill. + + + Incorrect zero fill. + + + Subheader copies differ. + + + File number: {0} + + + Channel number: {0} + + + Coding information number: {0} + + + End of file. + + + Real-time block. + + + Form 2. + + + Form 1. + + + Trigger block. + + + Data block. + + + Audio block. + + + Video block. + + + End of record. + + + Expected CDSessionInfo size ({0} bytes) is not received size ({1} bytes), not decoding + + + First track number in last complete session: {0} + + + Track starts at LBA {0}, or MSF {1:X2}:{2:X2}:{3:X2} + + + Q subchannel mode not given + + + Q subchannel stores current position + + + Q subchannel stores ISRC + + + Q subchannel stores media catalog number + + + Reserved flags 0x{0:X2} set + + + Digital copy of track is permitted + + + Digital copy of track is prohibited + + + stereo audio with pre-emphasis + + + stereo audio without pre-emphasis + + + incremental data + + + uninterrupted data + + + quadraphonic audio with pre-emphasis + + + quadraphonic audio without pre-emphasis + + + reserved control value {0} + + + copy permitted + + + copy prohibited + + + Lead-In + + + {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: {4} area, {5}, {6}, {7}, Q mode {8} position: {9:X2}:{10:X2}:{11:X2} (LBA {12}), track {13:X} starts at {14:X2}:{15:X2}:{16:X2} (LBA {17}), Q CRC 0x{18:X2}{19:X2} ({20}), R-W {21} + + + corrupted pause + + + pause + + + not pause + + + OK + + + BAD + + + empty + + + not empty + + + CD-DA / CD-ROM + + + CD-i + + + CD-ROM XA + + + unknown {0:X2} + + + {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: {4} area, {5}, {6}, {7}, Q mode {8} position: {9:X2}:{10:X2}:{11:X2} (LBA {12}), track {13:X} is first program area track in {14} format, Q CRC 0x{15:X2}{16:X2} ({17}), R-W {18} + + + {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: {4} area, {5}, {6}, {7}, Q mode {8} position: {9:X2}:{10:X2}:{11:X2} (LBA {12}), track {13:X} is last program area track, Q CRC 0x{14:X2}{15:X2} ({16}), R-W {17} + + + {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: {4} area, {5}, {6}, {7}, Q mode {8} MCN: {9} frame {10:X2} CRC 0x{11:X2}{12:X2} ({13}), R-W {14} + + + {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: {4} area, {5}, {6}, {7}, Q: {8:X2} {9:X2} {10:X2} {11:X2} {12:X2} {13:X2} {14:X2} {15:X2} {16:X2} {17:X2} CRC 0x{18:X2}{19:X2} ({20}), R-W {21} + + + {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: {4} area, {5}, {6}, {7}, Q mode {8} skip interval start time {9:X2}{10:X2}{11:X2}, skip interval stop time {12:X2}{13:X2}{14:X2}, CRC 0x{15:X2}{16:X2} ({17}), R-W {18} + + + {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: {4} area, {5}, {6}, {7}, Q mode {8} next program area can start at {9:X2}:{10:X2}:{11:X2} (LBA {12}), last-session, {13} mode 5 pointers, CRC 0x{14:X2}{15:X2} ({16}), R-W {17} + + + {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: {4} area, {5}, {6}, {7}, Q mode {8} next program area can start at {9:X2}:{10:X2}:{11:X2} (LBA {12}), maximum Lead-out at {13:X2}:{14:X2}:{15:X2} (LBA {16}), {17} mode 5 pointers, CRC 0x{18:X2}{19:X2} ({20}), R-W {21} + + + {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: {4} area, {5}, {6}, {7}, Q mode {8}, {9} skip interval pointers, {10} skip track assignments, CRC 0x{11:X2}{12:X2} ({13}), R-W {14} + + + {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: {4} area, {5}, {6}, {7}, Q mode {8}, ATIP values {9:X2}, {10:X2}, {11:X2}, first disc Lead-in starts at {12:X2}{13:X2}{14:X2} (LBA {15}), CRC 0x{16:X2}{17:X2} ({18}), R-W {19} + + + {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: {4} area, {5}, {6}, {7}, Q mode {8}, tracks {9} to be skipped, CRC 0x{10:X2}{11:X2} ({12}), R-W {13} + + + Lead-Out + + + Program + + + {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: {4} area, {5}, {6}, {7}, Q mode {8} position: track {9:X} index {10:X} relative position {11:X2}:{12:X2}:{13:X2} (LBA {14}), absolute position {15:X2}:{16:X2}:{17:X2} (LBA {18}), Q CRC 0x{19:X2}{20:X2} ({21}), R-W {22} + + + {0:D2}:{1:D2}:{2:D2} - LBA {3,6}: {4} area, {5}, {6}, {7}, Q mode {8} ISRC: {9} frame {10:X2} CRC 0x{11:X2}{12:X2} ({13}), R-W {14} + + + Expected CD TOC size ({0} bytes) is not received size ({1} bytes), not decoding + + + First track number in first complete session: {0} + + + Last track number in last complete session: {0} + + + Track number: Lead-Out + + + Track number: {0} + + + Q subchannel stores track pointer + + + Q subchannel stores video track pointer + + + Q subchannel mode {0} + + + Disc surface is set to write protected status + + + Disc comes in a cartridge + + + Disc has been extracted from the cartridge + + + Cartridge is set to write protected + + + Disc shall not be written without a cartridge + + + Disc may be written without a cartridge + + + Unknown disc type id {0} + + + Disc is write inhibited because it has been extracted from the cartridge + + + Disc is write inhibited for an unspecified reason + + + Disc has unknown reason {0} for write inhibition + + + No drive region setting. + + + Drive region is set. + + + Drive region is set, with additional restrictions required to make a change. + + + Drive region has been set permanently, but may be reset by the vendor if necessary. + + + Drive has {0} vendor resets available. + + + Drive has {0} user controlled changes available. + + + Drive has no region set. + + + Drive is region free. + + + Drive has the following regions set: + + + The Logical Unit does not enforce Region Playback Controls (RPC). + + + The Logical Unit shall adhere to the specification and all requirements of the CSS license agreement concerning RPC. + + + The Logical Unit uses an unknown region enforcement scheme. + + + Disc has no encryption. + + + Disc is encrypted using CSS or CPPM. + + + Disc is encrypted using CPRM. + + + Disc is encrypted using AACS. + + + Disc is encrypted using unknown algorithm with ID {0}. + + + Disc cannot be played in any region at all. + + + Disc can be played in any region. + + + Disc can be played in the following regions: + + + Formatting in progress. + + + Formatting is only using partial certification + + + Only a group is being formatted + + + Disc has been certified by a user + + + Disc has been certified by a manufacturer + + + DDS has been updated {0} times + + + Group {0} is being formatted + + + Group {0} is being certified partially + + + Group {0} has been certified by an user + + + Disc has {0} zones + + + Primary Spare Area stats at PSN {0:X}h and ends at PSN {1:X}h, inclusively + + + LSN 0 is at PSN {0:X}h + + + Zone {0} starts at LSN {1} + + + unknown size identifier {0} + + + Disc is a {0} {1} version {2} + + + Disc claims conformation to ECMA-267 + + + Disc claims conformation to ECMA-268 + + + Disc claims conformation to ECMA-272 + + + Disc claims conformation to ECMA-330 + + + Disc claims conformation to ECMA-279 + + + Disc claims conformation to ECMA-359 + + + Disc claims conformation to ECMA-382 + + + Disc claims conformation to ECMA-338 + + + Disc claims conformation to ECMA-384 + + + 60mm + + + invalid size + + + Disc claims conformation to ECMA-365 + + + Disc claims conformation to ECMA-274 + + + Disc claims conformation to ECMA-337 + + + Disc claims conformation to ECMA-371 + + + Disc claims conformation to ECMA-349 + + + Disc claims conformation to ECMA-374 + + + Disc claims conformation to ECMA-364 + + + Disc is a Nintendo Gamecube Optical Disc (GOD) + + + Disc is a Nintendo Wii Optical Disc (WOD) + + + unknown disc type + + + 80mm + + + 120mm + + + Disc book type is {0} + + + Disc maximum transfer rate is 2.52 Mbit/sec. + + + Disc maximum transfer rate is 5.04 Mbit/sec. + + + Disc maximum transfer rate is 10.08 Mbit/sec. + + + Disc maximum transfer rate is 20.16 Mbit/sec. + + + Disc maximum transfer rate is 30.24 Mbit/sec. + + + Disc maximum transfer rate is unspecified. + + + Disc maximum transfer rate is specified by unknown key {0} + + + Disc has {0} layers + + + Layers are in parallel track path + + + Layers are in opposite track path + + + Pitch size is 0.267 μm/bit + + + Pitch size is 0.147 μm/bit + + + Pitch size is between 0.409 μm/bit and 0.435 μm/bit + + + Pitch size is between 0.140 μm/bit and 0.148 μm/bit + + + Pitch size is 0.153 μm/bit + + + Pitch size is between 0.130 μm/bit and 0.140 μm/bit + + + Pitch size is 0.353 μm/bit + + + Unknown pitch size key {0} + + + Track size is 0.74 μm + + + Track size is 0.80 μm + + + Track size is 0.615 μm + + + Track size is 0.40 μm + + + Track size is 0.34 μm + + + Unknown track size key {0} + + + Data area starts at PSN {0:X}h + + + Data area ends at PSN {0:X}h + + + Layer 0 ends at PSN {0:X}h + + + Disc is empty + + + Media attribute is {0} + + + Disc shall be recorded with a case + + + Disc can be recorded with or without a case + + + Unknown DVD-RAM case type key {0} + + + Disc manufacturer is {0} + + + Disc manufacturer supplementary information is {0} + + + Current Border-Out first sector is PSN {0:X}h + + + Next Border-In first sector is PSN {0:X}h + + + Disc contains extended information for VCPS + + + Disc media type is {0} + + + Disc product revision is {0} + + + Current RMD in extra Border zone starts at PSN {0:X}h + + + PFI in extra Border zone starts at PSN {0:X}h + + + Control Data Zone is pre-recorded + + + Lead-In is pre-recorded + + + Lead-Out is pre-recorded + + + Disc for unrestricted use. + + + Invalid purpose field with value {0} + + + Consumer purpose disc for use in consumer purpose drives + + + Disc for restricted use. + + + Disc for use in special drives according with purpose value {0} + + + General purpose disc for use in general purpose drives + + + Disc track pitch is 0.74 μm + + + Unknown track pitch + + + Reference velocity is 3.49 m/s + + + Unknown reference velocity + + + Disc has 80mm diameter + + + Disc has 120mm diameter + + + Disc reflectivity is between 18% and 30% + + + Disc reflectivity is between 45% and 85% + + + Dye is organic + + + Dye is phase change + + + Disc is RW (rewritable) + + + Disc is R (recordable) + + + Wavelength is 650nm + + + Unknown wavelength + + + Last writable ECC block address: 0x{0:X6} + + + Part version {0} + + + Recommended recording power is {0} mW + + + Recording power is not specified + + + Recommended erasing power ratio is {0} ε + + + Erasing power ratio is not specified + + + {0} unused primary spare blocks + + + {0} unused supplementary spare blocks + + + {0} allocated supplementary spare blocks + + + Prologue found at {0} + + + Volume {0} + + + Sector {0} + + + Checksum {0} + + + Epilogue {0:X2}{1:X2}{2:X2} + + + Inner gap has {0} bytes + + + Data has {0} bytes + + + Got {0} bytes of gap + + + Finished sector at {0} + + + Adding sector {0} of track {1} + + + MultiMediaCard Device Identification Register: + + + Manufacturer: {0} + + + Removable device + + + BGA device + + + POP device + + + Application ID: {0} + + + Product revision: {0:X2}.{1:X2} + + + Product serial number: {0} + + + 1997 or 2013 + + + 1998 or 2014 + + + 1999 or 2015 + + + 2000 or 2016 + + + 2001 or 2017 + + + 2002 or 2018 + + + 2003 or 2019 + + + 2004 or 2020 + + + 2005 or 2021 + + + 2006 or 2022 + + + 2007 or 2023 + + + 2008 or 2024 + + + 2009 or 2025 + + + Device manufactured month {0} of {1} + + + CID CRC: 0x{0:X2} + + + Register version 1.0 + + + Register version 1.1 + + + Register version 1.2 + + + MultiMediaCard Device Specific Data Register: + + + Register version is defined in Extended Device Specific Data Register + + + ns + + + μs + + + ms + + + MHz + + + unknown + + + Device's clock frequency: {0}{1} + + + Read block length size is defined in extended CSD + + + Device may be bigger than 2GiB and have its real size defined in the extended CSD + + + Device has {0} blocks + + + Device has {0} GiB + + + Device has {0} MiB + + + Device has {0} KiB + + + Device has {0} bytes + + + Device uses a maximum of 0.5mA for reading at minimum voltage + + + Device uses a maximum of 1mA for reading at minimum voltage + + + Device uses a maximum of 5mA for reading at minimum voltage + + + Device uses a maximum of 10mA for reading at minimum voltage + + + Device uses a maximum of 25mA for reading at minimum voltage + + + Device uses a maximum of 35mA for reading at minimum voltage + + + Device uses a maximum of 60mA for reading at minimum voltage + + + Device uses a maximum of 100mA for reading at minimum voltage + + + Device uses a maximum of 1mA for reading at maximum voltage + + + Device uses a maximum of 5mA for reading at maximum voltage + + + Device uses a maximum of 10mA for reading at maximum voltage + + + Device uses a maximum of 25mA for reading at maximum voltage + + + Device uses a maximum of 35mA for reading at maximum voltage + + + Device uses a maximum of 45mA for reading at maximum voltage + + + Device uses a maximum of 80mA for reading at maximum voltage + + + Device uses a maximum of 200mA for reading at maximum voltage + + + Device uses a maximum of 0.5mA for writing at minimum voltage + + + Device uses a maximum of 1mA for writing at minimum voltage + + + Device uses a maximum of 5mA for writing at minimum voltage + + + Device uses a maximum of 10mA for writing at minimum voltage + + + Device uses a maximum of 25mA for writing at minimum voltage + + + Device uses a maximum of 35mA for writing at minimum voltage + + + Device uses a maximum of 60mA for writing at minimum voltage + + + Device uses a maximum of 100mA for writing at minimum voltage + + + Device uses a maximum of 1mA for writing at maximum voltage + + + Device uses a maximum of 5mA for writing at maximum voltage + + + Device uses a maximum of 10mA for writing at maximum voltage + + + Device uses a maximum of 25mA for writing at maximum voltage + + + Device uses a maximum of 35mA for writing at maximum voltage + + + Device uses a maximum of 45mA for writing at maximum voltage + + + Device uses a maximum of 80mA for writing at maximum voltage + + + Device uses a maximum of 200mA for writing at maximum voltage + + + Device can erase a minimum of {0} blocks at a time + + + Device can write protect regions + + + Device can write protect a minimum of {0} blocks at a time + + + Device can't write protect regions + + + Device uses no ECC by default + + + Device uses BCH(542, 512) ECC by default + + + Device uses unknown ECC code {0} by default + + + Writing is {0} times slower than reading + + + Write block length size is defined in extended CSD + + + Write block length is {0} bytes + + + Device allows writing partial blocks + + + Device supports content protection + + + Device contents are original + + + Device is permanently write protected + + + Device is temporarily write protected + + + Device is formatted like a hard disk + + + Device is formatted like a floppy disk using Microsoft FAT + + + Device uses Universal File Format + + + Device uses unknown file format code {0} + + + Device uses unknown file format code {0} and file format group 1 + + + Device currently uses no ECC + + + Device currently uses BCH(542, 512) ECC + + + Device currently uses unknown ECC code {0} + + + CSD CRC: 0x{0:X2} + + + MultiMediaCard Extended Device Specific Data Register: + + + Last extended security error was {0} + + + Device supports standard MMC command set + + + Device supports unknown command sets 0x{0:X2} + + + Device implements HPI using CMD12 + + + Device implements HPI using CMD13 + + + Device supports background operations + + + Device supports a maximum of {0} packed reads and {1} packed writes + + + Device supports Data Tag + + + Tags must be in units of {0} sectors + + + Tag resources size is {0}. + + + Max context ID is {0}. + + + Large unit maximum multiplier is {0}. + + + Large unit size is {0} MiB + + + Device supports non-persistent extended partitions + + + Device supports system code extended partitions + + + Device supports FFU + + + Maximum timeout for switch command when setting a value to the mode operation codes field is {0:D2}s + + + Maximum timeout for switch command when setting a value to the mode operation codes field is {0:D2}ms + + + Maximum timeout for switch command when setting a value to the mode operation codes field is {0:D2}µs + + + Device supports Vendor Specific Mode + + + Device supports the barrier command + + + Device supports command queuing with a depth of {0} + + + {0} firmware sectors correctly programmed + + + Device used between 0% and 10% of its estimated life time + + + Device used between 10% and 20% of its estimated life time + + + Device used between 20% and 30% of its estimated life time + + + Device used between 30% and 40% of its estimated life time + + + Device used between 40% and 50% of its estimated life time + + + Device used between 50% and 60% of its estimated life time + + + Device used between 60% and 70% of its estimated life time + + + Device used between 70% and 80% of its estimated life time + + + Device used between 80% and 90% of its estimated life time + + + Device used between 90% and 100% of its estimated life time + + + Device exceeded its maximum estimated life time + + + Device informs it's in good health + + + Device informs it should be replaced soon + + + Device informs it should be replace immediately + + + Device does not report an optimal read size + + + Optimal read size is {0} KiB + + + Device does not report an optimal write size + + + Optimal write size is {0} KiB + + + Device does not report an optimal trim size + + + Optimal trim size is {0} KiB + + + Device version: {0} + + + Firmware version: {0} + + + Device has no cache + + + Device has {0} KiB of cache + + + Device takes a maximum of {0} ms by default for a SWITCH command + + + Device takes a maximum of {0} by default to power off from a SWITCH command notification + + + Device has no pending background operations + + + Device has non critical operations outstanding + + + Device has performance impacted operations outstanding + + + Device has critical operations outstanding + + + Last WRITE MULTIPLE command correctly programmed {0} sectors + + + Device takes a maximum of {0} ms for initialization after partition + + + Device uses a FIFO policy for cache flushing + + + Device takes a maximum of {0} ms for trimming a single erase group + + + Device supports the sanitize operation + + + Device supports supports the secure and insecure trim operations + + + Device supports automatic erase on retired defective blocks + + + Device supports secure purge operations + + + Device takes a maximum of {0} ms for securely erasing a single erase group + + + Device takes a maximum of {0} ms for securely trimming a single erase group + + + Device supports high speed timing on boot + + + Device supports dual data rate on boot + + + Device supports alternative boot method + + + Device has a {0} KiB boot partition + + + Device has a page size of {0} KiB + + + Device erase groups are {0} KiB + + + Device takes a maximum of {0} ms for erasing a single erase group + + + Device smallest write protect group is made of {0} erase groups + + + Device uses {0} mA on Vcc when sleeping + + + Device uses {0} μA on Vcc when sleeping + + + Device uses {0} mA on Vccq when sleeping + + + Device uses {0} μA on Vccq when sleeping + + + Device takes a maximum of {0} s to switch production state awareness + + + Device takes a maximum of {0} ms to switch production state awareness + + + Device takes a maximum of {0} μs to switch production state awareness + + + Device takes a maximum of {0} ms to transition between sleep and standby states + + + Device takes a maximum of {0} μs to transition between sleep and standby states + + + Device takes a maximum of {0} ns to transition between sleep and standby states + + + Device takes a maximum of {0} s to move to sleep state + + + Device takes a maximum of {0} ms to move to sleep state + + + Device takes a maximum of {0} μs to move to sleep state + + + Device has {0} sectors + + + Device supports secure write protection + + + Device has secure write protection enabled + + + Device cannot achieve 2.4MB/s reading in SDR 26Mhz mode + + + Device can achieve a minimum of {0}MB/s reading in SDR 26Mhz mode + + + Device cannot achieve 2.4MB/s reading in SDR 26Mhz 4-bit mode + + + Device can achieve a minimum of {0}MB/s reading in SDR 26Mhz 4-bit mode + + + Device cannot achieve 2.4MB/s reading in SDR 52Mhz mode + + + Device can achieve a minimum of {0}MB/s reading in SDR 52Mhz mode + + + Device cannot achieve 4.8MB/s reading in DDR 52Mhz mode + + + Device can achieve a minimum of {0}MB/s reading in DDR 52Mhz mode + + + Device cannot achieve 2.4MB/s writing in SDR 26Mhz mode + + + Device can achieve a minimum of {0}MB/s writing in SDR 26Mhz mode + + + Device cannot achieve 2.4MB/s writing in SDR 26Mhz 4-bit mode + + + Device can achieve a minimum of {0}MB/s writing in SDR 26Mhz 4-bit mode + + + Device cannot achieve 2.4MB/s writing in SDR 52Mhz mode + + + Device can achieve a minimum of {0}MB/s writing in SDR 52Mhz mode + + + Device cannot achieve 4.8MB/s writing in DDR 52Mhz mode + + + Device can achieve a minimum of {0}MB/s writing in DDR 52Mhz mode + + + Device can take a maximum of {0} ms when switching partitions + + + Device can take a maximum of {0} ms when releasing from an interrupt + + + Device supports I/O driver strength type 0. + + + Device supports I/O driver strength type 1. + + + Device supports I/O driver strength type 2. + + + Device supports I/O driver strength type 3. + + + Device supports I/O driver strength type 4. + + + Device supports 26 Mhz mode + + + Device supports 52 Mhz mode + + + Device supports DDR 52 Mhz mode at 1.8V or 3V + + + Device supports DDR 52 Mhz mode 1.2V + + + Device supports HS-200 mode (SDR 200Mhz) at 1.8V + + + Device supports HS-200 mode (SDR 200Mhz) at 1.2V + + + Device supports HS-400 mode (DDR 200Mhz) at 1.8V + + + Device supports HS-400 mode (DDR 200Mhz) at 1.2V + + + CSD version 1.{0} revision 1.{1} + + + Device follows compatibility MMC command set. + + + Device follows standard MMC command set v4.0. + + + Device follows standard MMC command set with unknown version code {0}. + + + Device follows unknown MMC command set code {0} with revision code {1}. + + + Device is in High Speed mode. + + + Device is in HS-200 mode. + + + Device is in HS-400 mode. + + + Device has unknown timing mode {0}. + + + Selected driver strength is type {0}. + + + Device supports enhanced strobe mode + + + Device uses strobe during Data Out, CRC and CMD responses + + + Device uses strobe during Data Out and CRC responses + + + Device is using 1-bit data bus + + + Device is using 4-bit data bus + + + Device is using 8-bit data bus + + + Device is using 4-bit DDR data bus + + + Device is using 8-bit DDR data bus + + + Device is using unknown data bus code {0} + + + Erased memory range shall be '{0}'. + + + Unknown erased memory content code {0} + + + Device sends boot acknowledge + + + Device is not boot enabled + + + Device boot partition 1 is enabled + + + Device boot partition 2 is enabled + + + Device user area is enable for boot + + + Unknown enabled boot partition code {0} + + + There is no access to boot partition + + + There is read/write access to boot partition 1 + + + There is read/write access to boot partition 2 + + + There is read/write access to replay protected memory block + + + There is access to general purpose partition {0} + + + Change of the boot configuration register bits is permanently disabled. + + + Change of the boot configuration register bits is disabled until the next power cycle. + + + Device will boot up in x1 SDR or x4 DDR bus width. + + + Device will boot up in x4 SDR or DDR bus width. + + + Device will boot up in x8 SDR or DDR bus width. + + + Unknown boot condition for bus width with code 3. + + + Device will retain boot conditions after boot operation. + + + Device will reset boot conditions to compatibility mode after boot operation. + + + Device will use single data rate with compatible timings in boot operation. + + + Device will use single data rate with high speed timings in boot operation. + + + Device will use dual data rate in boot operation. + + + Device will use unknown boot mode with code 3. + + + Device will use high capacity erase unit size, timeout and write protect group size definitions. + + + Boot area 1 is not protected + + + Boot area 1 is power on protected + + + Boot area 1 is permanently protected + + + Boot area 2 is not protected + + + Boot area 2 is power on protected + + + Boot area 2 is permanently protected + + + Boot area 2 is permanently write protected. + + + Boot area 1 is permanently write protected. + + + Both boot areas are permanently write protected. + + + Boot area 2 is write protected until next power cycle. + + + Boot area 1 is write protected until next power cycle. + + + Both boot areas are write protected until next power cycle. + + + Permanent write protection of boot areas is disabled. + + + Power cycled write protection of boot areas is disabled. + + + Use of password protection features is permanently disabled. + + + Use of permanent write protection is disabled. + + + Permanent write protection is disabled. + + + Power cycled write protection is disabled. + + + Permanent write protection will be applied to selected group. + + + Power cycled write protection will be applied to selected group. + + + Firmware updates are permanently disabled + + + Device has a {0} KiB replay protected memory block + + + Device supports partitioning features + + + Device can have enhanced technological features in partitions and user data area + + + Device can have extended partitions attribute. + + + Device natively uses 512 byte sectors + + + Device natively uses 4096 byte sectors + + + Device natively uses unknown sector size indicated by code {0} + + + Device is emulating 512 byte sectors + + + Device is using natively sized sectors + + + Device emulates unknown sector size indicated by code {0} + + + Device currently addresses 512 byte sectors + + + Device currently addresses 4096 byte sectors + + + Device currently addresses unknown sector size indicated by code {0} + + + Device's cache is enabled + + + Device has enabled command queuing + + + MultiMediaCard Operation Conditions Register: + + + Device is powering up + + + Device is byte addressed + + + Device is sector addressed + + + Unknown device access mode {0} + + + Device can work with supply 3.5~3.6V + + + Device can work with supply 3.4~3.5V + + + Device can work with supply 3.3~3.4V + + + Device can work with supply 3.2~3.3V + + + Device can work with supply 3.1~3.2V + + + Device can work with supply 2.9~3.0V + + + Device can work with supply 2.8~2.9V + + + Device can work with supply 2.7~2.8V + + + Device can work with supply 2.6~2.7V + + + Device can work with supply 2.5~2.6V + + + Device can work with supply 2.4~2.5V + + + Device can work with supply 2.3~2.4V + + + Device can work with supply 2.2~2.3V + + + Device can work with supply 2.1~2.2V + + + Device can work with supply 2.0~2.1V + + + Device can work with supply 1.65~1.95V + + + Unknown manufacturer ID 0x{0:X2} + + + PCMCIA Device Geometry Tuples: + + + Geometry: + + + Device width: {0} bits + + + Erase block: {0} bytes + + + Read block: {0} bytes + + + Write block: {0} bytes + + + Partition alignment: {0} bytes + + + PCMCIA Manufacturer Identification Tuple: + + + Manufacturer ID: {0} + + + Card ID: 0x{0:X4} + + + PCMCIA Level 1 Version / Product Information Tuple: + + + Card indicates compliance with PC Card Standard Release {0}.{1} + + + No manufacturer information string. + + + No product name string. + + + No additional information. + + + Additional information: + + + Unknown vendor id 0x{0:X4} + + + AACS Volume Identifier in hex follows: + + + AACS Media Serial Number in hex follows: + + + AACS Media Identifier in hex follows: + + + Total number of media key blocks available to transfer {0} + + + AACS Media Key Blocks in hex follows: + + + AACS Data Keys in hex follows: + + + Drive can store 256 LBA Extents + + + Drive cannot store LBA Extents + + + Drive can store {0} LBA Extents + + + LBA Extent {0} starts at LBA {1} and goes for {2} sectors + + + Total number of CPRM Media Key Blocks available to transfer: {0} + + + CPRM Media Key Blocks in hex follows: + + + Disc type declared as CD-DA or CD-ROM + + + Disc type declared as CD-i + + + Disc type declared as CD-ROM XA + + + Disc type is undefined + + + Unknown disc type {0:X2}h + + + Disc is incomplete + + + Disc is finalized + + + Disc is erasable + + + Last session is empty + + + Last session is incomplete + + + Last session is damaged + + + Last session is complete + + + Media was being formatted in the background but it is stopped and incomplete + + + Media is currently being formatted in the background + + + Media background formatting has completed + + + MRW is dirty + + + First track on disc is track {0} + + + Disc has {0} sessions + + + First track in last session is track {0} + + + Last track in last session is track {0} + + + Last session Lead-In address is {0} (as LBA) or {1:X2}:{2:X2}:{3:X2} + + + Last possible Lead-Out address is {0} (as LBA) or {1:X2}:{2:X2}:{3:X2} + + + Disc is defined for unrestricted use + + + Disc is defined for restricted use + + + Disc barcode: {0:X16} + + + Disc application code: {0} + + + OPC values for {0}Kbit/sec.: {1}, {2}, {3}, {4}, {5}, {6} + + + {0} maximum possible tracks on the disc + + + {0} assigned tracks on the disc + + + {0} maximum possible appendable tracks on the disc + + + {0} current appendable tracks on the disc + + + {0} remaining POW replacements + + + {0} remaining POW reallocation map entries + + + {0} remaining POW updates + + + Drive reported a reserved profile number + + + MMC Supported Profiles: + + + Drive supports non-removable changeable media + + + Drive supports rewritable and removable media + + + Drive supports Magneto-Optical media + + + Drive supports optical write-once media + + + Drive supports Advanced Storage - Magneto-Optical + + + Drive supports CD-ROM + + + Drive supports CD-R + + + Drive supports CD-RW + + + Drive supports DVD-ROM + + + Drive supports DVD-R + + + Drive supports DVD-RAM + + + Drive supports restricted overwrite DVD-RW + + + Drive supports sequentially recorded DVD-RW + + + Drive supports sequentially recorded DVD-R DL + + + Drive supports layer jump recorded DVD-R DL + + + Drive supports DVD-RW DL + + + Drive supports DVD-Download + + + Drive supports DVD+RW + + + Drive supports DVD+R + + + Drive supports DDCD-ROM + + + Drive supports DDCD-R + + + Drive supports DDCD-RW + + + Drive supports DVD+RW DL + + + Drive supports DVD+R DL + + + Drive supports BD-ROM + + + Drive supports BD-R SRM + + + Drive supports BD-R RRM + + + Drive supports BD-RE + + + Drive supports HD DVD-ROM + + + Drive supports HD DVD-R + + + Drive supports HD DVD-RAM + + + Drive supports HD DVD-RW + + + Drive supports HD DVD-R DL + + + Drive supports HD DVD-RW DL + + + Drive supports HDBurn CD-ROM + + + Drive supports HDBurn CD-R + + + Drive supports HDBurn CD-RW + + + Drive is not conforming to any profile + + + Drive informs of unknown profile 0x{0:X4} + + + (current) + + + MMC Core Feature: + + + Drive uses an unspecified physical interface + + + Drive uses a SCSI interface + + + Drive uses an ATAPI interface + + + Drive uses an IEEE-1394 interface + + + Drive uses an IEEE-1394A interface + + + Drive uses a Fibre Channel interface + + + Drive uses an IEEE-1394B interface + + + Drive uses a Serial ATAPI interface + + + Drive uses an USB interface + + + Drive uses a vendor unique interface + + + Drive uses an unknown interface with code {0} + + + Drive supports Device Busy events + + + Drive supports EVPD, Page Code and 16-bit Allocation Length as described in SPC-3 + + + MMC Morphing: + + + Drive supports polling and asynchronous GET EVENT STATUS NOTIFICATION + + + Drive supports only polling GET EVENT STATUS NOTIFICATION + + + Drive supports operational change request / notification class events + + + MMC Removable Medium: + + + Drive uses media caddy + + + Drive uses a tray + + + Drive is pop-up + + + Drive is a changer with individually changeable discs + + + Drive is a changer using cartridges + + + Drive uses unknown loading mechanism type {0} + + + Drive can lock media + + + Drive power ups locked + + + Drive can eject media + + + Drive can load media + + + Drive reports Device Busy Class events during medium loading/unloading + + + MMC Write Protect: + + + Drive supports reading/writing the Disc Write Protect PAC on BD-R/-RE media + + + Drive supports writing the Write Inhibit DCB on DVD+RW media + + + Drive supports set/release of PWP status + + + Drive supports the SWPP bit of the Timeout and Protect mode page + + + MMC Random Readable + + + Drive shall report Read/Write Error Recovery mode page + + + {0} bytes per logical block + + + {0} logical blocks per media readable unit + + + Drive claims capability to read all CD formats according to OSTA Multi-Read Specification + + + + MMC CD Read + + + Drive supports the DAP bit in the READ CD and READ CD MSF commands + + + Drive supports C2 Error Pointers + + + Drive can return CD-Text from Lead-In + + + MMC DVD Read + + + Drive can read DVD media + + + Drive can read DVD-R DL from all recording modes + + + Drive can read DVD-RW DL from all recording modes + + + Drive conforms to DVD Multi Drive Read-only Specifications + + + MMC Random Writable: + + + {0} logical blocks per media writable unit + + + Last addressable logical block is {0} + + + MMC Incremental Streaming Writable: + + + Drive supports data block types: + + + Drive claims support to report Track Resources Information + + + Drive supports address mode reservation on the RESERVE TRACK command + + + Drive is capable of zero loss linking + + + Drive supports media that require erasing before writing + + + MMC Formattable: + + + Drive can format media into logical blocks + + + Drive can format BD-RE with no spares allocated + + + Drive can expand the spare area on a formatted BD-RE disc + + + Drive can format BD-RE discs with quick certification + + + Drive can format BD-RE discs with full certification + + + Drive can fast re-format BD-RE discs + + + Drive can format BD-R discs with RRM format + + + MMC Hardware Defect Management: + + + Drive shall be able to provide a defect-free contiguous address space + + + Drive can return Spare Area Information + + + MMC Write Once + + + Drive shall have the ability to overwrite logical blocks only in fixed sets at a time + + + Drive can write High-Speed CD-RW + + + Drive can read and write CD-MRW and DVD+MRW + + + Drive can read and write DVD+MRW + + + Drive and read DVD+MRW and read and write CD-MRW + + + Drive can read and write CD-MRW + + + Drive can read CD-MRW and DVD+MRW + + + Drive can read CD-MRW + + + MMC Enhanced Defect Reporting Feature: + + + Drive supports DRT-DM mode + + + Drive supports Persistent-DM mode + + + Drive has {0} DBI cache zones + + + Drive has {0} DBI entries + + + Drive can read and write DVD+RW + + + Drive supports only the read compatibility stop + + + Drive supports both forms of background format stopping + + + Drive can do a quick start formatting + + + Drive can read DVD+RW + + + Drive can read and write DVD+R + + + Drive can read DVD+R + + + MMC Rigid Restricted Overwrite + + + Drive supports the BLANK command + + + Drive supports writing on an intermediate state session and quick formatting + + + Drive can read Defect Status data recorded on the medium + + + Drive can generate Defect Status data during formatting + + + Drive can write CDs in Track at Once Mode: + + + Drive can write user provided data in the R-W subchannels + + + Drive accepts RAW R-W subchannel data + + + Drive accepts Packed R-W subchannel data + + + Drive can overwrite a TAO track with another in CD-RWs + + + Drive can do a test writing + + + Drive supports zero loss linking + + + Drive can write CDs in Session at Once Mode: + + + Drive can write CDs in raw Mode: + + + Drive can write CDs in Session at Once and in Raw Modes: + + + Drive can write multi-session CDs in raw mode + + + Drive supports a maximum of {0} bytes in a single cue sheet + + + Drive supports writing DVD-R, DVD-RW and DVD-R DL + + + Drive supports writing DVD-R and DVD-R DL + + + Drive supports writing DVD-R and DVD-RW + + + Drive supports writing DVD-R + + + Drive can read DDCDs + + + Drive supports writing DDCD-R + + + Drive supports writing DDCD-RW + + + Drive supports quick formatting + + + MMC Layer Jump Recording: + + + Current media has a {0} bytes link available + + + Drive can stop a long immediate operation + + + Drive can write CD-RW + + + Drive supports CD-RW subtypes + + + Drive can write BD-R on Pseudo-OVerwrite SRM mode + + + Drive can read and write DVD+RW DL + + + Drive can read DVD+RW DL + + + Drive can read and write DVD+R DL + + + Drive can read DVD+R DL + + + MMC BD Read + + + Drive can read BD-ROM pre-1.0 + + + Drive can read BD-ROM Ver.1 + + + Drive can read BD-R pre-1.0 + + + Drive can read BD-R Ver.1 + + + Drive can read BD-RE pre-1.0 + + + Drive can read BD-RE Ver.1 + + + Drive can read BD-RE Ver.2 + + + Drive can read BD's Burst Cutting Area + + + MMC BD Write + + + Drive can write BD-R pre-1.0 + + + Drive can write BD-R Ver.1 + + + Drive can write BD-RE pre-1.0 + + + Drive can write BD-RE Ver.1 + + + Drive can write BD-RE Ver.2 + + + Drive supports write without verify requirement + + + Drive is able to detect and report defective writable unit and behave accordingly + + + Drive can read HD DVD-ROM, HD DVD-RW, HD DVD-R and HD DVD-RAM + + + Drive can read HD DVD-ROM, HD DVD-RW and HD DVD-R + + + Drive can read HD DVD-ROM, HD DVD-RW and HD DVD-RAM + + + Drive can read HD DVD-ROM and HD DVD-RW + + + Drive can write HD DVD-RW, HD DVD-R and HD DVD-RAM + + + Drive can write HD DVD-RW and HD DVD-R + + + Drive can write HD DVD-RW and HD DVD-RAM + + + Drive can write HD DVD-RW + + + Drive is able to access Hybrid discs + + + Drive is able to maintain the online format layer through reset and power cycling + + + Drive is able to perform host and drive directed power management + + + Drive supports S.M.A.R.T. + + + Drive supports the Informational Exceptions Control mode page 1Ch + + + MMC Embedded Changer: + + + Drive can change disc side + + + Drive is able to report slots contents after a reset or change + + + Drive has {0} slots + + + Drive has an analogue audio output + + + Drive supports the SCAN command + + + Drive is able to mute channels separately + + + Drive supports separate volume per channel + + + Drive has {0} volume levels + + + Drive supports Microcode Upgrade + + + Drive supports validating the 5-bit Mode of the READ BUFFER and WRITE BUFFER commands + + + Drive supports Timeout & Protect mode page 1Dh + + + Drive supports the Group3 in Timeout & Protect mode page 1Dh + + + Drive has {0} increase of Group 3 time unit + + + Drive supports DVD CSS/CPPM version {0} and current disc is encrypted + + + Drive supports DVD CSS/CPPM version {0} + + + MMC Real Time Streaming: + + + Drive supports Set Minimum Performance with the SET STREAMING command + + + Drive supports the block bit in the READ BUFFER CAPACITY command + + + Drive supports the SET CD SPEED command + + + Drive supports the Write Speed Performance Descriptor Blocks in the MMC mode page 2Ah + + + Drive supports the Write Speed data of GET PERFORMANCE and the WRC field of SET STREAMING + + + Drive supports stream recording + + + Drive is able to read media serial number + + + Drive supports DCB {0:X8}h + + + Drive supports DVD CPRM version {0} and current disc is or can be encrypted + + + Drive supports DVD CPRM version {0} + + + Drive firmware is dated {0} + + + Drive supports AACS version {0} and current disc is encrypted + + + Drive supports AACS version {0} + + + Drive supports reading the Drive Certificate + + + Drive supports reading Media Key Block of CPRM + + + Drive supports writing with bus encryption + + + Drive supports bus encryption + + + Drive supports generating the binding nonce + + + {0} media blocks are required for the binding nonce + + + Drive supports {0} AGIDs concurrently + + + Maximum {0} scramble extent information entries + + + Drive and currently inserted media support VCPS + + + Drive supports VCPS + + + Drive and currently inserted media support SecurDisc + + + Drive supports SecurDisc + + + Drive supports the Trusted Computing Group Optical Security Subsystem Class + + + Current media is initialized with TCG OSSC + + + Drive supports PSA updates on write-once media + + + Drive supports linked OSPBs + + + Drive will only record on the OSSC Disc Format + + + Profile {0}: {1} + + + {0} format layers recognized + + + Layer {0} is of type Blu-ray + + + This is the default layer. + + + This is the layer actually in use. + + + Layer {0} is of type CD + + + Layer {0} is of type DVD + + + Layer {0} is of type HD DVD + + + Layer {0} is of unknown type 0x{1:X4} + + + Writing inhibited by media specific reason + + + Cartridge sets write protection + + + Media surface sets write protection + + + Software write protection is set until power down + + + Reserved4 = 0x{0:X2} + + + Reserved5 = 0x{0:X2} + + + Reserved6 = 0x{0:X2} + + + SCSI Control mode page: + + + Parameters can be saved + + + If set, target shall report log exception conditions + + + Tagged queuing is disabled + + + Extended Contingent Allegiance is enabled + + + Target may issue an asynchronous event notification upon completing its initialization + + + Target may issue an asynchronous event notification instead of a unit attention condition + + + Target may issue an asynchronous event notification instead of a deferred error + + + Global logging target save disabled + + + CHECK CONDITION should be reported rather than a long busy condition + + + Tasks aborted by other initiator's actions should be terminated with TASK ABORTED + + + All tasks received in nexus with ACA ACTIVE is set and an ACA condition is established shall terminate + + + Device shall return descriptor format sense data when returning sense data in the same transactions as a CHECK CONDITION + + + LOGICAL BLOCK APPLICATION TAG should not be modified + + + Protector information checking is disabled + + + No unit attention on release + + + Application Tag mode page is enabled + + + Abort any write command without protection information + + + Supports block lengths and protection information + + + The logical unit maintains one task set for all nexuses + + + The logical unit maintains separate task sets for each nexus + + + Unknown Task set type {0} + + + Commands should be sent strictly ordered + + + Commands can be reordered in any manner + + + Unknown Queue Algorithm Modifier {0} + + + If ACA is established, the task set commands shall resume after it is cleared, otherwise they shall terminate with CHECK CONDITION + + + All the affected commands in the task set shall be aborted when CHECK CONDITION is returned + + + Affected commands in the task set belonging with the CHECK CONDITION nexus shall be aborted + + + Reserved QErr value 2 is set + + + LUN shall clear unit attention condition reported in the same nexus + + + LUN shall not clear unit attention condition reported in the same nexus + + + LUN shall not clear unit attention condition reported in the same nexus and shall establish a unit attention condition for the initiator + + + Reserved UA_INTLCK_CTRL value 1 is set + + + On medium insertion, it shall be loaded for full access + + + On medium insertion, it shall be loaded for auxiliary memory access only + + + On medium insertion, it shall not be loaded + + + Reserved autoload mode {0} set + + + {0} ms before attempting asynchronous event notifications after initialization + + + There is no limit on the maximum time that is allowed to remain busy + + + A maximum of {0} ms are allowed to remain busy + + + {0} seconds to complete extended self-test + + + SCSI Control extension page: + + + Timestamp can be initialized by methods outside of the SCSI standards + + + Timestamp can be initialized by methods outside of the SCSI standards, but SCSI's SET TIMESTAMP shall take precedence over them + + + Implicit Asymmetric Logical Unit Access is enabled + + + Initial priority is {0} + + + Device will not degrade performance to extend its life + + + Maximum sense data would be {0} bytes + + + SCSI Medium types supported page: + + + Supported medium type one: {0} + + + Supported medium type two: {0} + + + Supported medium type three: {0} + + + Supported medium type four: {0} + + + SCSI CD-ROM parameters page: + + + Drive will remain in track hold state a vendor-specified time after a seek or read + + + Drive will remain in track hold state 125 ms after a seek or read + + + Drive will remain in track hold state 250 ms after a seek or read + + + Drive will remain in track hold state 500 ms after a seek or read + + + Drive will remain in track hold state 1 second after a seek or read + + + Drive will remain in track hold state 2 seconds after a seek or read + + + Drive will remain in track hold state 4 seconds after a seek or read + + + Drive will remain in track hold state 8 seconds after a seek or read + + + Drive will remain in track hold state 16 seconds after a seek or read + + + Drive will remain in track hold state 32 seconds after a seek or read + + + Drive will remain in track hold state 1 minute after a seek or read + + + Drive will remain in track hold state 2 minutes after a seek or read + + + Drive will remain in track hold state 4 minutes after a seek or read + + + Drive will remain in track hold state 8 minutes after a seek or read + + + Drive will remain in track hold state 16 minutes after a seek or read + + + Drive will remain in track hold state 32 minutes after a seek or read + + + Each minute has {0} seconds + + + Each second has {0} frames + + + SCSI CD-ROM audio control parameters page: + + + Drive will return from playback command immediately + + + Drive will return from playback command when playback ends + + + Drive will stop playback on track end + + + There are {0} blocks per each second of audio + + + Output port 0 has channels + + + muted + + + at maximum volume + + + at volume {0} + + + Output port 1 has channels + + + Output port 2 has channels + + + Output port 3 has channels + + + SCSI Data compression page: + + + Drive supports data compression + + + Data compression is enabled with + + + IBM ALDC with 512 byte buffer + + + IBM ALDC with 1024 byte buffer + + + IBM ALDC with 2048 byte buffer + + + IBM IDRC + + + DCLZ + + + an unregistered compression algorithm + + + an unknown algorithm coded {0} + + + Data decompression is enabled + + + Last data read was uncompressed + + + Last data read was compressed with + + + Report exception on compression is set to {0} + + + Drive does not support data compression + + + SCSI Drive Operation Mode page: + + + Verifying after writing is disabled + + + Drive will abort when a writing error is detected + + + Drive has two LUNs with rewritable being + + + SCSI Power Consumption page: + + + Device power consumption is dictated by identifier {0} of Power Consumption VPD + + + Device is in highest relative power consumption level + + + Device is in intermediate relative power consumption level + + + Device is in lowest relative power consumption level + + + SCSI Removable Block Access Capabilities page: + + + Drive can be used as a system floppy device + + + Drive supports reporting progress of format + + + Drive is a Non-CD Optical Device + + + Device is a dual device supporting CD and Non-CD Optical + + + Drive supports {0} LUNs + + + SCSI Informational exceptions control page: + + + Informational exceptions are disabled + + + Informational exceptions are enabled + + + No reporting of informational exception condition + + + Asynchronous event reporting of informational exceptions + + + Generate unit attention on informational exceptions + + + Conditionally generate recovered error on informational exceptions + + + Unconditionally generate recovered error on informational exceptions + + + Generate no sense on informational exceptions + + + Only report informational exception condition on request + + + Unknown method of reporting {0} + + + Informational exceptions reporting should not affect drive performance + + + A test informational exception will raise on next timer + + + Drive shall log informational exception conditions + + + Timer interval is vendor-specific + + + Timer interval is {0} ms + + + Informational exception conditions will be reported a maximum of {0} times + + + Warning reporting is enabled + + + Background functions are enabled + + + Drive will report background self-test errors + + + SCSI Background Control page: + + + Background scans will be halted if log is full + + + Background scans will only be logged if they require intervention + + + Background medium scans are enabled + + + Background pre-scans are enabled + + + {0} hours shall be between the start of a background scan operation and the next + + + Background pre-scan operations can take a maximum of {0} hours + + + At least {0} ms must be idle before resuming a suspended background scan operation + + + At most {0} ms must be before suspending a background scan operation and processing received commands + + + SCSI Timer & Protect page: + + + Drive is disabled until power is cycled + + + Drive is software write-protected until powered down + + + Drive will remain in same status a vendor-specified time after a seek, read or write operation + + + Drive will remain in same status 125 ms after a seek, read or write operation + + + Drive will remain in same status 250 ms after a seek, read or write operation + + + Drive will remain in same status 500 ms after a seek, read or write operation + + + Drive will remain in same status 1 second after a seek, read or write operation + + + Drive will remain in same status 2 seconds after a seek, read or write operation + + + Drive will remain in same status 4 seconds after a seek, read or write operation + + + Drive will remain in same status 8 seconds after a seek, read or write operation + + + Drive will remain in same status 16 seconds after a seek, read or write operation + + + Drive will remain in same status 32 seconds after a seek, read or write operation + + + Drive will remain in same status 1 minute after a seek, read or write operation + + + Drive will remain in same status 2 minutes after a seek, read or write operation + + + Drive will remain in same status 4 minutes after a seek, read or write operation + + + Drive will remain in same status 8 minutes after a seek, read or write operation + + + Drive will remain in same status 16 minutes after a seek, read or write operation + + + Drive will remain in same status 32 minutes after a seek, read or write operation + + + SCSI Medium Configuration Mode Page: + + + Drive is operating in WORM mode + + + Drive does not allow any logical blocks to be overwritten + + + Drive allows a tape header to be overwritten + + + Drive allows all format labels to be overwritten + + + Unknown WORM mode label restrictions code {0} + + + SCSI Read-write error recovery page: + + + Automatic write reallocation is enabled + + + Automatic read reallocation is enabled + + + Data not recovered within limits shall be transferred back before a CHECK CONDITION + + + Drive will transfer the entire requested length without delaying to perform error recovery + + + Drive will use the most expedient form of error recovery first + + + Drive shall report recovered errors + + + Transfer will be terminated upon error detection + + + Error correction is disabled + + + Drive will repeat read operations {0} times + + + Drive will repeat write operations {0} times + + + Drive will employ a maximum of {0} ms to recover data + + + Logical block provisioning error reporting is enabled + + + SCSI Read error recovery page for MultiMedia Devices: + + + All available recovery procedures will be used. + + + Only retries and CIRC are used. + + + Only retries are used. + + + Recovered errors will not be reported. + + + Recovered errors will be reported. + + + Recovered errors will be reported and aborted with CHECK CONDITION. + + + Unrecovered ECC errors will return CHECK CONDITION. + + + Unrecovered CIRC errors will return CHECK CONDITION. + + + Unrecovered ECC errors will not abort the transfer. + + + Unrecovered CIRC errors will not abort the transfer. + + + Unrecovered ECC errors will return CHECK CONDITION and the uncorrected data. + + + Unrecovered CIRC errors will return CHECK CONDITION and the uncorrected data. + + + Unknown recovery parameter 0x{0:X2} + + + SCSI CD-ROM capabilities page: + + + Drive can play audio + + + Drive can read sectors in Mode 2 Form 1 format + + + Drive can read sectors in Mode 2 Form 2 format + + + Drive supports multi-session discs and/or Photo-CD + + + Drive can read digital audio + + + Drive can continue from streaming loss + + + Drive can read uncorrected and interleaved R-W subchannels + + + Drive can read, deinterleave and correct R-W subchannels + + + Drive supports C2 pointers + + + Drive can read Media Catalogue Number + + + Drive can read ISRC + + + Drive uses media caddy + + + Drive uses a tray + + + Drive is pop-up + + + Drive is a changer with individually changeable discs + + + Drive is a changer using cartridges + + + Drive uses unknown loading mechanism type {0} + + + Drive can lock media + + + Drive power ups locked + + + Drive is locked, media cannot be ejected or inserted + + + Drive is not locked, media can be ejected and inserted + + + Drive is locked, media cannot be ejected, but if empty, can be inserted + + + Drive can eject media + + + Each channel can be muted independently + + + Each channel's volume can be controlled independently + + + Drive supports {0} volume levels + + + Drive has {0} Kbyte of buffer + + + Drive's maximum reading speed is {0} Kbyte/sec. + + + Drive's current reading speed is {0} Kbyte/sec. + + + Drive can read and write CD-R + + + Drive can read CD-R + + + Drive supports reading CD-R packet media + + + Drive can read and write CD-RW + + + Drive can read CD-RW + + + Drive can read DVD-ROM + + + Drive can read and write DVD-R + + + Drive can read DVD-R + + + Drive can read and write DVD-RAM + + + Drive can read DVD-RAM + + + Drive can deliver a composite audio and video data stream + + + Drive supports IEC-958 digital output on port 1 + + + Drive supports IEC-958 digital output on port 2 + + + Drive contains a changer that can report the exact contents of the slots + + + Drive's current writing speed is {0} Kbyte/sec. in CLV mode + + + Drive's current writing speed is {0} Kbyte/sec. in pure CAV mode + + + Drive's maximum writing speed is {0} Kbyte/sec. + + + Drive's current writing speed is {0} Kbyte/sec. + + + Drive supports writing at {0} Kbyte/sec. in CLV mode + + + Drive supports writing at {0} Kbyte/sec. in pure CAV mode + + + Drive supports test writing + + + Drive can read barcode + + + Drive can read both sides of a disc + + + Drive can read raw R-W subchannel from the Lead-In + + + Drive supports DVD CSS and/or DVD CPPM + + + Drive supports buffer under-run free recording + + + IBM Behaviour Configuration Mode Page: + + + Fence behaviour is normal + + + Panic fence behaviour is enabled + + + Unknown fence behaviour code {0} + + + Cleaning behaviour is normal + + + Drive will periodically request cleaning + + + Unknown cleaning behaviour code {0} + + + WORM emulation is disabled + + + WORM emulation is enabled + + + Unknown WORM emulation code {0} + + + Uses 35-bytes sense data + + + Uses 96-bytes sense data + + + Unknown sense data behaviour code {0} + + + Drive will set CHECK CONDITION when cleaning is needed + + + No deferred error will be reported to a rewind command + + + Drive will set CHECK CONDITION when the criteria for Dead Media is met + + + Drive will not accept downlevel firmware via an FMR tape + + + Drive will eject cleaning cartridges on error + + + Drive will eject firmware cartridges on error + + + Drive will eject data cartridges on error + + + SCSI Disconnect-Reconnect mode page: + + + {0} ratio of buffer that shall be full prior to attempting a reselection + + + {0} ratio of buffer that shall be empty prior to attempting a reselection + + + {0} µs maximum permitted to assert BSY without a REQ/ACK handshake + + + {0} µs maximum permitted wait after releasing the bus before attempting reselection + + + {0} µs allowed to use the bus before disconnecting, if granted the privilege and not restricted + + + {0} bytes maximum can be transferred before disconnecting + + + {0} bytes maximum can be transferred for a command along with the disconnect command + + + Target shall not transfer data for a command during the same interconnect tenancy + + + Target is allowed to re-order the data transfer + + + Data transfer disconnect control is not used + + + All data for a command shall be transferred within a single interconnect tenancy + + + All data and the response for a command shall be transferred within a single interconnect tenancy + + + Reserved data transfer disconnect control value {0} + + + HP Serial Number Override Mode Page: + + + Serial number is the manufacturer's default value + + + Serial number is not the manufacturer's default value + + + Serial number: {0} + + + HP Device Time Mode Page: + + + Drive has been powered up {0} times + + + Drive has been powered up since {0} seconds ago this time + + + Drive has been powered up a total of {0} seconds + + + Drive's date/time is: {0} + + + Drive's time is UTC + + + Drive's time is synchronized with a NTP source + + + Library time is {0} + + + HP Extended Reset Mode Page: + + + Normal reset behaviour + + + Drive will flush and position itself on a LUN or target reset + + + Drive will maintain position on a LUN or target reset + + + IBM LEOT Mode Page: + + + {0} wraps + + + Fujitsu Verify Control Page: + + + Audio/Visual data support mode is applied + + + Test write operation is restricted during read or write operations. + + + Always apply the verify operation + + + Never apply the verify operation + + + Apply the verify operation depending on the condition + + + The device type that would be provided in the INQUIRY response is {0} + + + HP CD-ROM Emulation/Disaster Recovery Mode Page: + + + Drive is emulating a CD-ROM drive + + + Drive is not emulating a CD-ROM drive + + + Drive will not exit emulation automatically + + + SCSI Format device page: + + + {0} tracks per zone to use in dividing the capacity for the purpose of allocating alternate sectors + + + {0} sectors per zone that shall be reserved for defect handling + + + {0} tracks per zone that shall be reserved for defect handling + + + {0} tracks per LUN that shall be reserved for defect handling + + + {0} physical sectors per track + + + {0} Bytes per physical sector + + + Target-dependent interleave value is {0} + + + {0} sectors between last block of one track and first block of the next + + + {0} sectors between last block of a cylinder and first block of the next one + + + Drive supports soft-sectoring format + + + Drive supports hard-sectoring format + + + Drive media is removable + + + Sector addressing is progressively incremented in one surface before going to the next + + + Sector addressing is progressively incremented in one cylinder before going to the next + + + SCSI Rigid disk drive geometry page: + + + {0} heads + + + {0} cylinders + + + Write pre-compensation starts at cylinder {0} + + + Write current reduction starts at cylinder {0} + + + Drive steps in {0} ns + + + Heads park in cylinder {0} + + + Medium rotates at {0} rpm + + + Spindle synchronization is disabled or unsupported + + + Target operates as a synchronized-spindle slave + + + Target operates as a synchronized-spindle master + + + Target operates as a synchronized-spindle master control + + + SCSI Flexible disk page: + + + Transfer rate: {0} kbit/s + + + {0} sectors per track + + + {0} bytes per sector + + + Drive steps in {0} μs + + + Each step pulse is {0} ms + + + Heads settles in {0} μs + + + Target shall wait {0} seconds before attempting to access the medium after motor on is asserted + + + Target shall wait {0} seconds after drive is ready before aborting medium access attempts + + + Target shall wait {0} seconds before releasing the motor on signal after becoming idle + + + Target shall never release the motor on signal + + + There is a drive ready signal + + + Sectors start at 1 + + + The motor on signal shall remain released + + + Drive needs to do {0} step pulses per cylinder + + + Write pre-compensation is {0} + + + Head takes {0} ms to load + + + Head takes {0} ms to unload + + + Pin 34 is unconnected + + + Pin 34 indicates drive is ready when active high + + + Pin 34 indicates drive is ready when active low + + + Pin 34 indicates disk has changed when active high + + + Pin 34 indicates disk has changed when active low + + + Pin 34 indicates unknown function {0} when active high + + + Pin 34 indicates unknown function {0} when active low + + + Pin 4 is unconnected + + + Pin 4 indicates drive is in use when active high + + + Pin 4 indicates drive is in use when active low + + + Pin 4 indicates eject when active high + + + Pin 4 indicates eject when active low + + + Pin 4 indicates head load when active high + + + Pin 4 indicates head load when active low + + + Pin 4 indicates unknown function {0} when active high + + + Pin 4 indicates unknown function {0} when active low + + + Pin 2 is unconnected + + + Pin 2 indicates unknown function {0} when active high + + + Pin 2 indicates unknown function {0} when active low + + + Pin 1 is unconnected + + + Pin 1 indicates disk change reset when active high + + + Pin 1 indicates disk change reset when active low + + + Pin 1 indicates unknown function {0} when active high + + + Pin 1 indicates unknown function {0} when active low + + + SCSI optical memory: + + + On reading an updated block drive will return RECOVERED ERROR + + + SCSI Verify error recovery page: + + + Drive will repeat verify operations {0} times + + + SCSI Verify error recovery page for MultiMedia Devices: + + + SCSI Caching mode page: + + + Read-cache is enabled + + + Write-cache is enabled + + + Drive does not distinguish between cached read data + + + Data put by READ commands should be evicted from cache sooner than data put in read cache by other means + + + Data put by READ commands should not be evicted if there is data cached by other means that can be evicted + + + Unknown demand read retention priority value {0} + + + Drive does not distinguish between cached write data + + + Data put by WRITE commands should be evicted from cache sooner than data put in write cache by other means + + + Data put by WRITE commands should not be evicted if there is data cached by other means that can be evicted + + + Unknown demand write retention priority value {0} + + + Read-ahead is disabled + + + Pre-fetch values indicate a block multiplier + + + No pre-fetch will be done + + + Pre-fetch will be done for READ commands of {0} blocks or less + + + At least {0} blocks will be always pre-fetched + + + A maximum of {0} blocks will be pre-fetched + + + A maximum of {0} blocks will be pre-fetched even if it is commanded to pre-fetch more + + + Device should use number of cache segments or cache segment size for caching + + + Pre-fetch should be aborted upon receiving a new command + + + Caching analysis is permitted + + + Pre-fetch can continue across discontinuities (such as cylinders or tracks) + + + Drive should not reorder the sequence of write commands to be faster + + + Drive cache segments should be {0} blocks long + + + Drive cache segments should be {0} bytes long + + + Drive should have {0} cache segments + + + Drive shall allocate {0} bytes to buffer even when all cached data cannot be evicted + + + Non-Volatile cache is disabled + + + SCSI XOR control mode page: + + + XOR operations are disabled + + + Drive accepts a maximum of {0} blocks in a single XOR WRITE command + + + Drive accepts a maximum of {0} blocks in a REGENERATE command + + + Drive accepts a maximum of {0} blocks in a READ command during rebuild + + + Drive needs a minimum of {0} ms between READ commands during rebuild + + + SCSI Device configuration page: + + + Active format: {0} + + + Active partition: {0} + + + Write buffer shall have a full ratio of {0} before being flushed to medium + + + Read buffer shall have an empty ratio of {0} before more data is read from medium + + + Drive will delay {0} ms before buffered data is forcefully written to the medium even before buffer is full + + + Drive supports recovering data from buffer + + + Recovered buffer data comes in LIFO order + + + Recovered buffer data comes in FIFO order + + + Medium supports block IDs + + + Drive reports setmarks + + + Drive will pre-read until buffer is full + + + Drive will pre-read until one filemark is detected + + + Drive will pre-read until two filemark is detected + + + Drive will pre-read until three filemark is detected + + + Drive reports early warnings + + + Drive will synchronize buffer to medium on early warnings + + + Inter-block gap is long enough to support update in place + + + Inter-block gap is {0} times the device's defined gap size + + + Inter-block gap is unknown value {0} + + + Drive generates end-of-data + + + Drive does not use compression + + + Drive uses default compression + + + Drive uses unknown compression {0} + + + Software write protect is enabled + + + Associated write protect is enabled + + + Persistent write protect is enabled + + + Permanent write protect is enabled + + + Drive operates using explicit address mode + + + Drive operates using implicit address mode + + + Drive shall position to beginning of default data partition on reset + + + Drive shall maintain its position on reset + + + Drive will do nothing on WORM tampered medium + + + Drive will return CHECK CONDITION on WORM tampered medium + + + Drive will only respond to commands if it has received a reservation + + + SCSI medium partition page: + + + {0} maximum additional partitions + + + {0} additional partitions defined + + + Partitions are fixed under device definitions + + + Number of partitions can be defined but their size is defined by the device + + + Number and size of partitions can be manually defined + + + Partition parameters will not be applied until a FORMAT MEDIUM command is received + + + Device may erase any or all partitions on MODE SELECT for partitioning + + + Device shall erase all partitions on MODE SELECT for partitioning + + + Device shall not erase any partition on MODE SELECT for partitioning + + + Device shall erase all partitions differing on size on MODE SELECT for partitioning + + + Partitions are defined in bytes + + + bytes + + + Partitions are defined in kilobytes + + + kilobytes + + + Partitions are defined in megabytes + + + megabytes + + + Partitions are defined in units of {0} bytes + + + units of {0} bytes + + + Unknown partition size unit code {0} + + + units + + + Device is capable of recognizing both medium partitions and format + + + Device is capable of recognizing medium format + + + Device is capable of recognizing medium partitions + + + Device is not capable of recognizing neither medium partitions nor format + + + Unknown medium recognition code {0} + + + Medium has defined {0} partitions + + + Device recognizes one single partition spanning whole medium + + + Partition {0} runs for rest of medium + + + Partition {0} is {1} {2} long + + + SCSI medium partition page (extra): + + + Partition {0} is {1} units long + + + Certance Drive Capabilities Control Mode Page: + + + Operating systems support is standard LTO + + + Operating systems support is unknown code {0} + + + Factory test code is disabled + + + Factory test code 1 is disabled + + + Factory test code 2 is disabled + + + Unknown factory test code {0} + + + Power-On Self-Test is enabled + + + Power-On Self-Test is disabled + + + Unknown Power-On Self-Test code {0} + + + Compression is controlled using mode pages 0Fh and 10h + + + Compression is enabled and not controllable + + + Compression is disabled and not controllable + + + Unknown compression control code {0} + + + SCSI UNLOAD command will not eject the cartridge + + + How should tapes be unloaded in a power cycle, tape incompatibility, firmware download or cleaning end: + + + Tape will stay threaded at beginning + + + Tape will be unthreaded + + + Tape will be unthreaded and unloaded + + + Data tapes will be threaded at beginning, rest will be unloaded + + + Unknown auto unload code {0} + + + Certance Interface Control Mode Page: + + + Library interface will operate at 9600 baud on next reset + + + Library interface will operate at 19200 baud on next reset + + + Library interface will operate at 38400 baud on next reset + + + Library interface will operate at 57600 baud on next reset + + + Library interface will operate at 115200 baud on next reset + + + Unknown library interface baud rate code {0} + + + Library interface transmits 2 stop bits per byte + + + Library interface transmits 1 stop bits per byte + + + Port A uses Parallel SCSI Ultra-160 interface + + + Drive will respond to SCSI ID {0} on Port A enabling + + + Drive jumpers choose SCSI ID {0} + + + SCSI port is enabled + + + SCSI port is disabled + + + SCSI port will be enabled on next power up + + + SCSI port will be disabled on next power up + + + IBM Vendor-Specific Control Mode Page: + + + Vendor-specific mode control: {0} + + + Vendor-specific velocity setting: {0} + + + Drive supports encryption + + + Drive has encryption enabled + + + ECMA-54: 200 mm Flexible Disk Cartridge using Two-Frequency Recording at 13262 ftprad on One Side + + + ECMA-59 & ANSI X3.121-1984: 200 mm Flexible Disk Cartridge using Two-Frequency Recording at 13262 ftprad on Both Sides + + + ECMA-69: 200 mm Flexible Disk Cartridge using MFM Recording at 13262 ftprad on Both Sides + + + ECMA-66: 130 mm Flexible Disk Cartridge using Two-Frequency Recording at 7958 ftprad on One Side + + + ECMA-70 & ANSI X3.125-1985: 130 mm Flexible Disk Cartridge using MFM Recording at 7958 ftprad on Both Sides; 1.9 Tracks per mm + + + ECMA-78 & ANSI X3.126-1986: 130 mm Flexible Disk Cartridge using MFM Recording at 7958 ftprad on Both Sides; 3.8 Tracks per mm + + + ECMA-99 & ISO 8630-1985: 130 mm Flexible Disk Cartridge using MFM Recording at 13262 ftprad on Both Sides; 3.8 Tracks per mm + + + ECMA-100 & ANSI X3.137: 90 mm Flexible Disk Cartridge using MFM Recording at 7859 ftprad on Both Sides; 5.3 Tracks per mm + + + ANSI X3.73-1980: 200 mm, 6631 ftprad, 1.9 Tracks per mm, 1 side + + + ANSI X3.73-1980: 200 mm, 6631 ftprad, 1.9 Tracks per mm, 2 sides + + + ANSI X3.80-1980: 130 mm, 3979 ftprad, 1.9 Tracks per mm, 1 side + + + 3.5-inch, 135 tpi, 12362 bits/radian, double-sided MFM (aka 1.25Mb) + + + 3.5-inch, 135 tpi, 15916 bits/radian, double-sided MFM (aka 1.44Mb) + + + a Read-only optical + + + a Write-once Read-many optical + + + a Erasable optical + + + a combination of read-only and write-once optical + + + a direct-overwrite optical + + + a Sony Hi-MD disc + + + SCSI Mode Sense Header: + + + Medium is {0} + + + Medium is write protected + + + Drive supports DPO and FUA bits + + + 7958 flux transitions per radian + + + 13262 flux transitions per radian + + + 15916 flux transitions per radian + + + with unknown density code 0x{0:X2} + + + All remaining blocks have {0} and are {1} bytes each + + + {0} blocks have {1} and are {2} bytes each + + + All remaining blocks are {0} bytes each + + + {0} blocks are {1} bytes each + + + Device writes directly to media + + + Device uses a write cache + + + Device uses a write cache but doesn't return until cache is flushed + + + Unknown buffered mode code 0x{0:X2} + + + Device uses default speed + + + Device uses speed {0} + + + undefined + + + 6.3 mm tape with 12 tracks at 394 ftpmm or DC-9250 + + + 6.3 mm tape with 24 tracks at 394 ftpmm or MLR1-26GBSL + + + LTO Ultrium WORM or cleaning cartridge + + + LTO Ultrium + + + LTO Ultrium-2 + + + DC-2900SL + + + MLR1-26GB or DDS-3 + + + DC-9200 or DDS-4 + + + DAT-72 + + + LTO Ultrium-3 + + + LTO Ultrium-3 WORM + + + DDS cleaning cartridge + + + SLR-32 + + + SLRtape-50 + + + LTO Ultrium-4 + + + LTO Ultrium-4 WORM + + + SLRtape-50 SL + + + SLR-32SL + + + SLR-5 + + + SLR-5SL + + + LTO Ultrium-5 + + + LTO Ultrium-5 WORM + + + SLRtape-7 + + + SLRtape-7 SL + + + SLRtape-24 + + + SLRtape-24 SL + + + LTO Ultrium-6 + + + LTO Ultrium-6 WORM + + + SLRtape-140 + + + SLRtape-40 + + + SLRtape-60 or SLRtape-75 + + + SLRtape-100 + + + SLR-40, SLR-60 or SLR-100 + + + LTO Ultrium-7 + + + LTO Ultrium-7 WORM + + + Exatape 15m, IBM MagStar or VXA + + + CompactTape I, Exatape 28m, CompactTape II, VXA-2 or VXA-3 + + + Exatape 54m or DLTtape III + + + Exatape 80m or DLTtape IIIxt + + + Exatape 106m, DLTtape IV or Travan 5 + + + Exatape 160m XL or Super DLTtape I + + + Super DLTtape II + + + VStape I + + + DLTtape S4 + + + Travan 7 + + + Exatape 22m + + + Exatape 40m + + + Exatape 76m + + + Exatape 112m + + + Exatape 22m AME + + + Exatape 170m + + + Exatape 125m + + + Exatape 45m + + + Exatape 225m + + + Exatape 150m + + + Exatape 75m + + + unknown medium type 0x{0:X2} + + + ECMA-62 & ANSI X3.22-1983: 12.7 mm 9-Track Magnetic Tape, 32 ftpmm, NRZI, 32 cpmm + + + ECMA-62 & ANSI X3.39-1986: 12.7 mm 9-Track Magnetic Tape, 126 ftpmm, Phase Encoding, 63 cpmm + + + ECMA-62 & ANSI X3.54-1986: 12.7 mm 9-Track Magnetic Tape, 356 ftpmm, NRZI, 245 cpmm GCR + + + ECMA-79 & ANSI X3.116-1986: 6.30 mm Magnetic Tape Cartridge, 252 ftpmm, MFM + + + Draft ECMA & ANSI X3B5/87-099: 12.7 mm 18-Track Magnetic Tape Cartridge, 1944 ftpmm, IFM, GCR (IBM 3480, 3490, 3490E) + + + ECMA-46 & ANSI X3.56-1986: 6.30 mm Magnetic Tape Cartridge, Phase Encoding, 63 bpmm + + + ECMA-98: 6.30 mm Magnetic Tape Cartridge, NRZI, 394 ftpmm + + + ANSI X3.136-1986: 6.3 mm 4 or 9-Track Magnetic Tape Cartridge, 315 bpmm, GCR (QIC-24) + + + ANSI X3.157-1987: 12.7 mm 9-Track Magnetic Tape, 126 bpmm, Phase Encoding + + + ANSI X3.158-1987: 3.81 mm 4-Track Magnetic Tape Cassette, 315 bpmm, GCR + + + ANSI X3B5/86-199: 12.7 mm 22-Track Magnetic Tape Cartridge, 262 bpmm, MFM + + + HI-TC1: 12.7 mm 24-Track Magnetic Tape Cartridge, 500 bpmm, GCR + + + HI-TC2: 12.7 mm 24-Track Magnetic Tape Cartridge, 999 bpmm, GCR + + + QIC-120: 6.3 mm 15-Track Magnetic Tape Cartridge, 394 bpmm, GCR + + + QIC-150: 6.3 mm 18-Track Magnetic Tape Cartridge, 394 bpmm, GCR + + + QIC-320: 6.3 mm 26-Track Magnetic Tape Cartridge, 630 bpmm, GCR + + + QIC-1350: 6.3 mm 30-Track Magnetic Tape Cartridge, 2034 bpmm, RLL + + + ANSI X3B5/88-185A: 3.81 mm Magnetic Tape Cassette, 2400 bpmm, DDS + + + ANSI X3.202-1991: 8 mm Magnetic Tape Cassette, 1703 bpmm, RLL + + + ECMA TC17: 8 mm Magnetic Tape Cassette, 1789 bpmm, RLL + + + ANSI X3.193-1990: 12.7 mm 48-Track Magnetic Tape Cartridge, 394 bpmm, MFM + + + ANSI X3B5/97-174: 12.7 mm 48-Track Magnetic Tape Cartridge, 1673 bpmm, MFM + + + QIC-11 + + + IBM 3490E + + + LTO Ultrium or Super AIT-1 + + + LTO Ultrium-2 or T9840 + + + T9940 + + + LTO Ultrium-3 or T9940 + + + T9840C + + + LTO Ultrium-4 or T9840D + + + T10000A + + + T10000B + + + T10000C + + + T10000D + + + AIT-1 + + + AIT-2 + + + AIT-3 + + + DDS-2 + + + DDS-3 + + + DDS-4 + + + unknown density code 0x{0:X2} + + + LTO Ultrium cleaning cartridge + + + MLR1-26GB + + + DC-9200 + + + LTO Ultrium-2 in CD emulation mode + + + LTO Ultrium-3 in CD emulation mode + + + LTO Ultrium-4 in CD emulation mode + + + LTO Ultrium-5 in CD emulation mode + + + EXB-8200 + + + EXB-8200 compressed + + + EXB-8500 + + + EXB-8500 compressed + + + Mammoth + + + IBM 3590 + + + IBM 3590E + + + VXA-1 + + + CompactTape I + + + CompactTape II + + + IBM 3590 extended + + + IBM 3590E extended + + + VXA-2 + + + VXA-3 + + + DLTtape III at 42500 bpi + + + DLTtape III with 56 tracks + + + DLTtape III at 62500 bpi + + + DLTtape III compressed + + + DLTtape IIIxt + + + DLTtape IIIxt compressed + + + DLTtape IV + + + DLTtape IV at 123090 bpi + + + DLTtape IV at 98250 bpi + + + Travan 5 + + + DLTtape IV compressed + + + DLTtape IV at 85937 bpi + + + DLTtape IV at 85937 bpi compressed + + + DLTtape IV at 123090 bpi compressed + + + DLTtape IV at 98250 bpi compressed + + + Super DLTtape I at 133000 bpi + + + Super DLTtape I + + + Super DLTtape I compressed + + + VStape I compressed + + + Mammoth-2 + + + DC-9250 + + + MLR1-26GBSL + + + SLR-32 SL + + + SLR-5 SL + + + SLR40, SLR60 or SLR100 + + + All remaining blocks conform to {0} and have a variable length + + + All remaining blocks conform to {0} and are {1} bytes each + + + {0} blocks conform to {1} and have a variable length + + + {0} blocks conform to {1} and are {2} bytes each + + + All remaining blocks have a variable length + + + {0} blocks have a variable length + + + Device prints directly + + + Device uses a print cache + + + Medium is + + + a combination of read-only and erasable optical + + + a combination of write-once and erasable optical + + + an unknown medium type 0x{0:X2} + + + Blank checking during write is enabled + + + ISO/IEC 10090: 86 mm Read/Write single-sided optical disc with 12500 tracks + + + 89 mm Read/Write double-sided optical disc with 12500 tracks + + + ANSI X3.212: 130 mm Read/Write double-sided optical disc with 18750 tracks + + + ANSI X3.191: 130 mm Write-Once double-sided optical disc with 30000 tracks + + + ANSI X3.214: 130 mm Write-Once double-sided optical disc with 20000 tracks + + + ANSI X3.211: 130 mm Write-Once double-sided optical disc with 18750 tracks + + + 200 mm optical disc + + + ISO/IEC 13614: 300 mm double-sided optical disc + + + ANSI X3.200: 356 mm double-sided optical disc with 56350 tracks + + + All remaining blocks are {0} and have a variable length + + + All remaining blocks are {0} and are {1} bytes each + + + {0} blocks are {1} and have a variable length + + + {0} blocks are {1} and are {2} bytes each + + + 120 mm CD-ROM + + + 120 mm Compact Disc Digital Audio + + + 120 mm Compact Disc with data and audio + + + 80 mm CD-ROM + + + 80 mm Compact Disc Digital Audio + + + 80 mm Compact Disc with data and audio + + + Unknown medium type + + + 120 mm Hybrid disc (Photo CD) + + + Unknown size CD-R + + + 120 mm CD-R with data only + + + 120 mm CD-R with audio only + + + 120 mm CD-R with data and audio + + + 120 mm Hybrid CD-R (Photo CD) + + + 80 mm CD-R with data only + + + 80 mm CD-R with audio only + + + 80 mm Hybrid CD-R (Photo CD) + + + Unknown size CD-RW + + + 120 mm CD-RW with data only + + + 120 mm CD-RW with audio only + + + 120 mm CD-RW with data and audio + + + 120 mm Hybrid CD-RW (Photo CD) + + + 80 mm CD-RW with data only + + + 80 mm CD-RW with audio only + + + 80 mm CD-RW with data and audio + + + 80 mm Hybrid CD-RW (Photo CD) + + + Unknown size HD disc + + + 120 mm HD disc + + + 80 mm HD disc + + + No disc inserted, tray closed or caddy inserted + + + Tray open or no caddy inserted + + + Tray closed or caddy inserted but medium error + + + Read-only block device + + + Read/Write block device + + + Unknown block device + + + LTO in CD-ROM emulation mode + + + user data only + + + user data plus auxiliary data + + + 4-byte tag, user data plus auxiliary data + + + audio information only + + + Density "{0}" defined by "{1}". + + + Secondary code: {0:X2}h + + + Drive can write this density + + + This descriptor is duplicated + + + This is the default density on the drive + + + Density has {0} bits per mm, with {1} tracks in a {2} mm width tape + + + Density maximum capacity is {0} megabytes + + + Density description: {0} + + + Primary code: {0:X2}h + + + Medium supports following density codes: + + + Medium type "{0}" defined by "{1}". + + + Medium type code: {0:X2}h + + + Medium has a nominal length of {0} m in a {1} mm width tape + + + Medium description: {0} + + + SCSI Implemented operating definitions: + + + Default operating definition: {0} + + + Current operating definition: {0} + + + There are no supported definitions + + + Supported operating definitions: + + + SCSI Device identification: + + + There are no identifiers + + + Automation/Drive Interface Transport + + + AT Attachment Interface (ATA/ATAPI) + + + Fibre Channel + + + IEEE 1394 + + + Internet SCSI + + + no specific + + + PCI Express + + + SCSI Remote Direct Memory Access + + + Serial Attachment SCSI + + + Parallel SCSI + + + SCSI over PCI Express + + + SSA + + + USB Attached SCSI + + + unknown code {0} + + + Descriptor refers to {0} protocol + + + Vendor descriptor contains: {0} + + + Vendor descriptor contains binary data (hex): {0} + + + Vendor descriptor contains unknown kind {1} of data (hex): {0} + + + Inquiry descriptor contains: {0} + + + Inquiry descriptor contains binary data (hex): {0} + + + Inquiry descriptor contains unknown kind {1} of data (hex): {0} + + + IEEE EUI-64: {0} + + + IEEE EUI-64: {0:X2} + + + NAA: {0} + + + NAA: {0:X2} + + + Relative target port identifier: {0} + + + Target group identifier: {0} + + + Logical unit group identifier: {0} + + + MD5 logical unit identifier: {0} + + + MD5 logical unit identifier: {0:x2} + + + SCSI name string identifier: {0} + + + SCSI name string identifier (hex): {0} + + + Protocol (Automation/Drive Interface Transport) specific descriptor with unknown format (hex): {0} + + + Protocol (ATA/ATAPI) specific descriptor with unknown format (hex): {0} + + + Protocol (Fibre Channel) specific descriptor with unknown format (hex): {0} + + + Protocol (IEEE 1394) specific descriptor with unknown format (hex): {0} + + + Protocol (Internet SCSI) specific descriptor with unknown format (hex): {0} + + + Protocol (unknown) specific descriptor with unknown format (hex): {0} + + + Protocol (PCI Express) specific descriptor with unknown format (hex): {0} + + + Protocol (SCSI Remote Direct Memory Access) specific descriptor with unknown format (hex): {0} + + + Protocol (Serial Attachment SCSI) specific descriptor with unknown format (hex): {0} + + + Protocol (Parallel SCSI) specific descriptor with unknown format (hex): {0} + + + Protocol (SSA) specific descriptor with unknown format (hex): {0} + + + Protocol (SCSIe) specific descriptor: Routing ID is {0} + + + Protocol (UAS) specific descriptor: USB address {0} interface {1} + + + Protocol (unknown code {0}) specific descriptor with unknown format (hex): {1} + + + Unknown descriptor type {1} contains: {0} + + + Unknown descriptor type {1} contains binary data (hex): {0} + + + Inquiry descriptor type {2} contains unknown kind {1} of data (hex): {0} + + + SCSI Software Interface Identifiers: + + + SCSI Management Network Addresses: + + + There are no addresses + + + Identifier belongs to addressed logical unit + + + Identifier belongs to target port + + + Identifier belongs to target device that contains the addressed logical unit + + + Identifier has unknown association with code {0} + + + Address for code download: {0} + + + Address for diagnostics: {0} + + + Address for logging: {0} + + + Address for status: {0} + + + Address for storage configuration service: {0} + + + Unspecified address: {0} + + + Address for copy service: {0} + + + Address for administrative configuration service: {0} + + + Address of unknown type {1}: {0} + + + SCSI Extended INQUIRY Data: + + + Logical unit supports type 1 protection + + + Logical unit supports types 1 and 2 protection + + + Logical unit supports type 2 protection + + + Logical unit supports types 1 and 3 protection + + + Logical unit supports type 3 protection + + + Logical unit supports types 2 and 3 protection + + + Logical unit supports types 1, 2 and 3 protection + + + Logical unit supports unknown protection defined by code {0} + + + Logical unit supports logical block protection + + + Device checks the logical block guard + + + Device checks the logical block application tag + + + Device checks the logical block reference tag + + + Device supports unit attention condition sense key specific data + + + Device supports grouping + + + Device supports priority + + + Device supports head of queue + + + Device supports the ORDERED task attribute + + + Device supports the SIMPLE task attribute + + + Device supports marking a block as uncorrectable with WRITE LONG + + + Device supports disabling correction with WRITE LONG + + + Device has a non-volatile cache + + + Device has a volatile cache + + + Device has disabled protection information checks + + + Device supports protection information intervals + + + Device clears any unit attention condition in all LUNs after reporting for any LUN + + + Device supports referrals + + + Device implements alternate reset handling + + + Device supports capability-based command security + + + Device supports power-on activation for new microcode + + + Device supports hard reset activation for new microcode + + + Device supports vendor specific activation for new microcode + + + Extended self-test takes {0} to complete + + + Device supports a maximum of {0} bytes for sense data + + + SCSI to ATA Translation Layer Data: + + + Translation layer vendor: {0} + + + Translation layer name: {0} + + + Translation layer release level: {0} + + + Device responded to ATA IDENTIFY DEVICE command. + + + Device responded to ATA IDENTIFY PACKET DEVICE command. + + + Device responded to ATA command {0:X2}h + + + Device uses Parallel ATA. + + + Device uses Serial ATA. + + + Device uses unknown transport with code {0} + + + ATA IDENTIFY information follows: + + + Could not decode ATA IDENTIFY information + + + Quantum Firmware Build Information page: + + + Servo firmware checksum: 0x{0:X4} + + + EEPROM firmware checksum: 0x{0:X4} + + + Read/write firmware checksum: 0x{0:X8} + + + Read/write firmware build date: {0} + + + Certance Drive Component Revision Levels page: + + + Component: {0} + + + Version: {0} + + + Date: {0} + + + Variant: {0} + + + Certance Drive Component Serial Number page: + + + Head Assembly Serial Number: {0} + + + Reel Motor 1 Serial Number: {0} + + + Reel Motor 2 Serial Number: {0} + + + Board Serial Number: {0} + + + Base Mechanical Serial Number: {0} + + + Certance drive status page: + + + Command forwarding is disabled + + + Command forwarding is enabled + + + Unknown command forwarding code {0} + + + Alerts are enabled + + + Cartridge removable is prevented + + + Unit is reserved by initiator ID {0:X16} + + + Device needs cleaning cartridge + + + Cartridge tape is threaded + + + There are commands pending to be forwarded + + + Cartridge will be loaded and threaded on insertion + + + Cartridge will be loaded but not threaded on insertion + + + Cartridge will not be loaded + + + Unknown autoloading mode code {0} + + + Port A link is down + + + Port A uses Parallel SCSI Ultra-160 interface + + + Unknown port A transport type code {0} + + + Drive responds to SCSI ID {0} + + + Drive has been operating {0} + + + Inserted cartridge is LTO + + + Unknown cartridge format code {0} + + + There is no cartridge inserted + + + Cleaning cartridge inserted + + + Unknown data cartridge inserted + + + Firmware cartridge inserted + + + LTO Ultrium 1 Type A cartridge inserted + + + LTO Ultrium 1 Type B cartridge inserted + + + LTO Ultrium 1 Type C cartridge inserted + + + LTO Ultrium 1 Type D cartridge inserted + + + LTO Ultrium 2 cartridge inserted + + + Unknown cartridge type code {0} + + + Cartridge has an uncompressed capability of {0} gigabytes + + + Cartridge serial number: {0} + + + IBM Drive Component Revision Levels page: + + + Code name: {0} + + + IBM Drive Serial Numbers page: + + + Manufacturing serial number: {0} + + + Reported serial number: {0} + + + SCSI Sequential-access Device Capabilities: + + + Device supports WORM media + + + Device supports Tape Stream Mirroring + + + HP Drive Firmware Revision Levels page: + + + HP Drive Hardware Revision Levels page: + + + HP Drive PCA Revision Levels page: + + + HP Drive Mechanism Revision Levels page: + + + HP Drive Head Assembly Revision Levels page: + + + HP Drive ACI Revision Levels page: + + + Copyright: {0} + + + Seagate Firmware Numbers page: + + + Controller firmware version: {0} + + + Boot firmware version: {0} + + + Servo firmware version: {0} + + + Error class {0} type {1} happened on block {2} + + + Error class {0} type {1} + + + SCSI SENSE: {0} + + + On segment {0} + + + Filemark or setmark found + + + End-of-medium/partition found + + + Incorrect length indicator + + + On logical block {0} + + + Illegal field in CDB + + + Illegal field in data parameters + + + Invalid value in bit {0} in field {1} of CDB + + + Invalid value in field {0} of CDB + + + Format progress {0:P} + + + Actual retry count is {0} + + + On logical block {0} + + + VENDOR-SPECIFIC ASC {0:X2}h WITH VENDOR-SPECIFIC ASCQ {1:X2}h + + + VENDOR-SPECIFIC ASC {0:X2}h WITH ASCQ {1:X2}h + + + ASC {0:X2}h WITH VENDOR-SPECIFIC ASCQ {1:X2}h + + + ASC {0:X2}h WITH ASCQ {1:X2}h + + + SecureDigital Device Identification Register: + + + SecureDigital Device Specific Data Register: + + + Register version 2.0 + + + Asynchronous data access time is {0}{1} + + + Clock dependent part of data access is {0} clock cycles + + + MBit/s + + + Device's transfer speed: {0}{1} + + + Device support command classes {0} + + + Read block length is {0} bytes + + + Device allows reading partial blocks + + + Write commands can cross physical block boundaries + + + Read commands can cross physical block boundaries + + + Device implements configurable driver stage + + + Device has {0} TiB + + + Device can erase multiple blocks + + + Device must erase a minimum of {0} blocks at a time + + + SecureDigital Operation Conditions Register: + + + Device is SDHC, SDXC or higher + + + Device is UHS-II or higher + + + Device can switch to work with 1.8V supply + + + Device is in low power mode + + + SecureDigital Device Configuration Register: + + + Unknown register version {0} + + + Device follows SecureDigital Physical Layer Specification version 1.0x + + + Device follows SecureDigital Physical Layer Specification version 1.10 + + + Device follows SecureDigital Physical Layer Specification version 2.00 + + + Device follows SecureDigital Physical Layer Specification version 3.0x + + + Device follows SecureDigital Physical Layer Specification version 4.xx + + + Device follows SecureDigital Physical Layer Specification version 5.xx + + + Device follows SecureDigital Physical Layer Specification version 6.xx + + + Device follows SecureDigital Physical Layer Specification version 7.xx + + + Device follows SecureDigital Physical Layer Specification version 8.xx + + + Device follows SecureDigital Physical Layer Specification with unknown version {0}.{1}.{2}.{3} + + + Device does not support CPRM + + + Device does not use CPRM + + + Device uses CPRM according to specification version 1.01 + + + Device uses CPRM according to specification version 2.00 + + + Device uses CPRM according to specification version 3.xx + + + Device uses unknown CPRM specification with code {0} + + + Device supports 1-bit data bus + + + Device supports 4-bit data bus + + + Device supports extended security + + + Device supports extension register multi-block commands + + + Device supports extension register single-block commands + + + Device supports set block count command + + + Device supports speed class control command + + + SEGA IP.BIN INFORMATION: + + + System name: {0} + + + Initial program address: 0x{0:X8} + + + Initial program load size: {0} bytes + + + Initial program entry address: 0x{0:X8} + + + Initial program work RAM: {0} bytes + + + System program address: 0x{0:X8} + + + System program load size: {0} bytes + + + System program entry address: 0x{0:X8} + + + System program work RAM: {0} bytes + + + Release date: {0} + + + Hardware ID: {0} + + + Developer code: {0} + + + Domestic title: {0} + + + Overseas title: {0} + + + Product code: {0} + + + Peripherals: + + + Game supports analog controller. + + + Game supports trackball. + + + Game supports light gun. + + + Game supports JoyPad. + + + Game supports Master System's JoyPad. + + + Game supports printer interface. + + + Game supports serial (RS-232C) interface. + + + Game supports tablet interface. + + + Game supports paddle controller. + + + Game supports unknown peripheral {0}. + + + Regions supported: + + + Japanese NTSC. + + + USA NTSC. + + + Europe PAL. + + + Game supports unknown region {0}. + + + Product name: {0} + + + Product version: {0} + + + Product CRC: 0x{0:X8} + + + Producer: {0} + + + Disc media: {0} + + + Disc number {0} of {1} + + + Disc boots natively. + + + Disc boots using Windows CE. + + + Disc boots using unknown loader: {0}. + + + North America NTSC. + + + Game uses Windows CE. + + + Game supports the VGA Box. + + + Game supports other expansion. + + + Game supports Puru Puru pack. + + + Game supports Mike Device. + + + Game supports Memory Card. + + + Game requires A + B + Start buttons and D-Pad. + + + Game requires C button. + + + Game requires D button. + + + Game requires X button. + + + Game requires Y button. + + + Game requires Z button. + + + Game requires expanded direction buttons. + + + Game requires analog R trigger. + + + Game requires analog L trigger. + + + Game requires analog horizontal controller. + + + Game requires analog vertical controller. + + + Game requires expanded analog horizontal controller. + + + Game requires expanded analog vertical controller. + + + Game supports Gun. + + + Game supports Keyboard. + + + Game supports Mouse. + + + Game supports unknown peripherals mask {0:X2} + + + Game supports analog steering controller. + + + Game supports multitap. + + + Asia NTSC. + + + Catalogue number: + + + Timestamp: {0} + + + Media ID: + + + Xbox Game Disc + + + Xbox 360 Game Disc + + + Challenge ID: {0} + + + Challenge level: {0} + + + Challenge value: 0x{0:X8} + + + Response modifier: {0} + + + Response value: 0x{0:X8} + + + Extent starts at PSN {0:X6}h and ends at PSN {1:X6}h + + + Device vendor: {0} + + + Device name: {0} + + + Device release level: {0} + + + Device is connected and supported. + + + Device is supported but not connected. + + + Reserved value set in Peripheral Qualifier field. + + + Device is connected but unsupported. + + + Vendor value {0} set in Peripheral Qualifier field. + + + Direct-access device + + + Sequential-access device + + + Printer device + + + Processor device + + + Write-once device + + + CD-ROM/DVD/etc device + + + Scanner device + + + Optical memory device + + + Medium change device + + + Communications device + + + Graphics arts pre-press device (defined in ASC IT8) + + + Array controller device + + + Enclosure services device + + + Simplified direct-access device + + + Optical card reader/writer device + + + Bridging Expanders + + + Object-based Storage Device + + + Automation/Drive Interface + + + Security Manager Device + + + Host managed zoned block device + + + Well known logical unit + + + Unknown or no device type + + + Unknown device type field value 0x{0:X2} + + + Device does not claim to comply with any SCSI ANSI standard + + + Device claims to comply with ANSI X3.131:1986 (SCSI-1) + + + Device claims to comply with ANSI X3.131:1994 (SCSI-2) + + + Device claims to comply with ANSI X3.301:1997 (SPC-1) + + + Device claims to comply with ANSI X3.351:2001 (SPC-2) + + + Device claims to comply with ANSI X3.408:2005 (SPC-3) + + + Device claims to comply with ANSI X3.408:2005 (SPC-4) + + + Device claims to comply with unknown SCSI ANSI standard value 0x{0:X2}) + + + Device does not claim to comply with any SCSI ECMA standard + + + Device claims to comply ECMA-111: Small Computer System Interface SCSI + + + Device claims to comply with unknown SCSI ECMA standard value 0x{0:X2}) + + + Device does not claim to comply with any SCSI ISO/IEC standard + + + Device claims to comply with ISO/IEC 9316:1995 + + + Device claims to comply with unknown SCSI ISO/IEC standard value 0x{0:X2}) + + + Device supports Asynchronous Event Reporting Capability + + + Device supports TERMINATE TASK command + + + Device supports setting Normal ACA + + + Device supports LUN hierarchical addressing + + + Device contains an embedded storage array controller + + + Device contains an Access Control Coordinator + + + Device supports third-party copy commands + + + Device supports protection information + + + Device supports basic queueing + + + Device contains an embedded enclosure services component + + + Multi-port device + + + Device contains or is attached to a medium changer + + + Device supports request and acknowledge handshakes + + + Device supports 32-bit wide SCSI addresses + + + Device supports 16-bit wide SCSI addresses + + + Device supports relative addressing + + + Device supports 32-bit wide data transfers + + + Device supports 16-bit wide data transfers + + + Device supports synchronous data transfer + + + Device supports linked commands + + + Device supports CONTINUE TASK and TARGET TRANSFER DISABLE commands + + + Device supports Quick Arbitration and Selection + + + Device supports TCQ queue + + + Device supports information unit transfers + + + Device implements RESET as a soft reset + + + Vendor specific bit 5 on byte 6 of INQUIRY response is set + + + Device does not support asymmetrical access + + + Device only supports implicit asymmetrical access + + + Device only supports explicit asymmetrical access + + + Device supports implicit and explicit asymmetrical access + + + Unknown value in TPGS field 0x{0:X2} + + + Device supports only ST clocking + + + Device supports only DT clocking + + + Reserved value 0x02 found in SPI clocking field + + + Device supports ST and DT clocking + + + Unknown value in SPI clocking field 0x{0:X2} + + + Device complies with SAM (no version claimed) + + + Device complies with SAM T10/0994-D revision 18 + + + Device complies with SAM ANSI INCITS 270-1996 + + + Device complies with SAM-2 (no version claimed) + + + Device complies with SAM-2 T10/1157-D revision 23 + + + Device complies with SAM-2 T10/1157-D revision 24 + + + Device complies with SAM-2 ANSI INCITS 366-2003 + + + Device complies with SAM-2 ISO/IEC 14776-412 + + + Device complies with SAM-3 (no version claimed) + + + Device complies with SAM-3 T10/1561-D revision 7 + + + Device complies with SAM-3 T10/1561-D revision 13 + + + Device complies with SAM-3 T10/1561-D revision 14 + + + Device complies with SAM-3 ANSI INCITS 402-2005 + + + Device complies with SAM-4 (no version claimed) + + + Device complies with SAM-4 T10/1683-D revision 13 + + + Device complies with SAM-4 T10/1683-D revision 14 + + + Device complies with SAM-4 ANSI INCITS 447-2008 + + + Device complies with SAM-4 ISO/IEC 14776-414 + + + Device complies with SAM-5 (no version claimed) + + + Device complies with SAM-5 T10/2104-D revision 4 + + + Device complies with SAM-5 T10/2104-D revision 20 + + + Device complies with SAM-5 T10/2104-D revision 21 + + + Device complies with SAM-6 (no version claimed) + + + Device complies with SPC (no version claimed) + + + Device complies with SPC T10/0995-D revision 11a + + + Device complies with SPC ANSI INCITS 301-1997 + + + Device complies with MMC (no version claimed) + + + Device complies with MMC T10/1048-D revision 10a + + + Device complies with MMC ANSI INCITS 304-1997 + + + Device complies with SCC (no version claimed) + + + Device complies with SCC T10/1047-D revision 06c + + + Device complies with SCC ANSI INCITS 276-1997 + + + Device complies with SBC (no version claimed) + + + Device complies with SBC T10/0996-D revision 08c + + + Device complies with SBC ANSI INCITS 306-1998 + + + Device complies with SMC (no version claimed) + + + Device complies with SMC T10/0999-D revision 10a + + + Device complies with SMC ANSI INCITS 314-1998 + + + Device complies with SMC ISO/IEC 14776-351 + + + Device complies with SES (no version claimed) + + + Device complies with SES T10/1212-D revision 08b + + + Device complies with SES ANSI INCITS 305-1998 + + + Device complies with SES T10/1212 revision 08b w/ Amendment ANSI INCITS.305/AM1-2000 + + + Device complies with SES ANSI INCITS 305-1998 w/ Amendment ANSI INCITS.305/AM1-2000 + + + Device complies with SCC-2 (no version claimed) + + + Device complies with SCC-2 T10/1125-D revision 04 + + + Device complies with SCC-2 ANSI INCITS 318-1998 + + + Device complies with SSC (no version claimed) + + + Device complies with SSC T10/0997-D revision 17 + + + Device complies with SSC T10/0997-D revision 22 + + + Device complies with SSC ANSI INCITS 335-2000 + + + Device complies with RBC (no version claimed) + + + Device complies with RBC T10/1240-D revision 10a + + + Device complies with RBC ANSI INCITS 330-2000 + + + Device complies with MMC-2 (no version claimed) + + + Device complies with MMC-2 T10/1228-D revision 11 + + + Device complies with MMC-2 T10/1228-D revision 11a + + + Device complies with MMC-2 ANSI INCITS 333-2000 + + + Device complies with SPC-2 (no version claimed) + + + Device complies with SPC-2 T10/1236-D revision 12 + + + Device complies with SPC-2 T10/1236-D revision 18 + + + Device complies with SPC-2 T10/1236-D revision 19 + + + Device complies with SPC-2 T10/1236-D revision 20 + + + Device complies with SPC-2 ANSI INCITS 351-2001 + + + Device complies with SPC-2 ISO/IEC 14776-452 + + + Device complies with OCRW (no version claimed) + + + Device complies with OCRW ISO/IEC 14776-381 + + + Device complies with MMC-3 (no version claimed) + + + Device complies with MMC-3 T10/1363-D revision 9 + + + Device complies with MMC-3 T10/1363-D revision 10g + + + Device complies with MMC-3 ANSI INCITS 360-2002 + + + Device complies with SMC-2 (no version claimed) + + + Device complies with SMC-2 T10/1383-D revision 5 + + + Device complies with SMC-2 T10/1383-D revision 6 + + + Device complies with SMC-2 T10/1383-D revision 7 + + + Device complies with SMC-2 ANSI INCITS 382-2004 + + + Device complies with SPC-3 (no version claimed) + + + Device complies with SPC-3 T10/1416-D revision 7 + + + Device complies with SPC-3 T10/1416-D revision 21 + + + Device complies with SPC-3 T10/1416-D revision 22 + + + Device complies with SPC-3 T10/1416-D revision 23 + + + Device complies with SPC-3 ANSI INCITS 408-2005 + + + Device complies with SPC-3 ISO/IEC 14776-453 + + + Device complies with SBC-2 (no version claimed) + + + Device complies with SBC-2 T10/1417-D revision 5a + + + Device complies with SBC-2 T10/1417-D revision 15 + + + Device complies with SBC-2 T10/1417-D revision 16 + + + Device complies with SBC-2 ANSI INCITS 405-2005 + + + Device complies with SBC-2 ISO/IEC 14776-322 + + + Device complies with OSD (no version claimed) + + + Device complies with OSD T10/1355-D revision 0 + + + Device complies with OSD T10/1355-D revision 7a + + + Device complies with OSD T10/1355-D revision 8 + + + Device complies with OSD T10/1355-D revision 9 + + + Device complies with OSD T10/1355-D revision 10 + + + Device complies with OSD ANSI INCITS 400-2004 + + + Device complies with SSC-2 (no version claimed) + + + Device complies with SSC-2 T10/1434-D revision 7 + + + Device complies with SSC-2 T10/1434-D revision 9 + + + Device complies with SSC-2 ANSI INCITS 380-2003 + + + Device complies with BCC (no version claimed) + + + Device complies with MMC-4 (no version claimed) + + + Device complies with MMC-4 T10/1545-D revision 5 + + + Device complies with MMC-4 T10/1545-D revision 5a + + + Device complies with MMC-4 T10/1545-D revision 3 + + + Device complies with MMC-4 T10/1545-D revision 3d + + + Device complies with MMC-4 ANSI INCITS 401-2005 + + + Device complies with ADC (no version claimed) + + + Device complies with ADC T10/1558-D revision 6 + + + Device complies with ADC T10/1558-D revision 7 + + + Device complies with ADC ANSI INCITS 403-2005 + + + Device complies with SES-2 (no version claimed) + + + Device complies with SES-2 T10/1559-D revision 16 + + + Device complies with SES-2 T10/1559-D revision 19 + + + Device complies with SES-2 T10/1559-D revision 20 + + + Device complies with SES-2 ANSI INCITS 448-2008 + + + Device complies with SES-2 ISO/IEC 14776-372 + + + Device complies with SSC-3 (no version claimed) + + + Device complies with SSC-3 T10/1611-D revision 04a + + + Device complies with SSC-3 T10/1611-D revision 05 + + + Device complies with SSC-3 ANSI INCITS 467-2011 + + + Device complies with SSC-3 ISO/IEC 14776-333:2013 + + + Device complies with MMC-5 (no version claimed) + + + Device complies with MMC-5 T10/1675-D revision 03 + + + Device complies with MMC-5 T10/1675-D revision 03b + + + Device complies with MMC-5 T10/1675-D revision 04 + + + Device complies with MMC-5 ANSI INCITS 430-2007 + + + Device complies with OSD-2 (no version claimed) + + + Device complies with OSD-2 T10/1729-D revision 4 + + + Device complies with OSD-2 T10/1729-D revision 5 + + + Device complies with OSD-2 ANSI INCITS 458-2011 + + + Device complies with SPC-4 (no version claimed) + + + Device complies with SPC-4 T10/BSR INCITS 513 revision 16 + + + Device complies with SPC-4 T10/BSR INCITS 513 revision 18 + + + Device complies with SPC-4 T10/BSR INCITS 513 revision 23 + + + Device complies with SPC-4 T10/BSR INCITS 513 revision 36 + + + Device complies with SPC-4 T10/BSR INCITS 513 revision 37 + + + Device complies with SPC-4 T10/BSR INCITS 513 revision 37a + + + Device complies with SPC-4 ANSI INCITS 513-2015 + + + Device complies with SMC-3 (no version claimed) + + + Device complies with SMC-3 T10/1730-D revision 15 + + + Device complies with SMC-3 T10/1730-D revision 16 + + + Device complies with SMC-3 ANSI INCITS 484-2012 + + + Device complies with ADC-2 (no version claimed) + + + Device complies with ADC-2 T10/1741-D revision 7 + + + Device complies with ADC-2 T10/1741-D revision 8 + + + Device complies with ADC-2 ANSI INCITS 441-2008 + + + Device complies with SBC-3 (no version claimed) + + + Device complies with SBC-3 T10/BSR INCITS 514 revision 35 + + + Device complies with SBC-3 T10/BSR INCITS 514 revision 36 + + + Device complies with SBC-3 ANSI INCITS 514-2014 + + + Device complies with MMC-6 (no version claimed) + + + Device complies with MMC-6 T10/1836-D revision 02b + + + Device complies with MMC-6 T10/1836-D revision 02g + + + Device complies with MMC-6 ANSI INCITS 468-2010 + + + Device complies with MMC-6 ANSI INCITS 468-2010 + MMC-6/AM1 ANSI INCITS 468-2010/AM 1 + + + Device complies with ADC-3 (no version claimed) + + + Device complies with ADC-3 T10/1895-D revision 04 + + + Device complies with ADC-3 T10/1895-D revision 05 + + + Device complies with ADC-3 T10/1895-D revision 05a + + + Device complies with ADC-3 ANSI INCITS 497-2012 + + + Device complies with SSC-4 (no version claimed) + + + Device complies with SSC-4 T10/BSR INCITS 516 revision 2 + + + Device complies with SSC-4 T10/BSR INCITS 516 revision 3 + + + Device complies with SSC-4 ANSI INCITS 516-2013 + + + Device complies with OSD-3 (no version claimed) + + + Device complies with SES-3 (no version claimed) + + + Device complies with SSC-5 (no version claimed) + + + Device complies with SPC-5 (no version claimed) + + + Device complies with SFSC (no version claimed) + + + Device complies with SFSC BSR INCITS 501 revision 01 + + + Device complies with SBC-4 (no version claimed) + + + Device complies with ZBC (no version claimed) + + + Device complies with ZBC BSR INCITS 536 revision 02 + + + Device complies with ADC-4 (no version claimed) + + + Device complies with SSA-TL2 (no version claimed) + + + Device complies with SSA-TL2 T10.1/1147-D revision 05b + + + Device complies with SSA-TL2 ANSI INCITS 308-1998 + + + Device complies with SSA-TL1 (no version claimed) + + + Device complies with SSA-TL1 T10.1/0989-D revision 10b + + + Device complies with SSA-TL1 ANSI INCITS 295-1996 + + + Device complies with SSA-S3P (no version claimed) + + + Device complies with SSA-S3P T10.1/1051-D revision 05b + + + Device complies with SSA-S3P ANSI INCITS 309-1998 + + + Device complies with SSA-S2P (no version claimed) + + + Device complies with SSA-S2P T10.1/1121-D revision 07b + + + Device complies with SSA-S2P ANSI INCITS 294-1996 + + + Device complies with SIP (no version claimed) + + + Device complies with SIP T10/0856-D revision 10 + + + Device complies with SIP ANSI INCITS 292-1997 + + + Device complies with FCP (no version claimed) + + + Device complies with FCP T10/0993-D revision 12 + + + Device complies with FCP ANSI INCITS 269-1996 + + + Device complies with SBP-2 (no version claimed) + + + Device complies with SBP-2 T10/1155-D revision 04 + + + Device complies with SBP-2 ANSI INCITS 325-1998 + + + Device complies with FCP-2 (no version claimed) + + + Device complies with FCP-2 T10/1144-D revision 4 + + + Device complies with FCP-2 T10/1144-D revision 7 + + + Device complies with FCP-2 T10/1144-D revision 7a + + + Device complies with FCP-2 ANSI INCITS 350-2003 + + + Device complies with FCP-2 T10/1144-D revision 8 + + + Device complies with SST (no version claimed) + + + Device complies with SST T10/1380-D revision 8b + + + Device complies with SRP (no version claimed) + + + Device complies with SRP T10/1415-D revision 10 + + + Device complies with SRP T10/1415-D revision 16a + + + Device complies with SRP ANSI INCITS 365-2002 + + + Device complies with iSCSI (no version claimed) + + + Device complies with iSCSI revision {0} + + + Device complies with SBP-3 (no version claimed) + + + Device complies with SBP-3 T10/1467-D revision 1f + + + Device complies with SBP-3 T10/1467-D revision 3 + + + Device complies with SBP-3 T10/1467-D revision 4 + + + Device complies with SBP-3 T10/1467-D revision 5 + + + Device complies with SBP-3 ANSI INCITS 375-2004 + + + Device complies with ADP (no version claimed) + + + Device complies with ADT (no version claimed) + + + Device complies with ADT T10/1557-D revision 11 + + + Device complies with ADT T10/1557-D revision 14 + + + Device complies with ADT ANSI INCITS 406-2005 + + + Device complies with FCP-3 (no version claimed) + + + Device complies with FCP-3 T10/1560-D revision 3f + + + Device complies with FCP-3 T10/1560-D revision 4 + + + Device complies with FCP-3 ANSI INCITS 416-2006 + + + Device complies with FCP-3 ISO/IEC 14776-223 + + + Device complies with ADT-2 (no version claimed) + + + Device complies with ADT-2 T10/1742-D revision 06 + + + Device complies with ADT-2 T10/1742-D revision 08 + + + Device complies with ADT-2 T10/1742-D revision 09 + + + Device complies with ADT-2 ANSI INCITS 472-2011 + + + Device complies with FCP-4 (no version claimed) + + + Device complies with FCP-4 T10/1828-D revision 01 + + + Device complies with FCP-4 T10/1828-D revision 02 + + + Device complies with FCP-4 T10/1828-D revision 02b + + + Device complies with FCP-4 ANSI INCITS 481-2012 + + + Device complies with ADT-3 (no version claimed) + + + Device complies with SPI (no version claimed) + + + Device complies with SPI T10/0855-D revision 15a + + + Device complies with SPI ANSI INCITS 253-1995 + + + Device complies with SPI T10/0855-D revision 15a with SPI Amnd revision 3a + + + Device complies with SPI ANSI INCITS 253-1995 with SPI Amnd ANSI INCITS 253/AM1-1998 + + + Device complies with Fast-20 (no version claimed) + + + Device complies with Fast-20 T10/1071 revision 06 + + + Device complies with Fast-20 ANSI INCITS 277-1996 + + + Device complies with SPI-2 (no version claimed) + + + Device complies with SPI-2 T10/1142-D revision 20b + + + Device complies with SPI-2 ANSI INCITS 302-1999 + + + Device complies with SPI-3 (no version claimed) + + + Device complies with SPI-3 T10/1302-D revision 10 + + + Device complies with SPI-3 T10/1302-D revision 13a + + + Device complies with SPI-3 T10/1302-D revision 14 + + + Device complies with SPI-3 ANSI INCITS 336-2000 + + + Device complies with EPI (no version claimed) + + + Device complies with EPI T10/1134 revision 16 + + + Device complies with EPI ANSI INCITS TR-23 1999 + + + Device complies with SPI-4 (no version claimed) + + + Device complies with SPI-4 T10/1365-D revision 7 + + + Device complies with SPI-4 T10/1365-D revision 9 + + + Device complies with SPI-4 ANSI INCITS 362-2002 + + + Device complies with SPI-4 T10/1365-D revision 10 + + + Device complies with SPI-5 (no version claimed) + + + Device complies with SPI-5 T10/1525-D revision 3 + + + Device complies with SPI-5 T10/1525-D revision 5 + + + Device complies with SPI-5 T10/1525-D revision 6 + + + Device complies with SPI-5 ANSI INCITS 367-2003 + + + Device complies with SAS (no version claimed) + + + Device complies with SAS T10/1562-D revision 01 + + + Device complies with SAS T10/1562-D revision 03 + + + Device complies with SAS T10/1562-D revision 04 + + + Device complies with SAS T10/1562-D revision 05 + + + Device complies with SAS ANSI INCITS 376-2003 + + + Device complies with SAS-1.1 (no version claimed) + + + Device complies with SAS-1.1 T10/1601-D revision 9 + + + Device complies with SAS-1.1 T10/1601-D revision 10 + + + Device complies with SAS-1.1 ANSI INCITS 417-2006 + + + Device complies with SAS-1.1 ISO/IEC 14776-151 + + + Device complies with SAS-2 (no version claimed) + + + Device complies with SAS-2 T10/1760-D revision 14 + + + Device complies with SAS-2 T10/1760-D revision 15 + + + Device complies with SAS-2 T10/1760-D revision 16 + + + Device complies with SAS-2 ANSI INCITS 457-2010 + + + Device complies with SAS-2.1 (no version claimed) + + + Device complies with SAS-2.1 T10/2125-D revision 04 + + + Device complies with SAS-2.1 T10/2125-D revision 06 + + + Device complies with SAS-2.1 T10/2125-D revision 07 + + + Device complies with SAS-2.1 ANSI INCITS 478-2011 + + + Device complies with SAS-2.1 ANSI INCITS 478-2011 w/ Amnd 1 ANSI INCITS 478/AM1-2014 + + + Device complies with SAS-2.1 ISO/IEC 14776-153 + + + Device complies with SAS-3 (no version claimed) + + + Device complies with SAS-3 T10/BSR INCITS 519 revision 05a + + + Device complies with SAS-3 T10/BSR INCITS 519 revision 06 + + + Device complies with SAS-3 ANSI INCITS 519-2014 + + + Device complies with SAS-4 (no version claimed) + + + Device complies with FC-PH (no version claimed) + + + Device complies with FC-PH ANSI INCITS 230-1994 + + + Device complies with FC-PH ANSI INCITS 230-1994 with Amnd 1 ANSI INCITS 230/AM1-1996 + + + Device complies with FC-AL (no version claimed) + + + Device complies with FC-AL ANSI INCITS 272-1996 + + + Device complies with FC-AL-2 (no version claimed) + + + Device complies with FC-AL-2 T11/1133-D revision 7.0 + + + Device complies with FC-AL-2 ANSI INCITS 332-1999 with AM1-2003 & AM2-2006 + + + Device complies with FC-AL-2 ANSI INCITS 332-1999 with Amnd 2 AM2-2006 + + + Device complies with FC-AL-2 ISO/IEC 14165-122 with AM1 & AM2 + + + Device complies with FC-AL-2 ANSI INCITS 332-1999 + + + Device complies with FC-AL-2 ANSI INCITS 332-1999 with Amnd 1 AM1-2003 + + + Device complies with FC-PH-3 (no version claimed) + + + Device complies with FC-PH-3 ANSI INCITS 303-1998 + + + Device complies with FC-FS (no version claimed) + + + Device complies with FC-FS T11/1331-D revision 1.2 + + + Device complies with FC-FS T11/1331-D revision 1.7 + + + Device complies with FC-FS ANSI INCITS 373-2003 + + + Device complies with FC-FS ISO/IEC 14165-251 + + + Device complies with FC-PI (no version claimed) + + + Device complies with FC-PI ANSI INCITS 352-2002 + + + Device complies with FC-PI-2 (no version claimed) + + + Device complies with FC-PI-2 T11/1506-D revision 5.0 + + + Device complies with FC-PI-2 ANSI INCITS 404-2006 + + + Device complies with FC-FS-2 (no version claimed) + + + Device complies with FC-FS-2 ANSI INCITS 242-2007 + + + Device complies with FC-FS-2 ANSI INCITS 242-2007 with AM1 ANSI INCITS 242/AM1-2007 + + + Device complies with FC-LS (no version claimed) + + + Device complies with FC-LS T11/1620-D revision 1.62 + + + Device complies with FC-LS ANSI INCITS 433-2007 + + + Device complies with FC-SP (no version claimed) + + + Device complies with FC-SP T11/1570-D revision 1.6 + + + Device complies with FC-SP ANSI INCITS 426-2007 + + + Device complies with FC-PI-3 (no version claimed) + + + Device complies with FC-PI-3 T11/1625-D revision 2.0 + + + Device complies with FC-PI-3 T11/1625-D revision 2.1 + + + Device complies with FC-PI-3 T11/1625-D revision 4.0 + + + Device complies with FC-PI-3 ANSI INCITS 460-2011 + + + Device complies with FC-PI-4 (no version claimed) + + + Device complies with FC-PI-4 T11/1647-D revision 8.0 + + + Device complies with FC-PI-4 ANSI INCITS 450-2009 + + + Device complies with FC 10GFC (no version claimed) + + + Device complies with FC 10GFC ANSI INCITS 364-2003 + + + Device complies with FC 10GFC ISO/IEC 14165-116 + + + Device complies with FC 10GFC ISO/IEC 14165-116 with AM1 + + + Device complies with FC 10GFC ANSI INCITS 364-2003 with AM1 ANSI INCITS 364/AM1-2007 + + + Device complies with FC-SP-2 (no version claimed) + + + Device complies with FC-FS-3 (no version claimed) + + + Device complies with FC-FS-3 T11/1861-D revision 0.9 + + + Device complies with FC-FS-3 T11/1861-D revision 1.0 + + + Device complies with FC-FS-3 T11/1861-D revision 1.10 + + + Device complies with FC-FS-3 ANSI INCITS 470-2011 + + + Device complies with FC-LS-2 (no version claimed) + + + Device complies with FC-LS-2 T11/2103-D revision 2.11 + + + Device complies with FC-LS-2 T11/2103-D revision 2.21 + + + Device complies with FC-LS-2 ANSI INCITS 477-2011 + + + Device complies with FC-PI-5 (no version claimed) + + + Device complies with FC-PI-5 T11/2118-D revision 2.00 + + + Device complies with FC-PI-5 T11/2118-D revision 3.00 + + + Device complies with FC-PI-5 T11/2118-D revision 6.00 + + + Device complies with FC-PI-5 T11/2118-D revision 6.10 + + + Device complies with FC-PI-5 ANSI INCITS 479-2011 + + + Device complies with FC-PI-6 (no version claimed) + + + Device complies with FC-FS-4 (no version claimed) + + + Device complies with FC-LS-3 (no version claimed) + + + Device complies with FC-SCM (no version claimed) + + + Device complies with FC-SCM T11/1824DT revision 1.0 + + + Device complies with FC-SCM T11/1824DT revision 1.1 + + + Device complies with FC-SCM T11/1824DT revision 1.4 + + + Device complies with FC-SCM INCITS TR-47 2012 + + + Device complies with FC-DA-2 (no version claimed) + + + Device complies with FC-DA-2 T11/1870DT revision 1.04 + + + Device complies with FC-DA-2 T11/1870DT revision 1.06 + + + Device complies with FC-DA-2 INCITS TR-49 2012 + + + Device complies with FC-DA (no version claimed) + + + Device complies with FC-DA T11/1513-DT revision 3.1 + + + Device complies with FC-DA ANSI INCITS TR-36 2004 + + + Device complies with FC-DA ISO/IEC 14165-341 + + + Device complies with FC-Tape (no version claimed) + + + Device complies with FC-Tape T11/1315 revision 1.16 + + + Device complies with FC-Tape T11/1315 revision 1.17 + + + Device complies with FC-Tape ANSI INCITS TR-24 1999 + + + Device complies with FC-FLA (no version claimed) + + + Device complies with FC-FLA T11/1235 revision 7 + + + Device complies with FC-FLA ANSI INCITS TR-20 1998 + + + Device complies with FC-PLDA (no version claimed) + + + Device complies with FC-PLDA T11/1162 revision 2.1 + + + Device complies with FC-PLDA ANSI INCITS TR-19 1998 + + + Device complies with SSA-PH2 (no version claimed) + + + Device complies with SSA-PH2 T10.1/1145-D revision 09c + + + Device complies with SSA-PH2 ANSI INCITS 293-1996 + + + Device complies with SSA-PH3 (no version claimed) + + + Device complies with SSA-PH3 T10.1/1146-D revision 05b + + + Device complies with SSA-PH3 ANSI INCITS 307-1998 + + + Device complies with IEEE 1394 (no version claimed) + + + Device complies with ANSI IEEE 1394-1995 + + + Device complies with IEEE 1394a (no version claimed) + + + Device complies with IEEE 1394b (no version claimed) + + + Device complies with ATA/ATAPI-6 (no version claimed) + + + Device complies with ATA/ATAPI-6 ANSI INCITS 361-2002 + + + Device complies with ATA/ATAPI-7 (no version claimed) + + + Device complies with ATA/ATAPI-7 T13/1532-D revision 3 + + + Device complies with ATA/ATAPI-7 ANSI INCITS 397-2005 + + + Device complies with ATA/ATAPI-7 ISO/IEC 24739 + + + Device complies with ATA/ATAPI-8 ATA8-AAM (no version claimed) + + + Device complies with ATA/ATAPI-8 ATA8-APT Parallel Transport (no version claimed) + + + Device complies with ATA/ATAPI-8 ATA8-AST Serial Transport (no version claimed) + + + Device complies with ATA/ATAPI-8 ATA8-ACS ATA/ATAPI Command Set (no version claimed) + + + Device complies with ATA/ATAPI-8 ATA8-AAM ANSI INCITS 451-2008 + + + Device complies with ATA/ATAPI-8 ATA8-ACS ANSI INCITS 452-2009 w/ Amendment 1 + + + Device complies with Universal Serial Bus Specification, Revision 1.1 + + + Device complies with Universal Serial Bus Specification, Revision 2.0 + + + Device complies with USB Mass Storage Class Bulk-Only Transport, Revision 1.0 + + + Device complies with UAS (no version claimed) + + + Device complies with UAS T10/2095-D revision 02 + + + Device complies with UAS T10/2095-D revision 04 + + + Device complies with UAS ANSI INCITS 471-2010 + + + Device complies with UAS ISO/IEC 14776-251:2014 + + + Device complies with ACS-2 (no version claimed) + + + Device complies with ACS-2 ANSI INCITS 482-2013 + + + Device complies with ACS-3 (no version claimed) + + + Device complies with UAS-2 (no version claimed) + + + Device complies with SAT (no version claimed) + + + Device complies with SAT T10/1711-D revision 8 + + + Device complies with SAT T10/1711-D revision 9 + + + Device complies with SAT ANSI INCITS 431-2007 + + + Device complies with SAT-2 (no version claimed) + + + Device complies with SAT-2 T10/1826-D revision 06 + + + Device complies with SAT-2 T10/1826-D revision 09 + + + Device complies with SAT-2 ANSI INCITS 465-2010 + + + Device complies with SAT-3 (no version claimed) + + + Device complies with SAT-3 T10/BSR INCITS 517 revision 4 + + + Device complies with SAT-3 T10/BSR INCITS 517 revision 7 + + + Device complies with SAT-3 ANSI INCITS 517-2015 + + + Device complies with SAT-4 (no version claimed) + + + Device complies with SPL (no version claimed) + + + Device complies with SPL T10/2124-D revision 6a + + + Device complies with SPL T10/2124-D revision 7 + + + Device complies with SPL ANSI INCITS 476-2011 + + + Device complies with SPL ANSI INCITS 476-2011 + SPL AM1 INCITS 476/AM1 2012 + + + Device complies with SPL ISO/IEC 14776-261:2012 + + + Device complies with SPL-2 (no version claimed) + + + Device complies with SPL-2 T10/BSR INCITS 505 revision 4 + + + Device complies with SPL-2 T10/BSR INCITS 505 revision 5 + + + Device complies with SPL-2 ANSI INCITS 505-2013 + + + Device complies with SPL-3 (no version claimed) + + + Device complies with SPL-3 T10/BSR INCITS 492 revision 6 + + + Device complies with SPL-3 T10/BSR INCITS 492 revision 7 + + + Device complies with SPL-3 ANSI INCITS 492-2015 + + + Device complies with SPL-4 (no version claimed) + + + Device complies with SOP (no version claimed) + + + Device complies with SOP T10/BSR INCITS 489 revision 4 + + + Device complies with SOP T10/BSR INCITS 489 revision 5 + + + Device complies with SOP ANSI INCITS 489-2014 + + + Device complies with PQI (no version claimed) + + + Device complies with PQI T10/BSR INCITS 490 revision 6 + + + Device complies with PQI T10/BSR INCITS 490 revision 7 + + + Device complies with PQI ANSI INCITS 490-2014 + + + Device complies with SOP-2 (no version claimed) + + + Device complies with PQI-2 (no version claimed) + + + Device complies with IEEE 1667 (no version claimed) + + + Device complies with IEEE 1667-2006 + + + Device complies with IEEE 1667-2009 + + + Device complies with unknown standard code 0x{0:X4} + + + Quantum vendor-specific information: + + + Product family is not specified + + + Product family is 2.6 GB + + + Product family is 6.0 GB + + + Product family is 10.0/20.0 GB + + + Product family is 20.0/40.0 GB + + + Product family is 15.0/30.0 GB + + + Product family: {0} + + + Release firmware: {0} + + + Firmware version: {0}.{1} + + + EEPROM format version: {0}.{1} + + + Firmware personality: {0} + + + Firmware sub-personality: {0} + + + Tape directory format version: {0} + + + Controller hardware version: {0} + + + Drive EEPROM version: {0} + + + Drive hardware version: {0} + + + Media loader firmware version: {0} + + + Media loader hardware version: {0} + + + Media loader mechanical version: {0} + + + Library is present + + + Media loader is present + + + Module revision: {0} + + + IBM vendor-specific information: + + + Performance is not limited + + + Performance is limited using factor {0} + + + Automation is disabled + + + IBM OEM Specific Field: {0} + + + HP vendor-specific information: + + + Device supports WORM version {0} + + + Device supports Tape Disaster Recovery + + + Seagate vendor-specific information: + + + Drive copyright: {0} + + + Drive servo part number: {0} + + + Drive is flashed with Kreon firmware {0}. + + + Vendor's device type modifier = 0x{0:X2} + + + Reserved byte 5, bits 2 to 1 = 0x{0:X2} + + + Reserved byte 56, bits 7 to 4 = 0x{0:X2} + + + Reserved byte 57 = 0x{0:X2} + + + Reserved bytes 74 to 95 + + + Vendor-specific bytes 47 to 55 + + + Vendor-specific bytes 36 to 55 + + + Hi-MD device. + + + Hi-MD specific bytes 44 to 55 + + + Vendor-specific bytes 96 to {0} + + \ No newline at end of file diff --git a/Aaru.Decoders/MMC/CID.cs b/Aaru.Decoders/MMC/CID.cs new file mode 100644 index 000000000..202ae8286 --- /dev/null +++ b/Aaru.Decoders/MMC/CID.cs @@ -0,0 +1,171 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : CID.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes MultiMediaCard CID. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Text; +using Aaru.Helpers; + +namespace Aaru.Decoders.MMC; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "UnassignedField.Global")] +public class CID +{ + public byte ApplicationID; + public byte CRC; + public byte DeviceType; + public byte Manufacturer; + public byte ManufacturingDate; + public string ProductName; + public byte ProductRevision; + public uint ProductSerialNumber; +} + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +public static partial class Decoders +{ + public static CID DecodeCID(uint[] response) + { + if(response?.Length != 4) + return null; + + var data = new byte[16]; + + byte[] tmp = BitConverter.GetBytes(response[0]); + Array.Copy(tmp, 0, data, 0, 4); + tmp = BitConverter.GetBytes(response[1]); + Array.Copy(tmp, 0, data, 4, 4); + tmp = BitConverter.GetBytes(response[2]); + Array.Copy(tmp, 0, data, 8, 4); + tmp = BitConverter.GetBytes(response[3]); + Array.Copy(tmp, 0, data, 12, 4); + + return DecodeCID(data); + } + + public static CID DecodeCID(byte[] response) + { + if(response?.Length != 16) + return null; + + var cid = new CID + { + Manufacturer = response[0], + DeviceType = (byte)(response[1] & 0x03), + ProductRevision = response[9], + ProductSerialNumber = Swapping.Swap(BitConverter.ToUInt32(response, 10)), + ManufacturingDate = response[14], + CRC = (byte)((response[15] & 0xFE) >> 1) + }; + + var tmp = new byte[6]; + Array.Copy(response, 3, tmp, 0, 6); + cid.ProductName = StringHandlers.CToString(tmp); + + return cid; + } + + public static string PrettifyCID(CID cid) + { + if(cid == null) + return null; + + var sb = new StringBuilder(); + + sb.AppendLine(Localization.MultiMediaCard_Device_Identification_Register); + sb.AppendFormat("\t" + Localization.Manufacturer_0, VendorString.Prettify(cid.Manufacturer)).AppendLine(); + + switch(cid.DeviceType) + { + case 0: + sb.AppendLine("\t" + Localization.Removable_device); + + break; + case 1: + sb.AppendLine("\t" + Localization.BGA_device); + + break; + case 2: + sb.AppendLine("\t" + Localization.POP_device); + + break; + } + + sb.AppendFormat("\t" + Localization.Application_ID_0, cid.ApplicationID).AppendLine(); + sb.AppendFormat("\t" + Localization.Product_name_0, cid.ProductName).AppendLine(); + + sb.AppendFormat("\t" + Localization.Product_revision_0_1, (cid.ProductRevision & 0xF0) >> 4, + cid.ProductRevision & 0x0F). + AppendLine(); + + sb.AppendFormat("\t" + Localization.Product_serial_number_0, cid.ProductSerialNumber).AppendLine(); + + string year = (cid.ManufacturingDate & 0x0F) switch + { + 0 => Localization._1997_or_2013, + 1 => Localization._1998_or_2014, + 2 => Localization._1999_or_2015, + 3 => Localization._2000_or_2016, + 4 => Localization._2001_or_2017, + 5 => Localization._2002_or_2018, + 6 => Localization._2003_or_2019, + 7 => Localization._2004_or_2020, + 8 => Localization._2005_or_2021, + 9 => Localization._2006_or_2022, + 10 => Localization._2007_or_2023, + 11 => Localization._2008_or_2024, + 12 => Localization._2009_or_2025, + 13 => "2010", + 14 => "2011", + 15 => "2012", + _ => "" + }; + + sb.AppendFormat("\t" + Localization.Device_manufactured_month_0_of_1, (cid.ManufacturingDate & 0xF0) >> 4, + year). + AppendLine(); + + sb.AppendFormat("\t" + Localization.CID_CRC_0, cid.CRC).AppendLine(); + + return sb.ToString(); + } + + public static string PrettifyCID(uint[] response) => PrettifyCID(DecodeCID(response)); + + public static string PrettifyCID(byte[] response) => PrettifyCID(DecodeCID(response)); +} \ No newline at end of file diff --git a/Aaru.Decoders/MMC/CSD.cs b/Aaru.Decoders/MMC/CSD.cs new file mode 100644 index 000000000..1fa11e48f --- /dev/null +++ b/Aaru.Decoders/MMC/CSD.cs @@ -0,0 +1,627 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : CSD.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes MultiMediaCard CSD. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.MMC; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +public class CSD +{ + public ushort Classes; + public bool ContentProtection; + public bool Copy; + public byte CRC; + public byte DefaultECC; + public bool DSRImplemented; + public byte ECC; + public byte EraseGroupSize; + public byte EraseGroupSizeMultiplier; + public byte FileFormat; + public bool FileFormatGroup; + public byte NSAC; + public bool PermanentWriteProtect; + public byte ReadBlockLength; + public byte ReadCurrentAtVddMax; + public byte ReadCurrentAtVddMin; + public bool ReadMisalignment; + public bool ReadsPartialBlocks; + public ushort Size; + public byte SizeMultiplier; + public byte Speed; + public byte Structure; + public byte TAAC; + public bool TemporaryWriteProtect; + public byte Version; + public byte WriteBlockLength; + public byte WriteCurrentAtVddMax; + public byte WriteCurrentAtVddMin; + public bool WriteMisalignment; + public bool WriteProtectGroupEnable; + public byte WriteProtectGroupSize; + public bool WritesPartialBlocks; + public byte WriteSpeedFactor; +} + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +public static partial class Decoders +{ + public static CSD DecodeCSD(uint[] response) + { + if(response?.Length != 4) + return null; + + var data = new byte[16]; + + byte[] tmp = BitConverter.GetBytes(response[0]); + Array.Copy(tmp, 0, data, 0, 4); + tmp = BitConverter.GetBytes(response[1]); + Array.Copy(tmp, 0, data, 4, 4); + tmp = BitConverter.GetBytes(response[2]); + Array.Copy(tmp, 0, data, 8, 4); + tmp = BitConverter.GetBytes(response[3]); + Array.Copy(tmp, 0, data, 12, 4); + + return DecodeCSD(data); + } + + public static CSD DecodeCSD(byte[] response) + { + if(response?.Length != 16) + return null; + + return new CSD + { + Structure = (byte)((response[0] & 0xC0) >> 6), + Version = (byte)((response[0] & 0x3C) >> 2), + TAAC = response[1], + NSAC = response[2], + Speed = response[3], + Classes = (ushort)((response[4] << 4) + ((response[5] & 0xF0) >> 4)), + ReadBlockLength = (byte)(response[5] & 0x0F), + ReadsPartialBlocks = (response[6] & 0x80) == 0x80, + WriteMisalignment = (response[6] & 0x40) == 0x40, + ReadMisalignment = (response[6] & 0x20) == 0x20, + DSRImplemented = (response[6] & 0x10) == 0x10, + Size = (ushort)(((response[6] & 0x03) << 10) + (response[7] << 2) + ((response[8] & 0xC0) >> 6)), + ReadCurrentAtVddMin = (byte)((response[8] & 0x38) >> 3), + ReadCurrentAtVddMax = (byte)(response[8] & 0x07), + WriteCurrentAtVddMin = (byte)((response[9] & 0xE0) >> 5), + WriteCurrentAtVddMax = (byte)((response[9] & 0x1C) >> 2), + SizeMultiplier = (byte)(((response[9] & 0x03) << 1) + ((response[10] & 0x80) >> 7)), + EraseGroupSize = (byte)((response[10] & 0x7C) >> 2), + EraseGroupSizeMultiplier = (byte)(((response[10] & 0x03) << 3) + ((response[11] & 0xE0) >> 5)), + WriteProtectGroupSize = (byte)(response[11] & 0x1F), + WriteProtectGroupEnable = (response[12] & 0x80) == 0x80, + DefaultECC = (byte)((response[12] & 0x60) >> 5), + WriteSpeedFactor = (byte)((response[12] & 0x1C) >> 2), + WriteBlockLength = (byte)(((response[12] & 0x03) << 2) + ((response[13] & 0xC0) >> 6)), + WritesPartialBlocks = (response[13] & 0x20) == 0x20, + ContentProtection = (response[13] & 0x01) == 0x01, + FileFormatGroup = (response[14] & 0x80) == 0x80, + Copy = (response[14] & 0x40) == 0x40, + PermanentWriteProtect = (response[14] & 0x20) == 0x20, + TemporaryWriteProtect = (response[14] & 0x10) == 0x10, + FileFormat = (byte)((response[14] & 0x0C) >> 2), + ECC = (byte)(response[14] & 0x03), + CRC = (byte)((response[15] & 0xFE) >> 1) + }; + } + + public static string PrettifyCSD(CSD csd) + { + if(csd == null) + return null; + + double unitFactor = 0; + double multiplier = 0; + var unit = ""; + + var sb = new StringBuilder(); + sb.AppendLine(Localization.MultiMediaCard_Device_Specific_Data_Register_); + + switch(csd.Structure) + { + case 0: + sb.AppendLine("\t" + Localization.Register_version_1_0); + + break; + case 1: + sb.AppendLine("\t" + Localization.Register_version_1_1); + + break; + case 2: + sb.AppendLine("\t" + Localization.Register_version_1_2); + + break; + case 3: + sb.AppendLine("\t" + + Localization.Register_version_is_defined_in_Extended_Device_Specific_Data_Register); + + break; + } + + switch(csd.TAAC & 0x07) + { + case 0: + unit = Localization.unit_ns; + unitFactor = 1; + + break; + case 1: + unit = Localization.unit_ns; + unitFactor = 10; + + break; + case 2: + unit = Localization.unit_ns; + unitFactor = 100; + + break; + case 3: + unit = Localization.unit_μs; + unitFactor = 1; + + break; + case 4: + unit = Localization.unit_μs; + unitFactor = 10; + + break; + case 5: + unit = Localization.unit_μs; + unitFactor = 100; + + break; + case 6: + unit = Localization.unit_ms; + unitFactor = 1; + + break; + case 7: + unit = Localization.unit_ms; + unitFactor = 10; + + break; + } + + multiplier = ((csd.TAAC & 0x78) >> 3) switch + { + 0 => 0, + 1 => 1, + 2 => 1.2, + 3 => 1.3, + 4 => 1.5, + 5 => 2, + 6 => 2.5, + 7 => 3, + 8 => 3.5, + 9 => 4, + 10 => 4.5, + 11 => 5, + 12 => 5.5, + 13 => 6, + 14 => 7, + 15 => 8, + _ => multiplier + }; + + double result = unitFactor * multiplier; + sb.AppendFormat("\t" + Localization.Asynchronous_data_access_time_is_0_1, result, unit).AppendLine(); + + sb.AppendFormat("\t" + Localization.Clock_dependent_part_of_data_access_is_0_clock_cycles, csd.NSAC * 100). + AppendLine(); + + unit = Localization.unit_MHz; + + switch(csd.Speed & 0x07) + { + case 0: + unitFactor = 0.1; + + break; + case 1: + unitFactor = 1; + + break; + case 2: + unitFactor = 10; + + break; + case 3: + unitFactor = 100; + + break; + default: + unit = Localization.unit_unknown; + unitFactor = 0; + + break; + } + + multiplier = ((csd.Speed & 0x78) >> 3) switch + { + 0 => 0, + 1 => 1, + 2 => 1.2, + 3 => 1.3, + 4 => 1.5, + 5 => 2, + 6 => 2.6, + 7 => 3, + 8 => 3.5, + 9 => 4, + 10 => 4.5, + 11 => 5.2, + 12 => 5.5, + 13 => 6, + 14 => 7, + 15 => 8, + _ => multiplier + }; + + result = unitFactor * multiplier; + sb.AppendFormat("\t" + Localization.Device_s_clock_frequency_0_1, result, unit).AppendLine(); + + unit = ""; + + for(int cl = 0, mask = 1; cl <= 11; cl++, mask <<= 1) + { + if((csd.Classes & mask) == mask) + unit += $" {cl}"; + } + + sb.AppendFormat("\t" + Localization.Device_support_command_classes_0, unit).AppendLine(); + + if(csd.ReadBlockLength == 15) + sb.AppendLine("\t" + Localization.Read_block_length_size_is_defined_in_extended_CSD); + else + { + sb.AppendFormat("\t" + Localization.Read_block_length_is_0_bytes, Math.Pow(2, csd.ReadBlockLength)). + AppendLine(); + } + + if(csd.ReadsPartialBlocks) + sb.AppendLine("\t" + Localization.Device_allows_reading_partial_blocks); + + if(csd.WriteMisalignment) + sb.AppendLine("\t" + Localization.Write_commands_can_cross_physical_block_boundaries); + + if(csd.ReadMisalignment) + sb.AppendLine("\t" + Localization.Read_commands_can_cross_physical_block_boundaries); + + if(csd.DSRImplemented) + sb.AppendLine("\t" + Localization.Device_implements_configurable_driver_stage); + + if(csd.Size == 0xFFF) + { + sb.AppendLine("\t" + + Localization. + Device_may_be_bigger_than_2GiB_and_have_its_real_size_defined_in_the_extended_CSD); + } + + result = (csd.Size + 1) * Math.Pow(2, csd.SizeMultiplier + 2); + sb.AppendFormat("\t" + Localization.Device_has_0_blocks, (int)result).AppendLine(); + + result = (csd.Size + 1) * Math.Pow(2, csd.SizeMultiplier + 2) * Math.Pow(2, csd.ReadBlockLength); + + switch(result) + { + case > 1073741824: + sb.AppendFormat("\t" + Localization.Device_has_0_GiB, result / 1073741824.0).AppendLine(); + + break; + case > 1048576: + sb.AppendFormat("\t" + Localization.Device_has_0_MiB, result / 1048576.0).AppendLine(); + + break; + case > 1024: + sb.AppendFormat("\t" + Localization.Device_has_0_KiB, result / 1024.0).AppendLine(); + + break; + default: + sb.AppendFormat("\t" + Localization.Device_has_0_bytes, result).AppendLine(); + + break; + } + + switch(csd.ReadCurrentAtVddMin & 0x07) + { + case 0: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_0_5mA_for_reading_at_minimum_voltage); + + break; + case 1: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_1mA_for_reading_at_minimum_voltage); + + break; + case 2: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_5mA_for_reading_at_minimum_voltage); + + break; + case 3: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_10mA_for_reading_at_minimum_voltage); + + break; + case 4: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_25mA_for_reading_at_minimum_voltage); + + break; + case 5: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_35mA_for_reading_at_minimum_voltage); + + break; + case 6: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_60mA_for_reading_at_minimum_voltage); + + break; + case 7: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_100mA_for_reading_at_minimum_voltage); + + break; + } + + switch(csd.ReadCurrentAtVddMax & 0x07) + { + case 0: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_1mA_for_reading_at_maximum_voltage); + + break; + case 1: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_5mA_for_reading_at_maximum_voltage); + + break; + case 2: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_10mA_for_reading_at_maximum_voltage); + + break; + case 3: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_25mA_for_reading_at_maximum_voltage); + + break; + case 4: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_35mA_for_reading_at_maximum_voltage); + + break; + case 5: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_45mA_for_reading_at_maximum_voltage); + + break; + case 6: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_80mA_for_reading_at_maximum_voltage); + + break; + case 7: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_200mA_for_reading_at_maximum_voltage); + + break; + } + + switch(csd.WriteCurrentAtVddMin & 0x07) + { + case 0: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_0_5mA_for_writing_at_minimum_voltage); + + break; + case 1: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_1mA_for_writing_at_minimum_voltage); + + break; + case 2: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_5mA_for_writing_at_minimum_voltage); + + break; + case 3: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_10mA_for_writing_at_minimum_voltage); + + break; + case 4: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_25mA_for_writing_at_minimum_voltage); + + break; + case 5: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_35mA_for_writing_at_minimum_voltage); + + break; + case 6: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_60mA_for_writing_at_minimum_voltage); + + break; + case 7: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_100mA_for_writing_at_minimum_voltage); + + break; + } + + switch(csd.WriteCurrentAtVddMax & 0x07) + { + case 0: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_1mA_for_writing_at_maximum_voltage); + + break; + case 1: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_5mA_for_writing_at_maximum_voltage); + + break; + case 2: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_10mA_for_writing_at_maximum_voltage); + + break; + case 3: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_25mA_for_writing_at_maximum_voltage); + + break; + case 4: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_35mA_for_writing_at_maximum_voltage); + + break; + case 5: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_45mA_for_writing_at_maximum_voltage); + + break; + case 6: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_80mA_for_writing_at_maximum_voltage); + + break; + case 7: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_200mA_for_writing_at_maximum_voltage); + + break; + } + + // TODO: Check specification + unitFactor = Convert.ToDouble(csd.EraseGroupSize); + multiplier = Convert.ToDouble(csd.EraseGroupSizeMultiplier); + result = (unitFactor + 1) * (multiplier + 1); + sb.AppendFormat("\t" + Localization.Device_can_erase_a_minimum_of_0_blocks_at_a_time, (int)result).AppendLine(); + + if(csd.WriteProtectGroupEnable) + { + sb.AppendLine("\t" + Localization.Device_can_write_protect_regions); + + // TODO: Check specification + // unitFactor = Convert.ToDouble(csd.WriteProtectGroupSize); + + sb.AppendFormat("\t" + Localization.Device_can_write_protect_a_minimum_of_0_blocks_at_a_time, + (int)(result + 1)). + AppendLine(); + } + else + sb.AppendLine("\t" + Localization.Device_cant_write_protect_regions); + + switch(csd.DefaultECC) + { + case 0: + sb.AppendLine("\t" + Localization.Device_uses_no_ECC_by_default); + + break; + case 1: + sb.AppendLine("\t" + Localization.Device_uses_BCH_542_512_ECC_by_default); + + break; + case 2: + sb.AppendFormat("\t" + Localization.Device_uses_unknown_ECC_code_0_by_default, csd.DefaultECC). + AppendLine(); + + break; + } + + sb.AppendFormat("\t" + Localization.Writing_is_0_times_slower_than_reading, Math.Pow(2, csd.WriteSpeedFactor)). + AppendLine(); + + if(csd.WriteBlockLength == 15) + sb.AppendLine("\t" + Localization.Write_block_length_size_is_defined_in_extended_CSD); + else + { + sb.AppendFormat("\t" + Localization.Write_block_length_is_0_bytes, Math.Pow(2, csd.WriteBlockLength)). + AppendLine(); + } + + if(csd.WritesPartialBlocks) + sb.AppendLine("\t" + Localization.Device_allows_writing_partial_blocks); + + if(csd.ContentProtection) + sb.AppendLine("\t" + Localization.Device_supports_content_protection); + + if(!csd.Copy) + sb.AppendLine("\t" + Localization.Device_contents_are_original); + + if(csd.PermanentWriteProtect) + sb.AppendLine("\t" + Localization.Device_is_permanently_write_protected); + + if(csd.TemporaryWriteProtect) + sb.AppendLine("\t" + Localization.Device_is_temporarily_write_protected); + + if(!csd.FileFormatGroup) + { + switch(csd.FileFormat) + { + case 0: + sb.AppendLine("\t" + Localization.Device_is_formatted_like_a_hard_disk); + + break; + case 1: + sb.AppendLine("\t" + Localization.Device_is_formatted_like_a_floppy_disk_using_Microsoft_FAT); + + break; + case 2: + sb.AppendLine("\t" + Localization.Device_uses_Universal_File_Format); + + break; + default: + sb.AppendFormat("\t" + Localization.Device_uses_unknown_file_format_code_0, csd.FileFormat). + AppendLine(); + + break; + } + } + else + { + sb.AppendFormat("\t" + Localization.Device_uses_unknown_file_format_code_0_and_file_format_group_1, + csd.FileFormat). + AppendLine(); + } + + switch(csd.ECC) + { + case 0: + sb.AppendLine("\t" + Localization.Device_currently_uses_no_ECC); + + break; + case 1: + sb.AppendLine("\t" + Localization.Device_currently_uses_BCH_542_512_ECC); + + break; + case 2: + sb.AppendFormat("\t" + Localization.Device_currently_uses_unknown_ECC_code_0, csd.DefaultECC). + AppendLine(); + + break; + } + + sb.AppendFormat("\t" + Localization.CSD_CRC_0, csd.CRC).AppendLine(); + + return sb.ToString(); + } + + public static string PrettifyCSD(uint[] response) => PrettifyCSD(DecodeCSD(response)); + + public static string PrettifyCSD(byte[] response) => PrettifyCSD(DecodeCSD(response)); +} \ No newline at end of file diff --git a/Aaru.Decoders/MMC/ExtendedCSD.cs b/Aaru.Decoders/MMC/ExtendedCSD.cs new file mode 100644 index 000000000..1b5338809 --- /dev/null +++ b/Aaru.Decoders/MMC/ExtendedCSD.cs @@ -0,0 +1,1426 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : ExtendedCSD.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes MultiMediaCard extended CSD. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +// ReSharper disable InconsistentNaming + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.InteropServices; +using System.Text; + +namespace Aaru.Decoders.MMC; + +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "UnassignedField.Global")] +[StructLayout(LayoutKind.Sequential, Pack = 1)] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +public class ExtendedCSD +{ + public byte AccessSize; + public byte BackgroundOperationsStatus; + public BackgroundOperationsSupport BackgroundOperationsSupport; + public byte BadBlockManagementMode; + public byte BarrierControl; + public byte BarrierSupport; + public BootAreaWriteProtectionRegister BootAreaWriteProtectionRegister; + public byte BootBusConditions; + public BootConfigProtection BootConfigProtection; + public BootInformation BootInformation; + public byte BootPartitionSize; + public byte BootWriteProtectionStatus; + public byte BusWidth; + public byte CacheControl; + public byte CacheFlushing; + public CacheFlushingPolicy CacheFlushingPolicy; + public uint CacheSize; + public byte Class6CommandsControl; + public byte CMDQueuingDepth; + public CMDQueuingSupport CMDQueuingSupport; + public byte CommandQueueModeEnable; + public byte CommandSet; + public byte CommandSetRevision; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)] + public byte[] ContextConfiguration; + public byte ContextManagementCaps; + public uint CorrectlyProgrammedSectors; + public DataTagSupport DataTagSupport; + public byte DeviceLifeEstimationTypeA; + public byte DeviceLifeEstimationTypeB; + public DeviceType DeviceType; + public ushort DeviceVersion; + public DriverStrength DriverStrength; + public byte DyncapNeeded; + public byte EnableBackgroundOperationsHandshake; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] EnhancedUserDataAreaSize; + public uint EnhancedUserDataStartAddress; + public byte ErasedMemoryContent; + public ushort ExceptionEventsControl; + public ushort ExceptionEventsStatus; + public ushort ExtendedPartitionsAttribute; + public ExtendedPartitionsSupport ExtendedPartitionsSupport; + public byte ExtendedSecurityCommandsError; + public uint FFUArgument; + public FFUFeatures FFUFeatures; + public byte FFUStatus; + public byte FirmwareConfiguration; + public ulong FirmwareVersion; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] + public byte[] GeneralPurposePartitionSize; + public byte GenericCMD6Timeout; + public HighCapacityEraseGroupDefinition HighCapacityEraseGroupDefinition; + public byte HighCapacityEraseTimeout; + public byte HighCapacityEraseUnitSize; + public byte HighCapacityWriteProtectGroupSize; + public byte HighSpeedInterfaceTiming; + public HPIFeatures HPIFeatures; + public byte HPIManagement; + public byte HWResetFunction; + public byte InitializationTimeAfterPartition; + public byte InitializationTimeoutAfterEmulationChange; + public byte LargeUnitSize; + public byte ManuallyStartBackgroundOperations; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] MaxEnhancedAreaSize; + public byte MaxPackedReadCommands; + public byte MaxPackedWriteCommands; + public uint MaxPreLoadingDataSize; + public byte MinimumReadPerformance26; + public byte MinimumReadPerformance26_4; + public byte MinimumReadPerformance52; + public byte MinimumReadPerformanceDDR52; + public byte MinimumWritePerformance26; + public byte MinimumWritePerformance26_4; + public byte MinimumWritePerformance52; + public byte MinimumWritePerformanceDDR52; + public byte ModeConfig; + public byte ModeOperationCodes; + public byte NativeSectorSize; + public uint NumberOfFWSectorsCorrectlyProgrammed; + public byte OperationCodesTimeout; + public byte OptimalReadSize; + public byte OptimalTrimUnitSize; + public byte OptimalWriteSize; + public byte OutOfInterruptBusyTiming; + public byte PackageCaseTemperatureControl; + public byte PackedCommandFailureIndex; + public byte PackedCommandStatus; + public byte PartitionConfiguration; + public byte PartitioningSetting; + public PartitioningSupport PartitioningSupport; + public byte PartitionsAttribute; + public byte PartitionSwitchingTime; + public byte PeriodicWakeUp; + public byte PowerClass; + public byte PowerClass26; + public byte PowerClass26_195; + public byte PowerClass52; + public byte PowerClass52_195; + public byte PowerClassDDR200; + public byte PowerClassDDR200_130; + public byte PowerClassDDR200_195; + public byte PowerClassDDR52; + public byte PowerClassDDR52_195; + public byte PowerOffNotification; + public byte PowerOffNotificationTimeout; + public byte PreEOLInformation; + public uint PreLoadingDataSize; + public byte ProductionStateAwareness; + public byte ProductionStateAwarenessTimeout; + public byte ProductStateAwarenessEnablement; + public byte ReliableWriteSectorCount; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)] + public byte[] Reserved0; + public ushort Reserved1; + public byte Reserved10; + public byte Reserved11; + public byte Reserved12; + public byte Reserved13; + public byte Reserved14; + public byte Reserved15; + public byte Reserved16; + public byte Reserved17; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 177)] + public byte[] Reserved18; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] + public byte[] Reserved19; + public ushort Reserved2; + public byte Reserved3; + public byte Reserved4; + public byte Reserved5; + public byte Reserved6; + public byte Reserved7; + public byte Reserved8; + public byte Reserved9; + public byte Revision; + public byte RPMBSize; + public uint SectorCount; + public byte SectorSize; + public byte SectorSizeEmulation; + public byte SecureEraseMultiplier; + public SecureFeatureSupport SecureFeatureSupport; + public byte SecureRemovalType; + public byte SecureTRIMMultiplier; + public SecureWriteProtectInformation SecureWriteProtectInformation; + public byte SleepAwakeTimeout; + public byte SleepCurrentVcc; + public byte SleepCurrentVccQ; + public byte SleepNotificationTimeout; + public byte StartSanitizeOperation; + public byte StrobeSupport; + public byte Structure; + public DeviceSupportedCommandSets SupportedCommandSets; + public SupportedModes SupportedModes; + public byte SupportsProgramCxDInDDR; + public byte TagResourcesSize; + public byte TagUnitSize; + public byte TRIMMultiplier; + public UserAreaWriteProtectionRegister UserAreaWriteProtectionRegister; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] + public byte[] VendorHealthReport; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)] + public byte[] VendorSpecific; + public byte WriteReliabilityParameterRegister; + public byte WriteReliabilitySettingRegister; +} + +[Flags] +public enum DeviceSupportedCommandSets : byte +{ + Standard = 1 << 0 +} + +[Flags] +public enum HPIFeatures : byte +{ + Supported = 1 << 0, + CMD12 = 1 << 1 +} + +[Flags] +public enum BackgroundOperationsSupport : byte +{ + Supported = 1 << 0 +} + +[Flags] +public enum DataTagSupport : byte +{ + Supported = 1 << 0 +} + +[Flags] +public enum ExtendedPartitionsSupport : byte +{ + SystemCode = 1 << 0, + NonPersistent = 1 << 1 +} + +[Flags] +public enum SupportedModes : byte +{ + FFU = 1 << 0, + VendorSpecific = 1 << 1 +} + +[Flags] +public enum FFUFeatures : byte +{ + SupportedModeOperationCodes = 1 << 0 +} + +[Flags] +public enum CMDQueuingSupport : byte +{ + Supported = 1 << 0 +} + +[Flags] +public enum CacheFlushingPolicy : byte +{ + FIFO = 1 << 0 +} + +[Flags] +public enum SecureFeatureSupport : byte +{ + Purge = 1 << 0, + Defective = 1 << 2, + Trim = 1 << 4, + Sanitize = 1 << 6 +} + +[Flags] +public enum BootInformation : byte +{ + Alternative = 1 << 0, + DDR = 1 << 1, + HighSpeed = 1 << 2 +} + +[Flags] +public enum SecureWriteProtectInformation : byte +{ + Supported = 1 << 0, + Enabled = 1 << 1 +} + +[Flags] +public enum DriverStrength : byte +{ + Type0 = 1 << 0, + Type1 = 1 << 1, + Type2 = 1 << 2, + Type3 = 1 << 3, + Type4 = 1 << 4 +} + +[Flags] +public enum DeviceType : byte +{ + HS_26 = 1 << 0, + HS_52 = 1 << 1, + HS_DDR_52 = 1 << 2, + HS_DDR_52_LV = 1 << 3, + HS200_18 = 1 << 4, + HS200_12 = 1 << 5, + HS400_18 = 1 << 6, + HS400_12 = 1 << 7 +} + +[Flags] +public enum BootConfigProtection : byte +{ + PowerCycle = 1 << 0, + Permanent = 1 << 4 +} + +[Flags] +public enum HighCapacityEraseGroupDefinition : byte +{ + Enabled = 1 << 0 +} + +[Flags] +public enum BootAreaWriteProtectionRegister : byte +{ + PowerOn = 1 << 0, + PowerOnArea2 = 1 << 1, + Permanent = 1 << 2, + PermanentArea2 = 1 << 3, + PermanentDisable = 1 << 4, + PowerOnDisable = 1 << 6, + Selected = 1 << 7 +} + +[Flags] +public enum UserAreaWriteProtectionRegister : byte +{ + ApplyPowerOn = 1 << 0, + ApplyPermanent = 1 << 2, + DisablePowerOn = 1 << 3, + DisablePermanent = 1 << 4, + DisableWriteProtect = 1 << 6, + DisablePassword = 1 << 7 +} + +[Flags] +public enum PartitioningSupport : byte +{ + Supported = 1 << 0, + Enhanced = 1 << 1, + Extended = 1 << 2 +} + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Decoders +{ + public static ExtendedCSD DecodeExtendedCSD(byte[] response) + { + if(response?.Length != 512) + return null; + + var handle = GCHandle.Alloc(response, GCHandleType.Pinned); + var csd = (ExtendedCSD)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(ExtendedCSD)); + handle.Free(); + + return csd; + } + + public static string PrettifyExtendedCSD(ExtendedCSD csd) + { + if(csd == null) + return null; + + var sb = new StringBuilder(); + sb.AppendLine(Localization.MultiMediaCard_Extended_Device_Specific_Data_Register); + + double unit; + + if(csd.ExtendedSecurityCommandsError != 0) + { + sb.AppendFormat("\t" + Localization.Last_extended_security_error_was_0, csd.ExtendedSecurityCommandsError). + AppendLine(); + } + + if(csd.SupportedCommandSets.HasFlag(DeviceSupportedCommandSets.Standard)) + sb.AppendLine("\t" + Localization.Device_supports_standard_MMC_command_set); + + if(((int)csd.SupportedCommandSets & 0xFE) != 0) + sb.AppendFormat("\t" + Localization.Device_supports_unknown_command_sets_0, (int)csd.SupportedCommandSets); + + if(csd.HPIFeatures.HasFlag(HPIFeatures.Supported)) + { + sb.AppendLine(csd.HPIFeatures.HasFlag(HPIFeatures.CMD12) + ? "\t" + Localization.Device_implements_HPI_using_CMD12 + : "\t" + Localization.Device_implements_HPI_using_CMD13); + } + + if(csd.BackgroundOperationsSupport.HasFlag(BackgroundOperationsSupport.Supported)) + sb.AppendLine("\t" + Localization.Device_supports_background_operations); + + sb.AppendFormat("\t" + Localization.Device_supports_a_maximum_of_0_packed_reads_and_1_packed_writes, + csd.MaxPackedReadCommands, csd.MaxPackedWriteCommands). + AppendLine(); + + if(csd.DataTagSupport.HasFlag(DataTagSupport.Supported)) + { + sb.AppendLine("\t" + Localization.Device_supports_Data_Tag); + + sb.AppendFormat("\t" + Localization.Tags_must_be_in_units_of_0_sectors, Math.Pow(2, csd.TagUnitSize)). + AppendLine(); + + sb.AppendFormat("\t" + Localization.Tag_resources_size_is_0, csd.TagResourcesSize).AppendLine(); + } + + if(csd.ContextManagementCaps != 0) + { + sb.AppendFormat("\t" + Localization.Max_context_ID_is_0, csd.ContextManagementCaps & 0xF).AppendLine(); + + sb.AppendFormat("\t" + Localization.Large_unit_maximum_multiplier_is_0, + ((csd.ContextManagementCaps & 0x70) >> 4) + 1). + AppendLine(); + } + + sb.AppendFormat("\t" + Localization.Large_unit_size_is_0_MiB, csd.LargeUnitSize + 1).AppendLine(); + + if(csd.ExtendedPartitionsSupport.HasFlag(ExtendedPartitionsSupport.NonPersistent)) + sb.AppendLine("\t" + Localization.Device_supports_non_persistent_extended_partitions); + + if(csd.ExtendedPartitionsSupport.HasFlag(ExtendedPartitionsSupport.SystemCode)) + sb.AppendLine("\t" + Localization.Device_supports_system_code_extended_partitions); + + if(csd.SupportedModes.HasFlag(SupportedModes.FFU)) + { + sb.AppendLine("\t" + Localization.Device_supports_FFU); + + if(csd.FFUFeatures.HasFlag(FFUFeatures.SupportedModeOperationCodes)) + + // todo public byte ModeOperationCodes + + { + if(csd.OperationCodesTimeout > 0) + { + unit = Math.Pow(2, csd.OperationCodesTimeout) * 100; + + switch(unit) + { + case > 1000000: + sb. + AppendFormat("\t" + Localization.Maximum_timeout_for_switch_command_when_setting_a_value_to_the_mode_operation_codes_field_is_0_s, + unit / 1000000). + AppendLine(); + + break; + case > 1000: + sb. + AppendFormat("\t" + Localization.Maximum_timeout_for_switch_command_when_setting_a_value_to_the_mode_operation_codes_field_is_0_ms, + unit / 1000). + AppendLine(); + + break; + default: + sb. + AppendFormat("\t" + Localization.Maximum_timeout_for_switch_command_when_setting_a_value_to_the_mode_operation_codes_field_is_0_µs, + unit). + AppendLine(); + + break; + } + } + } + } + + if(csd.SupportedModes.HasFlag(SupportedModes.VendorSpecific)) + sb.AppendLine("\t" + Localization.Device_supports_Vendor_Specific_Mode); + + if(csd.BarrierSupport == 0x01) + sb.AppendLine("\t" + Localization.Device_supports_the_barrier_command); + + if(csd.CMDQueuingSupport.HasFlag(CMDQueuingSupport.Supported)) + { + sb.AppendFormat("\t" + Localization.Device_supports_command_queuing_with_a_depth_of_0, + csd.CMDQueuingDepth + 1). + AppendLine(); + } + + sb.AppendFormat("\t" + Localization._0_firmware_sectors_correctly_programmed, + csd.NumberOfFWSectorsCorrectlyProgrammed). + AppendLine(); + + switch(csd.DeviceLifeEstimationTypeB) + { + case 1: + sb.AppendLine("\t" + Localization.Device_used_between_zero_and_10_of_its_estimated_life_time); + + break; + case 2: + sb.AppendLine("\t" + Localization.Device_used_between_10_and_20_of_its_estimated_life_time); + + break; + case 3: + sb.AppendLine("\t" + Localization.Device_used_between_20_and_30_of_its_estimated_life_time); + + break; + case 4: + sb.AppendLine("\t" + Localization.Device_used_between_30_and_40_of_its_estimated_life_time); + + break; + case 5: + sb.AppendLine("\t" + Localization.Device_used_between_40_and_50_of_its_estimated_life_time); + + break; + case 6: + sb.AppendLine("\t" + Localization.Device_used_between_50_and_60_of_its_estimated_life_time); + + break; + case 7: + sb.AppendLine("\t" + Localization.Device_used_between_60_and_70_of_its_estimated_life_time); + + break; + case 8: + sb.AppendLine("\t" + Localization.Device_used_between_70_and_80_of_its_estimated_life_time); + + break; + case 9: + sb.AppendLine("\t" + Localization.Device_used_between_80_and_90_of_its_estimated_life_time); + + break; + case 10: + sb.AppendLine("\t" + Localization.Device_used_between_90_and_100_of_its_estimated_life_time); + + break; + case 11: + sb.AppendLine("\t" + Localization.Device_exceeded_its_maximum_estimated_life_time); + + break; + } + + switch(csd.DeviceLifeEstimationTypeA) + { + case 1: + sb.AppendLine("\t" + Localization.Device_used_between_zero_and_10_of_its_estimated_life_time); + + break; + case 2: + sb.AppendLine("\t" + Localization.Device_used_between_10_and_20_of_its_estimated_life_time); + + break; + case 3: + sb.AppendLine("\t" + Localization.Device_used_between_20_and_30_of_its_estimated_life_time); + + break; + case 4: + sb.AppendLine("\t" + Localization.Device_used_between_30_and_40_of_its_estimated_life_time); + + break; + case 5: + sb.AppendLine("\t" + Localization.Device_used_between_40_and_50_of_its_estimated_life_time); + + break; + case 6: + sb.AppendLine("\t" + Localization.Device_used_between_50_and_60_of_its_estimated_life_time); + + break; + case 7: + sb.AppendLine("\t" + Localization.Device_used_between_60_and_70_of_its_estimated_life_time); + + break; + case 8: + sb.AppendLine("\t" + Localization.Device_used_between_70_and_80_of_its_estimated_life_time); + + break; + case 9: + sb.AppendLine("\t" + Localization.Device_used_between_80_and_90_of_its_estimated_life_time); + + break; + case 10: + sb.AppendLine("\t" + Localization.Device_used_between_90_and_100_of_its_estimated_life_time); + + break; + case 11: + sb.AppendLine("\t" + Localization.Device_exceeded_its_maximum_estimated_life_time); + + break; + } + + switch(csd.PreEOLInformation) + { + case 1: + sb.AppendLine("\t" + Localization.Device_informs_its_in_good_health); + + break; + case 2: + sb.AppendLine("\t" + Localization.Device_informs_it_should_be_replaced_soon); + + break; + case 3: + sb.AppendLine("\t" + Localization.Device_informs_it_should_be_replace_immediately); + + break; + } + + if(csd.OptimalReadSize == 0) + sb.AppendLine("\t" + Localization.Device_does_not_report_an_optimal_read_size); + else + sb.AppendFormat("\t" + Localization.Optimal_read_size_is_0_KiB, 4 * csd.OptimalReadSize).AppendLine(); + + if(csd.OptimalWriteSize == 0) + sb.AppendLine("\t" + Localization.Device_does_not_report_an_optimal_write_size); + else + sb.AppendFormat("\t" + Localization.Optimal_write_size_is_0_KiB, 4 * csd.OptimalWriteSize).AppendLine(); + + if(csd.OptimalTrimUnitSize == 0) + sb.AppendLine("\t" + Localization.Device_does_not_report_an_optimal_trim_size); + else + { + sb.AppendFormat("\t" + Localization.Optimal_trim_size_is_0_KiB, + 4 * Math.Pow(2, csd.OptimalTrimUnitSize - 1)). + AppendLine(); + } + + sb.AppendFormat("\t" + Localization.Device_version_0, csd.DeviceVersion).AppendLine(); + sb.AppendFormat("\t" + Localization.Firmware_version_0, csd.FirmwareVersion).AppendLine(); + + if(csd.CacheSize == 0) + sb.AppendLine("\t" + Localization.Device_has_no_cache); + else + sb.AppendFormat("\t" + Localization.Device_has_0_KiB_of_cache, csd.CacheSize / 8).AppendLine(); + + if(csd.GenericCMD6Timeout > 0) + { + sb.AppendFormat("\t" + Localization.Device_takes_a_maximum_of_0_ms_by_default_for_a_SWITCH_command, + csd.GenericCMD6Timeout * 10). + AppendLine(); + } + + if(csd.PowerOffNotificationTimeout > 0) + { + sb. + AppendFormat("\t" + Localization.Device_takes_a_maximum_of_0_by_default_to_power_off_from_a_SWITCH_command_notification, + csd.PowerOffNotificationTimeout * 10). + AppendLine(); + } + + switch(csd.BackgroundOperationsStatus & 0x03) + { + case 0: + sb.AppendLine("\t" + Localization.Device_has_no_pending_background_operations); + + break; + case 1: + sb.AppendLine("\t" + Localization.Device_has_non_critical_operations_outstanding); + + break; + case 2: + sb.AppendLine("\t" + Localization.Device_has_performance_impacted_operations_outstanding); + + break; + case 3: + sb.AppendLine("\t" + Localization.Device_has_critical_operations_outstanding); + + break; + } + + sb.AppendFormat("\t" + Localization.Last_WRITE_MULTIPLE_command_correctly_programmed_0_sectors, + csd.CorrectlyProgrammedSectors). + AppendLine(); + + if(csd.InitializationTimeAfterPartition > 0) + { + sb.AppendFormat("\t" + Localization.Device_takes_a_maximum_of_0_ms_for_initialization_after_partition, + csd.InitializationTimeAfterPartition * 100). + AppendLine(); + } + + if(csd.CacheFlushingPolicy.HasFlag(CacheFlushingPolicy.FIFO)) + sb.AppendLine("\t" + Localization.Device_uses_a_FIFO_policy_for_cache_flushing); + + if(csd.TRIMMultiplier > 0) + { + sb.AppendFormat("\t" + Localization.Device_takes_a_maximum_of_0_ms_for_trimming_a_single_erase_group, + csd.TRIMMultiplier * 300). + AppendLine(); + } + + if(csd.SecureFeatureSupport.HasFlag(SecureFeatureSupport.Sanitize)) + sb.AppendLine("\t" + Localization.Device_supports_the_sanitize_operation); + + if(csd.SecureFeatureSupport.HasFlag(SecureFeatureSupport.Trim)) + sb.AppendLine("\t" + Localization.Device_supports_supports_the_secure_and_insecure_trim_operations); + + if(csd.SecureFeatureSupport.HasFlag(SecureFeatureSupport.Defective)) + sb.AppendLine("\t" + Localization.Device_supports_automatic_erase_on_retired_defective_blocks); + + if(csd.SecureFeatureSupport.HasFlag(SecureFeatureSupport.Purge)) + sb.AppendLine("\t" + Localization.Device_supports_secure_purge_operations); + + if(csd.SecureEraseMultiplier > 0) + { + sb. + AppendFormat("\t" + Localization.Device_takes_a_maximum_of_0_ms_for_securely_erasing_a_single_erase_group, + csd.SecureEraseMultiplier * 300). + AppendLine(); + } + + if(csd.SecureTRIMMultiplier > 0) + { + sb. + AppendFormat("\t" + Localization.Device_takes_a_maximum_of_0_ms_for_securely_trimming_a_single_erase_group, + csd.SecureTRIMMultiplier * 300). + AppendLine(); + } + + if(csd.BootInformation.HasFlag(BootInformation.HighSpeed)) + sb.AppendLine("\t" + Localization.Device_supports_high_speed_timing_on_boot); + + if(csd.BootInformation.HasFlag(BootInformation.DDR)) + sb.AppendLine("\t" + Localization.Device_supports_dual_data_rate_on_boot); + + if(csd.BootInformation.HasFlag(BootInformation.Alternative)) + sb.AppendLine("\t" + Localization.Device_supports_alternative_boot_method); + + if(csd.BootPartitionSize > 0) + { + sb.AppendFormat("\t" + Localization.Device_has_a_0_KiB_boot_partition, csd.BootPartitionSize * 128). + AppendLine(); + } + + if((csd.AccessSize & 0x0F) > 0) + { + sb.AppendFormat("\t" + Localization.Device_has_a_page_size_of_0_KiB, + 512 * Math.Pow(2, (csd.AccessSize & 0x0F) - 1) / 1024.0). + AppendLine(); + } + + if(csd.HighCapacityEraseUnitSize > 0) + { + sb.AppendFormat("\t" + Localization.Device_erase_groups_are_0_KiB, csd.HighCapacityEraseUnitSize * 512). + AppendLine(); + } + + if(csd.HighCapacityEraseTimeout > 0) + { + sb.AppendFormat("\t" + Localization.Device_takes_a_maximum_of_0_ms_for_erasing_a_single_erase_group, + csd.HighCapacityEraseTimeout * 300). + AppendLine(); + } + + if(csd.HighCapacityWriteProtectGroupSize > 0) + { + sb.AppendFormat("\t" + Localization.Device_smallest_write_protect_group_is_made_of_0_erase_groups, + csd.HighCapacityWriteProtectGroupSize). + AppendLine(); + } + + if(csd.SleepCurrentVcc > 0) + { + unit = Math.Pow(2, csd.SleepCurrentVcc); + + if(unit > 1000) + sb.AppendFormat("\t" + Localization.Device_uses_0_mA_on_Vcc_when_sleeping, unit / 1000).AppendLine(); + else + sb.AppendFormat("\t" + Localization.Device_uses_0_μA_on_Vcc_when_sleeping, unit).AppendLine(); + } + + if(csd.SleepCurrentVccQ > 0) + { + unit = Math.Pow(2, csd.SleepCurrentVccQ); + + if(unit > 1000) + sb.AppendFormat("\t" + Localization.Device_uses_0_mA_on_Vccq_when_sleeping, unit / 1000).AppendLine(); + else + sb.AppendFormat("\t" + Localization.Device_uses_0_μA_on_Vccq_when_sleeping, unit).AppendLine(); + } + + if(csd.ProductionStateAwarenessTimeout > 0) + { + unit = Math.Pow(2, csd.ProductionStateAwareness) * 100; + + switch(unit) + { + case > 1000000: + sb. + AppendFormat("\t" + Localization.Device_takes_a_maximum_of_0_s_to_switch_production_state_awareness, + unit / 1000000). + AppendLine(); + + break; + case > 1000: + sb. + AppendFormat("\t" + Localization.Device_takes_a_maximum_of_0_ms_to_switch_production_state_awareness, + unit / 1000). + AppendLine(); + + break; + default: + sb. + AppendFormat("\t" + Localization.Device_takes_a_maximum_of_0_μs_to_switch_production_state_awareness, + unit). + AppendLine(); + + break; + } + } + + if(csd.SleepAwakeTimeout > 0) + { + unit = Math.Pow(2, csd.SleepAwakeTimeout) * 100; + + switch(unit) + { + case > 1000000: + sb. + AppendFormat("\t" + Localization.Device_takes_a_maximum_of_0_ms_to_transition_between_sleep_and_standby_states, + unit / 1000000). + AppendLine(); + + break; + case > 1000: + sb. + AppendFormat("\t" + Localization.Device_takes_a_maximum_of_0_μs_to_transition_between_sleep_and_standby_states, + unit / 1000). + AppendLine(); + + break; + default: + sb. + AppendFormat("\t" + Localization.Device_takes_a_maximum_of_0_ns_to_transition_between_sleep_and_standby_states, + unit). + AppendLine(); + + break; + } + } + + if(csd.SleepNotificationTimeout > 0) + { + unit = Math.Pow(2, csd.SleepNotificationTimeout) * 10; + + switch(unit) + { + case > 1000000: + sb.AppendFormat("\t" + Localization.Device_takes_a_maximum_of_0_s_to_move_to_sleep_state, + unit / 1000000). + AppendLine(); + + break; + case > 1000: + sb.AppendFormat("\t" + Localization.Device_takes_a_maximum_of_0_ms_to_move_to_sleep_state, + unit / 1000). + AppendLine(); + + break; + default: + sb.AppendFormat("\t" + Localization.Device_takes_a_maximum_of_0_μs_to_move_to_sleep_state, unit). + AppendLine(); + + break; + } + } + + sb.AppendFormat("\t" + Localization.Device_has_0_sectors, csd.SectorCount).AppendLine(); + + if(csd.SecureWriteProtectInformation.HasFlag(SecureWriteProtectInformation.Supported)) + { + sb.AppendLine("\t" + Localization.Device_supports_secure_write_protection); + + if(csd.SecureWriteProtectInformation.HasFlag(SecureWriteProtectInformation.Enabled)) + sb.AppendLine("\t" + Localization.Device_has_secure_write_protection_enabled); + } + + unit = csd.MinimumReadPerformance26 * 300; + + if(csd.MinimumReadPerformance26 == 0) + sb.AppendLine("\t" + Localization.Device_cannot_achieve_2_4MB_s_reading_in_SDR_26Mhz_mode); + else + { + sb.AppendFormat("\t" + Localization.Device_can_achieve_a_minimum_of_0_MB_s_reading_in_SDR_26Mhz_mode, + unit / 1000). + AppendLine(); + } + + unit = csd.MinimumReadPerformance26_4 * 300; + + if(csd.MinimumReadPerformance26_4 == 0) + sb.AppendLine("\t" + Localization.Device_cannot_achieve_2_4MB_s_reading_in_SDR_26Mhz_4_bit_mode); + else + { + sb.AppendFormat("\t" + Localization.Device_can_achieve_a_minimum_of_0_MB_s_reading_in_SDR_26Mhz_4_bit_mode, + unit / 1000). + AppendLine(); + } + + unit = csd.MinimumReadPerformance52 * 300; + + if(csd.MinimumReadPerformance52 == 0) + sb.AppendLine("\t" + Localization.Device_cannot_achieve_2_4MB_s_reading_in_SDR_52Mhz_mode); + else + { + sb.AppendFormat("\t" + Localization.Device_can_achieve_a_minimum_of_0_MB_s_reading_in_SDR_52Mhz_mode, + unit / 1000). + AppendLine(); + } + + unit = csd.MinimumReadPerformanceDDR52 * 600; + + if(csd.MinimumReadPerformanceDDR52 == 0) + sb.AppendLine("\t" + Localization.Device_cannot_achieve_4_8MB_s_reading_in_DDR_52Mhz_mode); + else + { + sb.AppendFormat("\t" + Localization.Device_can_achieve_a_minimum_of_0_MB_s_reading_in_DDR_52Mhz_mode, + unit / 1000). + AppendLine(); + } + + unit = csd.MinimumWritePerformance26 * 300; + + if(csd.MinimumWritePerformance26 == 0) + sb.AppendLine("\t" + Localization.Device_cannot_achieve_2_4MB_s_writing_in_SDR_26Mhz_mode); + else + { + sb.AppendFormat("\t" + Localization.Device_can_achieve_a_minimum_of_0_MB_s_writing_in_SDR_26Mhz_mode, + unit / 1000). + AppendLine(); + } + + unit = csd.MinimumWritePerformance26_4 * 300; + + if(csd.MinimumWritePerformance26_4 == 0) + sb.AppendLine("\t" + Localization.Device_cannot_achieve_2_4MB_s_writing_in_SDR_26Mhz_4_bit_mode); + else + { + sb.AppendFormat("\t" + Localization.Device_can_achieve_a_minimum_of_0_MB_s_writing_in_SDR_26Mhz_4_bit_mode, + unit / 1000). + AppendLine(); + } + + unit = csd.MinimumWritePerformance52 * 300; + + if(csd.MinimumWritePerformance52 == 0) + sb.AppendLine("\t" + Localization.Device_cannot_achieve_2_4MB_s_writing_in_SDR_52Mhz_mode); + else + { + sb.AppendFormat("\t" + Localization.Device_can_achieve_a_minimum_of_0_MB_s_writing_in_SDR_52Mhz_mode, + unit / 1000). + AppendLine(); + } + + unit = csd.MinimumWritePerformanceDDR52 * 600; + + if(csd.MinimumWritePerformanceDDR52 == 0) + sb.AppendLine("\t" + Localization.Device_cannot_achieve_4_8MB_s_writing_in_DDR_52Mhz_mode); + else + { + sb.AppendFormat("\t" + Localization.Device_can_achieve_a_minimum_of_0_MB_s_writing_in_DDR_52Mhz_mode, + unit / 1000). + AppendLine(); + } + + if(csd.PartitionSwitchingTime > 0) + { + sb.AppendFormat("\t" + Localization.Device_can_take_a_maximum_of_0_ms_when_switching_partitions, + csd.PartitionSwitchingTime * 10). + AppendLine(); + } + + if(csd.OutOfInterruptBusyTiming > 0) + { + sb.AppendFormat("\t" + Localization.Device_can_take_a_maximum_of_0_ms_when_releasing_from_an_interrupt, + csd.OutOfInterruptBusyTiming * 10). + AppendLine(); + } + + if(csd.DriverStrength.HasFlag(DriverStrength.Type0)) + sb.AppendLine("\t" + Localization.Device_supports_IO_driver_strength_type_zero); + + if(csd.DriverStrength.HasFlag(DriverStrength.Type1)) + sb.AppendLine("\t" + Localization.Device_supports_IO_driver_strength_type_one); + + if(csd.DriverStrength.HasFlag(DriverStrength.Type2)) + sb.AppendLine("\t" + Localization.Device_supports_IO_driver_strength_type_two); + + if(csd.DriverStrength.HasFlag(DriverStrength.Type3)) + sb.AppendLine("\t" + Localization.Device_supports_IO_driver_strength_type_three); + + if(csd.DriverStrength.HasFlag(DriverStrength.Type4)) + sb.AppendLine("\t" + Localization.Device_supports_IO_driver_strength_type_four); + + if(csd.DeviceType.HasFlag(DeviceType.HS_26)) + sb.AppendLine("\t" + Localization.Device_supports_26_Mhz_mode); + + if(csd.DeviceType.HasFlag(DeviceType.HS_52)) + sb.AppendLine("\t" + Localization.Device_supports_52_Mhz_mode); + + if(csd.DeviceType.HasFlag(DeviceType.HS_DDR_52)) + sb.AppendLine("\t" + Localization.Device_supports_DDR_52_Mhz_mode_at_1_8V_or_3V); + + if(csd.DeviceType.HasFlag(DeviceType.HS_DDR_52_LV)) + sb.AppendLine("\t" + Localization.Device_supports_DDR_52_Mhz_mode_1_2V); + + if(csd.DeviceType.HasFlag(DeviceType.HS200_18)) + sb.AppendLine("\t" + Localization.Device_supports_HS_200_mode_SDR_200Mhz_at_1_8V); + + if(csd.DeviceType.HasFlag(DeviceType.HS200_12)) + sb.AppendLine("\t" + Localization.Device_supports_HS_200_mode_SDR_200Mhz_at_1_2V); + + if(csd.DeviceType.HasFlag(DeviceType.HS400_18)) + sb.AppendLine("\t" + Localization.Device_supports_HS_400_mode_DDR_200Mhz_at_1_8V); + + if(csd.DeviceType.HasFlag(DeviceType.HS400_12)) + sb.AppendLine("\t" + Localization.Device_supports_HS_400_mode_DDR_200Mhz_at_1_2V); + + sb.AppendFormat("\t" + Localization.CSD_version_one_0_revision_one_1, csd.Structure, csd.Revision).AppendLine(); + + switch(csd.CommandSet) + { + case 0: + sb.AppendLine("\t" + Localization.Device_follows_compatibility_MMC_command_set); + + break; + case 1: + switch(csd.CommandSetRevision) + { + case 0: + sb.AppendLine("\t" + Localization.Device_follows_standard_MMC_command_set_v4_0); + + break; + default: + sb. + AppendFormat("\t" + Localization.Device_follows_standard_MMC_command_set_with_unknown_version_code_0, + csd.CommandSetRevision). + AppendLine(); + + break; + } + + break; + default: + sb.AppendFormat("\t" + Localization.Device_follows_unknown_MMC_command_set_code_0_with_revision_code_1, + csd.CommandSet, csd.CommandSetRevision). + AppendLine(); + + break; + } + + switch(csd.HighSpeedInterfaceTiming & 0x0F) + { + case 0: + break; + case 1: + sb.AppendLine("\t" + Localization.Device_is_in_High_Speed_mode); + + break; + case 2: + sb.AppendLine("\t" + Localization.Device_is_in_HS200_mode); + + break; + case 3: + sb.AppendLine("\t" + Localization.Device_is_in_HS400_mode); + + break; + default: + sb.AppendFormat("\t" + Localization.Device_has_unknown_timing_mode_0, + csd.HighSpeedInterfaceTiming & 0x0F). + AppendLine(); + + break; + } + + sb.AppendFormat("\t" + Localization.Selected_driver_strength_is_type_0, + (csd.HighSpeedInterfaceTiming & 0xF0) >> 4). + AppendLine(); + + if((csd.StrobeSupport & 0x01) == 0x01) + { + sb.AppendLine("\t" + Localization.Device_supports_enhanced_strobe_mode); + + sb.AppendLine((csd.BusWidth & 0x80) == 0x80 + ? "\t" + Localization.Device_uses_strobe_during_Data_Out_CRC_and_CMD_responses + : "\t" + Localization.Device_uses_strobe_during_Data_Out_and_CRC_responses); + } + + switch(csd.BusWidth & 0x0F) + { + case 0: + sb.AppendLine("\t" + Localization.Device_is_using_1bit_data_bus); + + break; + case 1: + sb.AppendLine("\t" + Localization.Device_is_using_4bit_data_bus); + + break; + case 2: + sb.AppendLine("\t" + Localization.Device_is_using_8bit_data_bus); + + break; + case 5: + sb.AppendLine("\t" + Localization.Device_is_using_4bit_DDR_data_bus); + + break; + case 6: + sb.AppendLine("\t" + Localization.Device_is_using_8bit_DDR_data_bus); + + break; + default: + sb.AppendFormat("\t" + Localization.Device_is_using_unknown_data_bus_code_0, csd.BusWidth & 0x0F). + AppendLine(); + + break; + } + + switch(csd.ErasedMemoryContent) + { + case 0: + case 1: + sb.AppendFormat("\t" + Localization.Erased_memory_range_shall_be_0, csd.ErasedMemoryContent). + AppendLine(); + + break; + default: + sb.AppendFormat("\t" + Localization.Unknown_erased_memory_content_code_0, csd.ErasedMemoryContent). + AppendLine(); + + break; + } + + if((csd.PartitionConfiguration & 0x40) == 0x40) + sb.AppendLine("\t" + Localization.Device_sends_boot_acknowledge); + + switch((csd.PartitionConfiguration & 0x38) >> 3) + { + case 0: + sb.AppendLine("\t" + Localization.Device_is_not_boot_enabled); + + break; + case 1: + sb.AppendLine("\t" + Localization.Device_boot_partition_one_is_enabled); + + break; + case 2: + sb.AppendLine("\t" + Localization.Device_boot_partition_two_is_enabled); + + break; + case 7: + sb.AppendLine("\t" + Localization.Device_user_area_is_enable_for_boot); + + break; + default: + sb.AppendFormat("\t" + Localization.Unknown_enabled_boot_partition_code_0, + (csd.PartitionConfiguration & 0x38) >> 3). + AppendLine(); + + break; + } + + switch(csd.PartitionConfiguration & 0x07) + { + case 0: + sb.AppendLine("\t" + Localization.There_is_no_access_to_boot_partition); + + break; + case 1: + sb.AppendLine("\t" + Localization.There_is_read_write_access_to_boot_partition_one); + + break; + case 2: + sb.AppendLine("\t" + Localization.There_is_read_write_access_to_boot_partition_two); + + break; + case 3: + sb.AppendLine("\t" + Localization.There_is_read_write_access_to_replay_protected_memory_block); + + break; + default: + sb.AppendFormat("\t" + Localization.There_is_access_to_general_purpose_partition_0, + (csd.PartitionConfiguration & 0x07) - 3). + AppendLine(); + + break; + } + + if(csd.BootConfigProtection.HasFlag(BootConfigProtection.Permanent)) + sb.AppendLine("\t" + Localization.Change_of_the_boot_configuration_register_bits_is_permanently_disabled); + else if(csd.BootConfigProtection.HasFlag(BootConfigProtection.PowerCycle)) + { + sb.AppendLine("\t" + + Localization. + Change_of_the_boot_configuration_register_bits_is_disabled_until_the_next_power_cycle); + } + + switch(csd.BootBusConditions & 0x03) + { + case 0: + sb.AppendLine("\t" + Localization.Device_will_boot_up_in_x1_SDR_or_x4_DDR_bus_width); + + break; + case 1: + sb.AppendLine("\t" + Localization.Device_will_boot_up_in_x4_SDR_or_DDR_bus_width); + + break; + case 2: + sb.AppendLine("\t" + Localization.Device_will_boot_up_in_x8_SDR_or_DDR_bus_width); + + break; + case 3: + sb.AppendLine("\t" + Localization.Unknown_boot_condition_for_bus_width_with_code_three); + + break; + } + + sb.AppendLine((csd.BootBusConditions & 4) == 4 + ? "\t" + Localization.Device_will_retain_boot_conditions_after_boot_operation + : "\t" + + Localization.Device_will_reset_boot_conditions_to_compatibility_mode_after_boot_operation); + + switch((csd.BootBusConditions & 0x24) >> 3) + { + case 0: + sb.AppendLine("\t" + + Localization.Device_will_use_single_data_rate_with_compatible_timings_in_boot_operation); + + break; + case 1: + sb.AppendLine("\t" + + Localization.Device_will_use_single_data_rate_with_high_speed_timings_in_boot_operation); + + break; + case 2: + sb.AppendLine("\t" + Localization.Device_will_use_dual_data_rate_in_boot_operation); + + break; + case 3: + sb.AppendLine("\t" + Localization.Device_will_use_unknown_boot_mode_with_code_three); + + break; + } + + if(csd.HighCapacityEraseGroupDefinition.HasFlag(HighCapacityEraseGroupDefinition.Enabled)) + { + sb.AppendLine("\t" + + Localization. + Device_will_use_high_capacity_erase_unit_size__timeout_and_write_protect_group_size_definitions); + } + + switch(csd.BootWriteProtectionStatus & 0x03) + { + case 0: + sb.AppendLine("\t" + Localization.Boot_area_one_is_not_protected); + + break; + case 1: + sb.AppendLine("\t" + Localization.Boot_area_one_is_power_on_protected); + + break; + case 2: + sb.AppendLine("\t" + Localization.Boot_area_one_is_permanently_protected); + + break; + } + + switch((csd.BootWriteProtectionStatus & 0x0C) >> 2) + { + case 0: + sb.AppendLine("\t" + Localization.Boot_area_two_is_not_protected); + + break; + case 1: + sb.AppendLine("\t" + Localization.Boot_area_two_is_power_on_protected); + + break; + case 2: + sb.AppendLine("\t" + Localization.Boot_area_two_is_permanently_protected); + + break; + } + + if(csd.BootAreaWriteProtectionRegister.HasFlag(BootAreaWriteProtectionRegister.Permanent)) + { + if(csd.BootAreaWriteProtectionRegister.HasFlag(BootAreaWriteProtectionRegister.Selected)) + { + sb.AppendLine(csd.BootAreaWriteProtectionRegister.HasFlag(BootAreaWriteProtectionRegister. + PermanentArea2) + ? "\t" + Localization.Boot_area_two_is_permanently_write_protected + : "\t" + Localization.Boot_area_one_is_permanently_write_protected); + } + else + sb.AppendLine("\t" + Localization.Both_boot_areas_are_permanently_write_protected); + } + else if(csd.BootAreaWriteProtectionRegister.HasFlag(BootAreaWriteProtectionRegister.PowerOn)) + { + if(csd.BootAreaWriteProtectionRegister.HasFlag(BootAreaWriteProtectionRegister.Selected)) + { + sb.AppendLine(csd.BootAreaWriteProtectionRegister.HasFlag(BootAreaWriteProtectionRegister.PowerOnArea2) + ? "\t" + Localization.Boot_area_two_is_write_protected_until_next_power_cycle + : "\t" + Localization.Boot_area_one_is_write_protected_until_next_power_cycle); + } + else + sb.AppendLine("\t" + Localization.Both_boot_areas_are_write_protected_until_next_power_cycle); + } + + if(csd.BootAreaWriteProtectionRegister.HasFlag(BootAreaWriteProtectionRegister.PermanentDisable)) + sb.AppendLine("\t" + Localization.Permanent_write_protection_of_boot_areas_is_disabled); + + if(csd.BootAreaWriteProtectionRegister.HasFlag(BootAreaWriteProtectionRegister.PowerOnDisable)) + sb.AppendLine("\t" + Localization.Power_cycled_write_protection_of_boot_areas_is_disabled); + + if(csd.UserAreaWriteProtectionRegister.HasFlag(UserAreaWriteProtectionRegister.DisablePassword)) + sb.AppendLine("\t" + Localization.Use_of_password_protection_features_is_permanently_disabled); + + if(csd.UserAreaWriteProtectionRegister.HasFlag(UserAreaWriteProtectionRegister.DisableWriteProtect)) + sb.AppendLine("\t" + Localization.Use_of_permanent_write_protection_is_disabled); + + if(csd.UserAreaWriteProtectionRegister.HasFlag(UserAreaWriteProtectionRegister.DisablePermanent)) + sb.AppendLine("\t" + Localization.Permanent_write_protection_is_disabled); + + if(csd.UserAreaWriteProtectionRegister.HasFlag(UserAreaWriteProtectionRegister.DisablePowerOn)) + sb.AppendLine("\t" + Localization.Power_cycled_write_protection_is_disabled); + + if(csd.UserAreaWriteProtectionRegister.HasFlag(UserAreaWriteProtectionRegister.ApplyPermanent)) + sb.AppendLine("\t" + Localization.Permanent_write_protection_will_be_applied_to_selected_group); + + if(csd.UserAreaWriteProtectionRegister.HasFlag(UserAreaWriteProtectionRegister.ApplyPowerOn)) + sb.AppendLine("\t" + Localization.Power_cycled_write_protection_will_be_applied_to_selected_group); + + if((csd.FirmwareConfiguration & 0x01) == 0x01) + sb.AppendLine("\t" + Localization.Firmware_updates_are_permanently_disabled); + + if(csd.RPMBSize > 0) + { + sb.AppendFormat("\t" + Localization.Device_has_a_0_KiB_replay_protected_memory_block, csd.RPMBSize * 128). + AppendLine(); + } + + if(csd.PartitioningSupport.HasFlag(PartitioningSupport.Supported)) + { + sb.AppendLine("\t" + Localization.Device_supports_partitioning_features); + + if(csd.PartitioningSupport.HasFlag(PartitioningSupport.Enhanced)) + { + sb.AppendLine("\t" + + Localization. + Device_can_have_enhanced_technological_features_in_partitions_and_user_data_area); + } + + if(csd.PartitioningSupport.HasFlag(PartitioningSupport.Extended)) + sb.AppendLine("\t" + Localization.Device_can_have_extended_partitions_attribute); + } + + switch(csd.NativeSectorSize) + { + case 0: + sb.AppendLine("\t" + Localization.Device_natively_uses_512_byte_sectors); + + break; + case 1: + sb.AppendLine("\t" + Localization.Device_natively_uses_4096_byte_sectors); + + break; + default: + sb.AppendFormat("\t" + Localization.Device_natively_uses_unknown_sector_size_indicated_by_code_0, + csd.NativeSectorSize). + AppendLine(); + + break; + } + + switch(csd.SectorSizeEmulation) + { + case 0: + sb.AppendLine("\t" + Localization.Device_is_emulating_512_byte_sectors); + + break; + case 1: + sb.AppendLine("\t" + Localization.Device_is_using_natively_sized_sectors); + + break; + default: + sb.AppendFormat("\t" + Localization.Device_emulates_unknown_sector_size_indicated_by_code_0, + csd.NativeSectorSize). + AppendLine(); + + break; + } + + switch(csd.SectorSize) + { + case 0: + sb.AppendLine("\t" + Localization.Device_currently_addresses_512_byte_sectors); + + break; + case 1: + sb.AppendLine("\t" + Localization.Device_currently_addresses_4096_byte_sectors); + + break; + default: + sb.AppendFormat("\t" + Localization.Device_currently_addresses_unknown_sector_size_indicated_by_code_0, + csd.NativeSectorSize). + AppendLine(); + + break; + } + + if((csd.CacheControl & 0x01) == 0x01) + sb.AppendLine("\t" + Localization.Devices_cache_is_enabled); + + if((csd.CommandQueueModeEnable & 0x01) == 0x01) + sb.AppendLine("\t" + Localization.Device_has_enabled_command_queuing); + + return sb.ToString(); + } + + public static string PrettifyExtendedCSD(byte[] response) => PrettifyExtendedCSD(DecodeExtendedCSD(response)); +} \ No newline at end of file diff --git a/Aaru.Decoders/MMC/OCR.cs b/Aaru.Decoders/MMC/OCR.cs new file mode 100644 index 000000000..26a2605f0 --- /dev/null +++ b/Aaru.Decoders/MMC/OCR.cs @@ -0,0 +1,185 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : OCR.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes MultiMediaCard OCR. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Text; +using Aaru.Helpers; + +namespace Aaru.Decoders.MMC; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +public class OCR +{ + public byte AccessMode; + public bool OneSix; + public bool PowerUp; + public bool ThreeFive; + public bool ThreeFour; + public bool ThreeOne; + public bool ThreeThree; + public bool ThreeTwo; + public bool ThreeZero; + public bool TwoEight; + public bool TwoFive; + public bool TwoFour; + public bool TwoNine; + public bool TwoOne; + public bool TwoSeven; + public bool TwoSix; + public bool TwoThree; + public bool TwoTwo; + public bool TwoZero; +} + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +public static partial class Decoders +{ + public static OCR DecodeOCR(uint response) + { + response = Swapping.Swap(response); + + return new OCR + { + PowerUp = (response & 0x80000000) == 0x80000000, + AccessMode = (byte)((response & 0x60000000) >> 29), + ThreeFive = (response & 0x00800000) == 0x00800000, + ThreeFour = (response & 0x00400000) == 0x00400000, + ThreeThree = (response & 0x00200000) == 0x00200000, + ThreeTwo = (response & 0x00100000) == 0x00100000, + ThreeOne = (response & 0x00080000) == 0x00080000, + ThreeZero = (response & 0x00040000) == 0x00040000, + TwoNine = (response & 0x00020000) == 0x00020000, + TwoEight = (response & 0x00010000) == 0x00010000, + TwoSeven = (response & 0x00008000) == 0x00008000, + TwoSix = (response & 0x00004000) == 0x00004000, + TwoFive = (response & 0x00002000) == 0x00002000, + TwoFour = (response & 0x00001000) == 0x00001000, + TwoThree = (response & 0x00000800) == 0x00000800, + TwoTwo = (response & 0x00000400) == 0x00000400, + TwoOne = (response & 0x00000200) == 0x00000200, + TwoZero = (response & 0x00000100) == 0x00000100, + OneSix = (response & 0x00000080) == 0x00000080 + }; + } + + public static OCR DecodeOCR(byte[] response) => + response?.Length != 4 ? null : DecodeOCR(BitConverter.ToUInt32(response, 0)); + + public static string PrettifyOCR(OCR ocr) + { + if(ocr == null) + return null; + + var sb = new StringBuilder(); + sb.AppendLine(Localization.MultiMediaCard_Operation_Conditions_Register); + + if(!ocr.PowerUp) + sb.AppendLine("\t" + Localization.Device_is_powering_up); + + switch(ocr.AccessMode) + { + case 0: + sb.AppendLine("\t" + Localization.Device_is_byte_addressed); + + break; + case 2: + sb.AppendLine("\t" + Localization.Device_is_sector_addressed); + + break; + default: + sb.AppendFormat("\t" + Localization.Unknown_device_access_mode_0, ocr.AccessMode).AppendLine(); + + break; + } + + if(ocr.ThreeFive) + sb.AppendLine("\t" + Localization.Device_can_work_with_supply_3_5_3_6V); + + if(ocr.ThreeFour) + sb.AppendLine("\t" + Localization.Device_can_work_with_supply_3_4_3_5V); + + if(ocr.ThreeThree) + sb.AppendLine("\t" + Localization.Device_can_work_with_supply_3_3_3_4V); + + if(ocr.ThreeTwo) + sb.AppendLine("\t" + Localization.Device_can_work_with_supply_3_2_3_3V); + + if(ocr.ThreeOne) + sb.AppendLine("\t" + Localization.Device_can_work_with_supply_3_1_3_2V); + + if(ocr.TwoNine) + sb.AppendLine("\t" + Localization.Device_can_work_with_supply_2_9_3_0V); + + if(ocr.TwoEight) + sb.AppendLine("\t" + Localization.Device_can_work_with_supply_2_8_2_9V); + + if(ocr.TwoSeven) + sb.AppendLine("\t" + Localization.Device_can_work_with_supply_2_7_2_8V); + + if(ocr.TwoSix) + sb.AppendLine("\t" + Localization.Device_can_work_with_supply_2_6_2_7V); + + if(ocr.TwoFive) + sb.AppendLine("\t" + Localization.Device_can_work_with_supply_2_5_2_6V); + + if(ocr.TwoFour) + sb.AppendLine("\t" + Localization.Device_can_work_with_supply_2_4_2_5V); + + if(ocr.TwoThree) + sb.AppendLine("\t" + Localization.Device_can_work_with_supply_2_3_2_4V); + + if(ocr.TwoTwo) + sb.AppendLine("\t" + Localization.Device_can_work_with_supply_2_2_2_3V); + + if(ocr.TwoOne) + sb.AppendLine("\t" + Localization.Device_can_work_with_supply_2_1_2_2V); + + if(ocr.TwoZero) + sb.AppendLine("\t" + Localization.Device_can_work_with_supply_2_0_2_1V); + + if(ocr.OneSix) + sb.AppendLine("\t" + Localization.Device_can_work_with_supply_1_65_1_95V); + + return sb.ToString(); + } + + public static string PrettifyOCR(byte[] response) => PrettifyOCR(DecodeOCR(response)); + + public static string PrettifyOCR(uint response) => PrettifyOCR(DecodeOCR(response)); +} \ No newline at end of file diff --git a/Aaru.Decoders/MMC/VendorString.cs b/Aaru.Decoders/MMC/VendorString.cs new file mode 100644 index 000000000..8508dcbc9 --- /dev/null +++ b/Aaru.Decoders/MMC/VendorString.cs @@ -0,0 +1,52 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : VendorString.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes MultiMediaCard vendor code. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; + +namespace Aaru.Decoders.MMC; + +/// Decodes MultiMediaCard vendors +public static class VendorString +{ + /// Converts the byte value of a MultiMediaCard vendor ID to the manufacturer's name string + /// MMC vendor ID + /// Manufacturer + [SuppressMessage("ReSharper", "StringLiteralTypo")] + public static string Prettify(byte mmcVendorId) => mmcVendorId switch + { + 0x07 => "Nokia", + 0x15 => "Samsung", + 0x2C => "extreMEmory", + _ => string.Format(Localization.Unknown_manufacturer_ID_0, + mmcVendorId) + }; +} \ No newline at end of file diff --git a/Aaru.Decoders/PCMCIA/CIS.cs b/Aaru.Decoders/PCMCIA/CIS.cs new file mode 100644 index 000000000..718ebc72f --- /dev/null +++ b/Aaru.Decoders/PCMCIA/CIS.cs @@ -0,0 +1,324 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : CIS.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes PCMCIA Card Information Structure. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using System.Text; +using Aaru.Helpers; + +namespace Aaru.Decoders.PCMCIA; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +public static class CIS +{ + // TODO: Handle links? Or are they removed in lower layers of the operating system drivers? + public static Tuple[] GetTuples(byte[] data) + { + List tuples = new(); + var position = 0; + + while(position < data.Length) + { + var tuple = new Tuple + { + Code = (TupleCodes)data[position] + }; + + if(tuple.Code == TupleCodes.CISTPL_NULL) + continue; + + if(tuple.Code == TupleCodes.CISTPL_END) + break; + + tuple.Link = data[position + 1]; + + if(position + 2 + tuple.Link > data.Length) + break; + + tuple.Data = new byte[tuple.Link + 2]; + Array.Copy(data, position, tuple.Data, 0, tuple.Link + 2); + + tuples.Add(tuple); + position += tuple.Link + 2; + } + + return tuples.ToArray(); + } + + public static DeviceGeometryTuple DecodeDeviceGeometryTuple(Tuple tuple) + { + if(tuple == null) + return null; + + if(tuple.Code != TupleCodes.CISTPL_DEVICEGEO && tuple.Code != TupleCodes.CISTPL_DEVICEGEO_A) + return null; + + return tuple.Data == null ? null : DecodeDeviceGeometryTuple(tuple.Data); + } + + public static DeviceGeometryTuple DecodeDeviceGeometryTuple(byte[] data) + { + if((data?.Length - 2) % 6 != 0) + return null; + + var tuple = new DeviceGeometryTuple(); + List geometries = new(); + + for(var position = 2; position < data.Length; position += 6) + { + var geometry = new DeviceGeometry + { + CardInterface = data[position], + EraseBlockSize = data[position + 1], + ReadBlockSize = data[position + 2], + WriteBlockSize = data[position + 3], + Partitions = data[position + 4], + Interleaving = data[position + 5] + }; + + geometries.Add(geometry); + } + + tuple.Code = (TupleCodes)data[0]; + tuple.Link = data[1]; + tuple.Geometries = geometries.ToArray(); + + return tuple; + } + + public static string PrettifyDeviceGeometryTuple(DeviceGeometryTuple tuple) + { + if(tuple == null) + return null; + + if(tuple.Code != TupleCodes.CISTPL_DEVICEGEO && tuple.Code != TupleCodes.CISTPL_DEVICEGEO_A) + return null; + + var sb = new StringBuilder(); + sb.AppendLine(Localization.PCMCIA_Device_Geometry_Tuples); + + foreach(DeviceGeometry geometry in tuple.Geometries) + { + sb.AppendLine("\t" + Localization.Geometry); + + sb.AppendFormat("\t\t" + Localization.Device_width_0_bits, (1 << geometry.CardInterface - 1) * 8). + AppendLine(); + + sb.AppendFormat("\t\t" + Localization.Erase_block_0_bytes, + (1 << geometry.EraseBlockSize - 1) * (1 << geometry.Interleaving - 1)). + AppendLine(); + + sb.AppendFormat("\t\t" + Localization.Read_block_0_bytes, + (1 << geometry.ReadBlockSize - 1) * (1 << geometry.Interleaving - 1)). + AppendLine(); + + sb.AppendFormat("\t\t" + Localization.Write_block_0_bytes, + (1 << geometry.WriteBlockSize - 1) * (1 << geometry.Interleaving - 1)). + AppendLine(); + + sb.AppendFormat("\t\t" + Localization.Partition_alignment_0_bytes, + (1 << geometry.EraseBlockSize - 1) * + (1 << geometry.Interleaving - 1) * + (1 << geometry.Partitions - 1)). + AppendLine(); + } + + return sb.ToString(); + } + + public static string PrettifyDeviceGeometryTuple(Tuple tuple) => + PrettifyDeviceGeometryTuple(DecodeDeviceGeometryTuple(tuple)); + + public static string PrettifyDeviceGeometryTuple(byte[] data) => + PrettifyDeviceGeometryTuple(DecodeDeviceGeometryTuple(data)); + + public static ManufacturerIdentificationTuple DecodeManufacturerIdentificationTuple(Tuple tuple) + { + if(tuple?.Code != TupleCodes.CISTPL_MANFID) + return null; + + return tuple.Data == null ? null : DecodeManufacturerIdentificationTuple(tuple.Data); + } + + public static ManufacturerIdentificationTuple DecodeManufacturerIdentificationTuple(byte[] data) + { + if(data == null) + return null; + + if(data.Length < 6) + return null; + + return new ManufacturerIdentificationTuple + { + Code = (TupleCodes)data[0], + Link = data[1], + ManufacturerID = BitConverter.ToUInt16(data, 2), + CardID = BitConverter.ToUInt16(data, 4) + }; + } + + public static string PrettifyManufacturerIdentificationTuple(ManufacturerIdentificationTuple tuple) + { + if(tuple?.Code != TupleCodes.CISTPL_MANFID) + return null; + + var sb = new StringBuilder(); + sb.AppendLine(Localization.Manufacturer_Identification_Tuple); + sb.AppendFormat("\t" + Localization.Manufacturer_ID_0, VendorCode.Prettify(tuple.ManufacturerID)).AppendLine(); + sb.AppendFormat("\t" + Localization.Card_ID_0, tuple.CardID).AppendLine(); + + return sb.ToString(); + } + + public static string PrettifyManufacturerIdentificationTuple(Tuple tuple) => + PrettifyManufacturerIdentificationTuple(DecodeManufacturerIdentificationTuple(tuple)); + + public static string PrettifyManufacturerIdentificationTuple(byte[] data) => + PrettifyManufacturerIdentificationTuple(DecodeManufacturerIdentificationTuple(data)); + + public static Level1VersionTuple DecodeLevel1VersionTuple(Tuple tuple) + { + if(tuple?.Code != TupleCodes.CISTPL_VERS_1) + return null; + + return tuple.Data == null ? null : DecodeLevel1VersionTuple(tuple.Data); + } + + public static Level1VersionTuple DecodeLevel1VersionTuple(byte[] data) + { + if(data == null) + return null; + + if(data.Length < 4) + return null; + + List buffer = new(); + List strings = null; + var firstString = false; + const bool secondString = false; + + var tuple = new Level1VersionTuple + { + Code = (TupleCodes)data[0], + Link = data[1], + MajorVersion = data[2], + MinorVersion = data[3] + }; + + for(var position = 4; position < data.Length; position++) + { + if(data[position] == 0xFF) + break; + + buffer.Add(data[position]); + + if(data[position] != 0x00) + continue; + + if(!firstString) + { + tuple.Manufacturer = StringHandlers.CToString(buffer.ToArray()); + buffer = new List(); + firstString = true; + + continue; + } + + // TODO: Check this + if(!secondString) + { + tuple.Product = StringHandlers.CToString(buffer.ToArray()); + buffer = new List(); + firstString = true; + + continue; + } + + if(strings == null) + strings = new List(); + + strings.Add(StringHandlers.CToString(buffer.ToArray())); + buffer = new List(); + } + + if(strings != null) + tuple.AdditionalInformation = strings.ToArray(); + + return tuple; + } + + public static string PrettifyLevel1VersionTuple(Level1VersionTuple tuple) + { + if(tuple?.Code != TupleCodes.CISTPL_VERS_1) + return null; + + var sb = new StringBuilder(); + sb.AppendLine(Localization.PCMCIA_Level_1_Version_Product_Information_Tuple); + + sb.AppendFormat("\t" + Localization.Card_indicates_compliance_with_PC_Card_Standard_Release_0_1, + tuple.MajorVersion, tuple.MinorVersion). + AppendLine(); + + if(string.IsNullOrEmpty(tuple.Manufacturer)) + sb.AppendLine("\t" + Localization.No_manufacturer_information_string); + else + sb.AppendFormat(Localization.Manufacturer_0, tuple.Manufacturer).AppendLine(); + + if(string.IsNullOrEmpty(tuple.Product)) + sb.AppendLine("\t" + Localization.No_product_name_string); + else + sb.AppendFormat(Localization.Product_name_0, tuple.Product).AppendLine(); + + if(tuple.AdditionalInformation == null || tuple.AdditionalInformation.Length == 0) + sb.AppendLine("\t" + Localization.No_additional_information); + else + { + sb.AppendLine("\t" + Localization.Additional_information); + + foreach(string info in tuple.AdditionalInformation.Where(info => !string.IsNullOrEmpty(info))) + sb.Append($"\t\t{info}").AppendLine(); + } + + return sb.ToString(); + } + + public static string PrettifyLevel1VersionTuple(Tuple tuple) => + PrettifyLevel1VersionTuple(DecodeLevel1VersionTuple(tuple)); + + public static string PrettifyLevel1VersionTuple(byte[] data) => + PrettifyLevel1VersionTuple(DecodeLevel1VersionTuple(data)); +} \ No newline at end of file diff --git a/Aaru.Decoders/PCMCIA/Enums.cs b/Aaru.Decoders/PCMCIA/Enums.cs new file mode 100644 index 000000000..184d63bd5 --- /dev/null +++ b/Aaru.Decoders/PCMCIA/Enums.cs @@ -0,0 +1,184 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : Enums.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Contains PCMCIA enumerations. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; + +namespace Aaru.Decoders.PCMCIA; + +/// Tuple codes. +[SuppressMessage("ReSharper", "InconsistentNaming")] +public enum TupleCodes : byte +{ + /// Checksum control + CISTPL_CHECKSUM = 0x10, + /// End-of-chain + CISTPL_END = 0xFF, + /// Indirect access PC Card memory + CISTPL_INDIRECT = 0x03, + /// Link-target-control + CISTPL_LINKTARGET = 0x13, + /// Longlink to attribute memory + CISTPL_LONGLINK_A = 0x11, + /// Longlink to common memory + CISTPL_LONGLINK_C = 0x12, + /// Longlink to next chain on a Cardbus PC Card + CISTPL_LONGLINK_CB = 0x02, + /// Longlink to function specific chains + CISTPL_LONGLINK_MFC = 0x06, + /// No-link to common memory + CISTPL_NO_LINK = 0x14, + /// Null tuple + CISTPL_NULL = 0x00, + /// Alternate language string + CISTPL_ALTSTR = 0x16, + /// Common memory device information + CISTPL_DEVICE = 0x01, + /// Attribute memory device information + CISTPL_DEVICE_A = 0x17, + /// Other operating conditions information for attribute memory + CISTPL_DEVICE_OA = 0x1D, + /// Other operating conditions information for common memory + CISTPL_DEVICE_OC = 0x1C, + /// Device geometry information for common memory + CISTPL_DEVICEGEO = 0x1E, + /// Device geometry information for attribute memory + CISTPL_DEVICEGEO_A = 0x1F, + /// Extended common memory device information + CISTPL_EXTDEVIC = 0x09, + /// Function extensions + CISTPL_FUNCE = 0x22, + /// Function class identification + CISTPL_FUNCID = 0x21, + /// JEDEC programming information for attribute memory + CISTPL_JEDEC_A = 0x19, + /// JEDEC programming information for common memory + CISTPL_JEDEC_C = 0x18, + /// Manufacturer identification string + CISTPL_MANFID = 0x20, + /// Level 1 version/product information + CISTPL_VERS_1 = 0x15, + /// BAR for a CardBus PC Card + CISTPL_BAR = 0x07, + /// Configuration-table-entry + CISTPL_CFTABLE_ENTRY = 0x1B, + /// Configuration-table-entry for a CardBus PC Card + CISTPL_CFTABLE_ENTRY_CB = 0x05, + /// Configuration tuple for a 16-bit PC Card + CISTPL_CONFIG = 0x1A, + /// Configuration tuple for a CardBus PC Card + CISTPL_CONFIG_CB = 0x04, + /// Function state save/restore definition + CISTPL_PWR_MGMNT = 0x08, + /// Battery replacement date + CISTPL_BATTERY = 0x45, + /// Card initialization date + CISTPL_DATE = 0x44, + /// Level 2 version/product information + CISTPL_VERS_2 = 0x40, + /// Byte ordering for disk-like partitions + CISTPL_BYTEORDER = 0x43, + /// Data recording format for common memory + CISTPL_FORMAT = 0x41, + /// Data recording format for attribute memory + CISTPL_FORMAT_A = 0x47, + /// Partition geometry + CISTPL_GEOMETRY = 0x42, + /// Software interleaving + CISTPL_SWIL = 0x23, + /// Partition organization + CISTPL_ORG = 0x46, + /// Special purpose + CISTPL_SPCL = 0x90 +} + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +public enum DeviceTypeCodes : byte +{ + /// No device, used to designate a hole + DTYPE_NULL = 0, + /// Masked ROM + DTYPE_ROM = 1, + /// One-type-programmable ROM + DTYPE_OTPROM = 2, + /// UV-Erasable Programmable ROM + DTYPE_EPROM = 3, + /// Electronically-Erasable Programmable ROM + DTYPE_EEPROM = 4, + /// Flash memory + DTYPE_FLASH = 5, + /// Static RAM + DTYPE_SRAM = 6, + /// Dynamic RAM + DTYPE_DRAM = 7, + /// Function-specific memory address range + DTYPE_FUNCSPEC = 13, + /// Extended type follows + DTYPE_EXTEND = 14 +} + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +public enum DeviceSpeedCodes : byte +{ + /// No device + DSPEED_NULL = 0, + /// 250 ns + DSPEED_250NS = 1, + /// 200 ns + DSPEED_200NS = 2, + /// 150 ns + DSPEED_150NS = 3, + /// 100 ns + DSPEED_100NS = 4, + /// Extended speed follows + DSPEED_EXT = 7 +} + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +public enum FunctionCodes : byte +{ + MultiFunction = 0x00, + Memory = 0x01, + Serial = 0x02, + Parallel = 0x03, + FixedDisk = 0x04, + Video = 0x05, + Network = 0x06, + AIMS = 0x07, + SCSI = 0x08, + Security = 0x09, + Instrument = 0x0A, + HighSpeedSerial = 0x0B, + VendorSpecific = 0xFE +} \ No newline at end of file diff --git a/Aaru.Decoders/PCMCIA/Types.cs b/Aaru.Decoders/PCMCIA/Types.cs new file mode 100644 index 000000000..ead6ab40f --- /dev/null +++ b/Aaru.Decoders/PCMCIA/Types.cs @@ -0,0 +1,347 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : Types.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Contains PCMCIA tuple structures. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; + +// ReSharper disable UnusedMember.Global +// ReSharper disable UnusedType.Global +// ReSharper disable InconsistentNaming +// ReSharper disable ClassCanBeSealed.Global +// ReSharper disable MemberCanBeInternal + +namespace Aaru.Decoders.PCMCIA; + +/// Basic classure of a PCMCIA tuple +public class Tuple +{ + public TupleCodes Code; + public byte[] Data; + public byte Link; +} + +/// Checksum tuple +public class ChecksumTuple +{ + /// Modulo-256 sum of region + public byte Checksum; + /// + /// + /// + public TupleCodes Code; + /// Length of region to be checksummed + public ushort Length; + /// Link to next tuple + public byte Link; + /// Offset to region to be checksummed + public short Offset; +} + +/// Indirect Access PC Card Memory +public class IndirectTuple +{ + /// + /// + /// + public TupleCodes Code; + /// Link to next tuple + public byte Link; +} + +/// Link target tuple +public class LinkTargetTuple +{ + /// + /// + /// + public TupleCodes Code; + /// Link to next tuple + public byte Link; + /// 'C''I''S' in ASCII + public byte[] Tag; +} + +/// 16-bit PC Card Long Link Tuple +public class LongLinkTuple +{ + /// Target address + public uint Address; + /// + /// or or + /// + /// + public TupleCodes Code; + /// Link to next tuple + public byte Link; +} + +[SuppressMessage("ReSharper", "ClassNeverInstantiated.Global")] +public class ConfigurationAddress +{ + /// Target address + public uint Address; + /// Target address space, 0 = attribute, 1 = common + public byte TargetAddressSpace; +} + +/// Multiple function link tuple +public class MultipleFunctionLinkTuple +{ + /// Link to more configuration registers + public ConfigurationAddress[] Addresses; + /// + /// + /// + public TupleCodes Code; + /// Link to next tuple + public byte Link; + /// How many functions follow + public byte NumberFunctions; +} + +public class NoLinkTuple +{ + /// + /// + /// + public TupleCodes Code; + /// Link to next tuple + public byte Link; +} + +public class AlternateStringTuple +{ + /// + /// + /// + public TupleCodes Code; + /// Link to next tuple + public byte Link; + /// + /// Array of strings. On memory they're preceded by an ISO Escape Code indicating codepage. Here they're stored as + /// Unicode, so no need for it. + /// + public string[] Strings; +} + +[SuppressMessage("ReSharper", "ClassNeverInstantiated.Global")] +public class ExtendedDeviceSpeed +{ + /// Speed exponent + public byte Exponent; + /// Another extended follows + public bool Extended; + /// Speed mantisa + public byte Mantissa; +} + +public struct DeviceInfo +{ + /// Device type code + public DeviceTypeCodes Type; + /// Write protected + public bool WPS; + /// Speed code + public DeviceSpeedCodes Speed; + /// Extended speeds + public ExtendedDeviceSpeed[] ExtendedSpeeds; + /// Extended types + public byte[] ExtendedTypes; + /// Size in units - 1 + public byte Units; + /// Code to define units unit + public byte SizeCode; +} + +public class DeviceTuple +{ + /// or + public TupleCodes Code; + /// Array of device information bytes + public DeviceInfo[] Infos; + /// Link to next tuple + public byte Link; +} + +public struct OtherConditionInfo +{ + /// True if another other condition info follows + public bool Extended; + /// Vcc used + public byte VccUsed; + /// Supports WAIT# signal + public bool MWAIT; +} + +public class OtherConditionTuple +{ + /// or + public TupleCodes Code; + /// Array of device information bytes + public DeviceInfo[] Infos; + /// Link to next tuple + public byte Link; + /// Array of other condition information bytes + public OtherConditionInfo[] OtherConditionInfos; +} + +public struct DeviceGeometry +{ + /// 1 << n-1 bytes, 2 = 16-bit PC Card, 3 = CardBus PC Card + public byte CardInterface; + /// + /// Erase block size in 1 << n-1 increments of wide accesses. If n == 4, and + /// == 16, erase block size = 32 * 4 = 128 bytes + /// + public byte EraseBlockSize; + /// + /// Read block size in 1 << n-1 increments of wide accesses. If n == 4, and + /// == 16, read block size = 32 * 4 = 128 bytes + /// + public byte ReadBlockSize; + /// + /// Write block size in 1 << n-1 increments of wide accesses. If n == 4, and + /// == 16, write block size = 32 * 4 = 128 bytes + /// + public byte WriteBlockSize; + /// + /// Device partitioning in granularity of 1 << n-1 erase blocks If n == 4, and erase block is 128 bytes, + /// partitions must be aligned to 32 erase block, or 4096 bytes + /// + public byte Partitions; + /// Card employs a multiple of 1 << n-1 times interleaving the entire memory arrays + public byte Interleaving; +} + +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +public class DeviceGeometryTuple +{ + /// or + public TupleCodes Code; + /// Array of device geometries + public DeviceGeometry[] Geometries; + /// Link to next tuple + public byte Link; +} + +public class FunctionIdentificationTuple +{ + /// + /// + /// + public TupleCodes Code; + /// Function code + public FunctionCodes Function; + /// Link to next tuple + public byte Link; + /// Device wants to be part of power-on-self-test + public bool POST; + /// Device contains boot ROM + public bool ROM; +} + +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +public class ManufacturerIdentificationTuple +{ + /// Card ID + public ushort CardID; + /// + /// + /// + public TupleCodes Code; + /// Link to next tuple + public byte Link; + /// Manufacturer ID + public ushort ManufacturerID; +} + +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +public class Level1VersionTuple +{ + /// Additional information strings + public string[] AdditionalInformation; + /// + /// + /// + public TupleCodes Code; + /// Link to next tuple + public byte Link; + /// Major version of standard compliance + public byte MajorVersion; + /// Manufacturer string + public string Manufacturer; + /// Minor version of standard compliance + public byte MinorVersion; + /// Product string + public string Product; +} + +public class Level2VersionTuple +{ + /// Address of first data byte + public ushort Address; + /// Number of copies of CIS present + public byte CISCopies; + /// + /// + /// + public TupleCodes Code; + /// Level of compliance + public byte Compliance; + /// Informational message about the card + public string Information; + /// Link to next tuple + public byte Link; + /// Vendor of software that formatted the card + public string OEM; + /// Version of this classure + public byte StructureVersion; + /// Vendor-specific byte + public byte VendorSpecific1; + /// Vendor-specific byte + public byte VendorSpecific2; +} + +public class GeometryTuple +{ + /// + /// + /// + public TupleCodes Code; + /// Cylinders + public ushort Cylinders; + /// Link to next tuple + public byte Link; + /// Sectors per track + public byte SectorsPerTrack; + /// Tracks per cylinder + public byte TracksPerCylinder; +} \ No newline at end of file diff --git a/Aaru.Decoders/PCMCIA/VendorCode.cs b/Aaru.Decoders/PCMCIA/VendorCode.cs new file mode 100644 index 000000000..dc8960ec4 --- /dev/null +++ b/Aaru.Decoders/PCMCIA/VendorCode.cs @@ -0,0 +1,678 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : VendorCode.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes PCMCIA vendor code. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; + +namespace Aaru.Decoders.PCMCIA; + +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +public static class VendorCode +{ + [SuppressMessage("ReSharper", "StringLiteralTypo")] + public static string Prettify(ushort id) + { + switch(id) + { + #region JEDEC + + case 0x01: + return "AMD"; + case 0x02: + return "AMI"; + case 0x83: + return "Fairchild"; + case 0x04: + return "Fujitsu"; + case 0x85: + return "GTE"; + case 0x86: + return "Harris"; + case 0x07: + return "Hitachi"; + case 0x08: + return "Inmos"; + case 0x89: + return "Intel"; + case 0x8A: + return "I.T.T."; + case 0x0B: + return "Intersil"; + case 0x8C: + return "Monolithic Memories"; + case 0x0D: + return "Mostek"; + case 0x0E: + return "Freescale"; + case 0x8F: + return "National"; + case 0x10: + return "NEC"; + case 0x91: + return "RCA"; + case 0x92: + return "Raytheon"; + case 0x13: + return "Conexant"; + case 0x94: + return "Seeq"; + case 0x15: + return "NXP"; + case 0x16: + return "Synertek"; + case 0x97: + return "Texas Instruments"; + case 0x98: + return "Toshiba"; + case 0x19: + return "Xicor"; + case 0x1A: + return "Zilog"; + case 0x9B: + return "Eurotechnique"; + case 0x1C: + return "Mitsubishi2"; + case 0x9D: + return "Lucent"; + case 0x9E: + return "Exel"; + case 0x1F: + return "Atmel"; + case 0x20: + return "SGS/Thomson"; + case 0xA1: + return "Lattice Semiconductor"; + case 0xA2: + return "NCR"; + case 0x23: + return "Wafer Scale Integration"; + case 0xA4: + return "International Business Machines"; + case 0x25: + return "Tristar"; + case 0x26: + return "Visic"; + case 0xA7: + return "International CMOS Technology"; + case 0xA8: + return "SSSI"; + case 0x29: + return "Microchip Technology"; + case 0x2A: + return "Ricoh"; + case 0xAB: + return "VLSI"; + case 0x2C: + return "Micron Technology"; + case 0xAD: + return "Hynix Semiconductor"; + case 0xAE: + return "OKI Semiconductor"; + case 0x2F: + return "ACTEL"; + case 0xB0: + return "Sharp"; + case 0x31: + return "Catalyst"; + case 0x32: + return "Panasonic"; + case 0xB3: + return "IDT"; + case 0x34: + return "Cypress"; + case 0xB5: + return "Digital Equipment Corporation"; + case 0xB6: + return "LSI Logic"; + case 0x37: + return "Zarlink"; + case 0x38: + return "UTMC"; + case 0xB9: + return "Thinking Machine"; + case 0xBA: + return "Thomson CSF"; + case 0x3B: + return "Integrated CMOS"; + case 0xBC: + return "Honeywell"; + case 0x3D: + return "Tektronix"; + case 0x3E: + return "Oracle Corporation"; + case 0xBF: + return "Silicon Storage Technology"; + case 0x40: + return "ProMos"; + case 0xC1: + return "Infineon"; + case 0xC2: + return "Macronix"; + case 0x43: + return "Xerox"; + case 0xC4: + return "Plus Logic"; + case 0x45: + return "SanDisk Corporation"; + case 0x46: + return "Elan Circuit Technology"; + case 0xC7: + return "European Silicon"; + case 0xC8: + return "Apple"; + case 0x49: + return "Xilinx"; + case 0x4A: + return "Compaq"; + case 0xCB: + return "Protocol Engines"; + case 0x4C: + return "SCI"; + case 0xCD: + return "Seiko Instruments"; + case 0xCE: + return "Samsung"; + case 0x4F: + return "I3 Design System"; + case 0xD0: + return "Klic"; + case 0x51: + return "Crosspoint Solutions"; + case 0x52: + return "Alliance Semiconductor"; + case 0xD3: + return "Tandem"; + case 0x54: + return "Hewlett-Packard"; + case 0xD5: + return "Integrated Silicon Solutions"; + case 0xD6: + return "Brooktree"; + case 0x57: + return "New Media"; + case 0x58: + return "MHS Electronic"; + case 0xD9: + return "Performance Semiconductors"; + case 0xDA: + return "Winbond Electronic"; + case 0x5B: + return "Kawasaki Steel"; + case 0x5D: + return "TECMAR"; + case 0x5E: + return "Exar"; + case 0xDF: + return "PCMCIA"; + case 0xE0: + return "LG Semiconductor"; + case 0x61: + return "Northern Telecom"; + case 0x62: + return "Sanyo2"; + case 0xE3: + return "Array Microsystems"; + case 0x64: + return "Crystal Semiconductor"; + case 0xE5: + return "Analog Devices"; + case 0xE6: + return "PMC-Sierra"; + case 0x67: + return "Asparix"; + case 0x68: + return "Convex Computer"; + case 0xE9: + return "Nimbus Technology"; + case 0x6B: + return "Transwitch"; + case 0xEC: + return "Micronas"; + case 0x6D: + return "Canon"; + case 0x6E: + return "Altera"; + case 0xEF: + return "NEXCOM"; + case 0x70: + return "Qualcomm"; + case 0xF1: + return "Sony"; + case 0xF2: + return "Cray Research"; + case 0x73: + return "AMS"; + case 0xF4: + return "Vitesse"; + case 0x75: + return "Aster Electronics"; + case 0x76: + return "Bay Networks"; + case 0xF7: + return "Zentrum"; + case 0xF8: + return "TRW"; + case 0x79: + return "Thesys"; + case 0x7A: + return "Solbourne Computer"; + case 0xFB: + return "Allied-Signal"; + case 0x7C: + return "Dialog Semiconductor"; + case 0xFD: + return "Media Vision"; + case 0xFE: + return "Numonyx Corporation"; + case 0x7F01: + return "Cirrus Logic"; + case 0x7F02: + return "National Instruments"; + case 0x7F04: + return "Alcatel Mietec"; + case 0x7F07: + return "JTAG Technologies"; + case 0x7F08: + return "Loral"; + case 0x7F0B: + return "Bestlink Systems"; + case 0x7F0D: + return "GENNUM"; + case 0x7F0E: + return "VideoLogic"; + case 0x7F10: + return "Chip Express"; + case 0x7F13: + return "TCSI"; + case 0x7F15: + return "Hughes Aircraft"; + case 0x7F16: + return "Lanstar Semiconductor"; + case 0x7F19: + return "Music Semi"; + case 0x7F1A: + return "Ericsson Components"; + case 0x7F1C: + return "Eon Silicon Devices"; + case 0x7F1F: + return "Integ.Memories Tech."; + case 0x7F20: + return "Corollary Inc."; + case 0x7F23: + return "EIV(Switzerland)"; + case 0x7F25: + return "Zarlink(formerly Mitel)"; + case 0x7F26: + return "Clearpoint"; + case 0x7F29: + return "Vanguard"; + case 0x7F2A: + return "Hagiwara Sys-Com"; + case 0x7F2C: + return "Celestica"; + case 0x7F2F: + return "Rohm Company Ltd."; + case 0x7F31: + return "Libit Signal Processing"; + case 0x7F32: + return "Enhanced Memories Inc."; + case 0x7F34: + return "Adaptec Inc."; + case 0x7F37: + return "AMIC Technology"; + case 0x7F38: + return "Adobe Systems"; + case 0x7F3B: + return "Newport Digital"; + case 0x7F3D: + return "T Square"; + case 0x7F3E: + return "Seiko Epson"; + case 0x7F40: + return "Viking Components"; + case 0x7F43: + return "Suwa Electronics"; + case 0x7F45: + return "Micron CMS"; + case 0x7F46: + return "American Computer &Digital Components Inc"; + case 0x7F49: + return "CPU Design"; + case 0x7F4A: + return "Price Point"; + case 0x7F4C: + return "Tellabs"; + case 0x7F4F: + return "Transcend Information"; + case 0x7F51: + return "CKD Corporation Ltd."; + case 0x7F52: + return "Capital Instruments, Inc."; + case 0x7F54: + return "Linvex Technology"; + case 0x7F57: + return "Dynamem, Inc."; + case 0x7F58: + return "NERA ASA"; + case 0x7F5B: + return "Acorn Computers"; + case 0x7F5D: + return "Oak Technology, Inc."; + case 0x7F5E: + return "Itec Memory"; + case 0x7F61: + return "Wintec Industries"; + case 0x7F62: + return "Super PC Memory"; + case 0x7F64: + return "Galvantech"; + case 0x7F67: + return "GateField"; + case 0x7F68: + return "Integrated Memory System"; + case 0x7F6B: + return "Goldenram"; + case 0x7F6D: + return "Cimaron Communications"; + case 0x7F6E: + return "Nippon Steel Semi.Corp."; + case 0x7F70: + return "AMCC"; + case 0x7F73: + return "Digital Microwave"; + case 0x7F75: + return "MIMOS Semiconductor"; + case 0x7F76: + return "Advanced Fibre"; + case 0x7F79: + return "Acbel Polytech Inc."; + case 0x7F7A: + return "Apacer Technology"; + case 0x7F7C: + return "FOXCONN"; + case 0x7F83: + return "ILC Data Device"; + case 0x7F85: + return "Micro Linear"; + case 0x7F86: + return "Univ.Of NC"; + case 0x7F89: + return "Nchip"; + case 0x7F8A: + return "Galileo Tech"; + case 0x7F8C: + return "Graychip"; + case 0x7F8F: + return "Robert Bosch"; + case 0x7F91: + return "DATARAM"; + case 0x7F92: + return "United Microelec Corp."; + case 0x7F94: + return "Smart Modular"; + case 0x7F97: + return "Qlogic"; + case 0x7F98: + return "Kingston"; + case 0x7F9B: + return "SpaSE"; + case 0x7F9D: + return "Programmable Micro Corp"; + case 0x7F9E: + return "DoD"; + case 0x7FA1: + return "Dallas Semiconductor"; + case 0x7FA2: + return "Omnivision"; + case 0x7FA4: + return "Novatel Wireless"; + case 0x7FA7: + return "Cabletron"; + case 0x7FA8: + return "Silicon Technology"; + case 0x7FAB: + return "Vantis"; + case 0x7FAD: + return "Century"; + case 0x7FAE: + return "Hal Computers"; + case 0x7FB0: + return "Juniper Networks"; + case 0x7FB3: + return "Tundra Semiconductor"; + case 0x7FB5: + return "LightSpeed Semi."; + case 0x7FB6: + return "ZSP Corp."; + case 0x7FB9: + return "Dynachip"; + case 0x7FBA: + return "PNY Electronics"; + case 0x7FBC: + return "MMC Networks"; + case 0x7FBF: + return "Broadcom"; + case 0x7FC1: + return "V3 Semiconductor"; + case 0x7FC2: + return "Flextronics(formerly Orbit)"; + case 0x7FC4: + return "Transmeta"; + case 0x7FC7: + return "Enhance 3000 Inc"; + case 0x7FC8: + return "Tower Semiconductor"; + case 0x7FCB: + return "Maxim Integrated Product"; + case 0x7FCD: + return "Centaur Technology"; + case 0x7FCE: + return "Unigen Corporation"; + case 0x7FD0: + return "Memory Card Technology"; + case 0x7FD3: + return "Aica Kogyo, Ltd."; + case 0x7FD5: + return "MSC Vertriebs GmbH"; + case 0x7FD6: + return "AKM Company, Ltd."; + case 0x7FD9: + return "GSI Technology"; + case 0x7FDA: + return "Dane-Elec (C Memory)"; + case 0x7FDC: + return "Lara Technology"; + case 0x7FDF: + return "Tanisys Technology"; + case 0x7FE0: + return "Truevision"; + case 0x7FE3: + return "MGV Memory"; + case 0x7FE5: + return "Gadzoox Networks"; + case 0x7FE6: + return "Multi Dimensional Cons."; + case 0x7FE9: + return "Triscend"; + case 0x7FEA: + return "XaQti"; + case 0x7FEC: + return "Clear Logic"; + case 0x7FEF: + return "Advantage Memory"; + case 0x7FF1: + return "LeCroy"; + case 0x7FF2: + return "Yamaha Corporation"; + case 0x7FF4: + return "NetLogic Microsystems"; + case 0x7FF7: + return "BF Goodrich Data."; + case 0x7FF8: + return "Epigram"; + case 0x7FFB: + return "Admor Memory"; + case 0x7FFD: + return "Quadratics Superconductor"; + case 0x7FFE: + return "3COM"; + + #endregion JEDEC + + case 0x0100: + return "Digital Equipment Corporation"; + case 0x0101: + return "3Com Corporation"; + case 0x0102: + return "Megahertz Corporation"; + case 0x0104: + return "Socket Communications"; + case 0x0105: + return "TDK Corporation"; + case 0x0108: + return "Standard Microsystems Corporation"; + case 0x0109: + return "Motorola Corporation"; + case 0x010b: + return "National Instruments"; + case 0x0115: + return "US Robotics Corporation"; + case 0x0121: + return "Olicom"; + case 0x0126: + return "Proxim"; + case 0x0128: + return "Megahertz Corporation"; + case 0x012F: + return "Adaptec Corporation"; + case 0x0137: + return "Quatech"; + case 0x0138: + return "Compaq"; + case 0x0140: + return "Ositech"; + case 0x0143: + return "D-Link"; + case 0x0149: + return "Netgear"; + case 0x014D: + return "Simple Technology"; + case 0x0156: + return "Lucent Technologies"; + case 0x015F: + return "Aironet Wireless Communications"; + case 0x016B: + return "Ericsson"; + case 0x016C: + return "Psion"; + case 0x0183: + return "Compaq"; + case 0x0186: + return "Kingston"; + case 0x0192: + return "Sierra Wireless"; + case 0x0194: + return "Dayna Corporation"; + case 0x01a6: + return "Raytheon"; + case 0x01BF: + return "Belkin"; + case 0x01EB: + return "Bay Networks"; + case 0x0200: + return "Farallon Communications"; + case 0x021B: + return "Telecom Device"; + case 0x023D: + return "Nokia Communications"; + case 0x0250: + return "Samsung"; + case 0x0264: + return "Anycom"; + case 0x0268: + return "Alvarion Ltd."; + case 0x026C: + return "Symbol"; + case 0x026F: + return "BUFFALO"; + case 0x0274: + return "The Linksys Group"; + case 0x0288: + return "NEC Infrontia"; + case 0x028A: + return "I-O DATA"; + case 0x02AA: + return "Asustek Computer"; + case 0x02AC: + return "Siemens"; + case 0x02D2: + return "Microsoft Corporation"; + case 0x02DF: + return "AmbiCom Inc"; + case 0x0a02: + return "BreezeCOM"; + case 0x10CD: + return "NewMedia"; + case 0x1668: + return "ACTIONTEC"; + case 0x3401: + return "Lasat Communications A/S"; + case 0x4E01: + return "Lexar Media"; + case 0x5241: + return "Archos"; + case 0x890F: + return "Dual"; + case 0x8A01: + return "Compex Corporation"; + case 0xC001: + return "Contec"; + case 0xC00B: + return "MACNICA"; + case 0xC00C: + return "Roland"; + case 0xC00F: + return "Corega K.K."; + case 0xC012: + return "Hagiwara SYS-COM"; + case 0xC015: + return "RATOC System Inc."; + case 0xC020: + return "NextCom K.K."; + case 0xC250: + return "EMTAC Technology Corporation"; + case 0xD601: + return "Elsa"; + default: + return string.Format(Localization.Unknown_vendor_id_0, id); + } + } +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/DiscStructureCapabilities.cs b/Aaru.Decoders/SCSI/DiscStructureCapabilities.cs new file mode 100644 index 000000000..85fefd1f6 --- /dev/null +++ b/Aaru.Decoders/SCSI/DiscStructureCapabilities.cs @@ -0,0 +1,86 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : DiscStructureCapabilities.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI DISC STRUCTURE structures. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +[SuppressMessage("ReSharper", "UnusedType.Global")] +public static class DiscStructureCapabilities +{ + public static Capability[] Decode(byte[] response) + { + var len = (ushort)((response[0] << 8) + response[1]); + + if(len + 2 != response.Length) + return null; + + List caps = new(); + + uint offset = 4; + + while(offset < response.Length) + { + var cap = new Capability + { + FormatCode = response[offset], + SDS = (response[offset + 1] & 0x80) == 0x80, + RDS = (response[offset + 1] & 0x40) == 0x40 + }; + + caps.Add(cap); + offset += 4; + } + + return caps.ToArray(); + } + +#region Nested type: Capability + + public struct Capability + { + /// READ/SEND DISC STRUCTURE format code + public byte FormatCode; + /// Supported in SEND DISC STRUCTURE + public bool SDS; + /// Supported in READ DISC STRUCTURE + public bool RDS; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/EVPD.cs b/Aaru.Decoders/SCSI/EVPD.cs new file mode 100644 index 000000000..d8d6fe368 --- /dev/null +++ b/Aaru.Decoders/SCSI/EVPD.cs @@ -0,0 +1,2452 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : EVPD.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI EVPDs. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using Aaru.CommonTypes.Structs.Devices.ATA; +using Aaru.CommonTypes.Structs.Devices.SCSI; +using Aaru.Helpers; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +[SuppressMessage("ReSharper", "UnassignedField.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +public static class EVPD +{ + /// Decodes VPD page 0x00: Supported VPD pages + /// A byte array containing all supported VPD pages. + /// Page 0x00. + public static byte[] DecodePage00(byte[] page) + { + if(page?[1] != 0) + return null; + + if(page.Length != page[3] + 4) + return null; + + var decoded = new byte[page.Length - 4]; + + Array.Copy(page, 4, decoded, 0, page.Length - 4); + + return decoded; + } + + /// Decides VPD pages 0x01 to 0x7F: ASCII Information + /// An ASCII string with the contents of the page. + /// Page 0x01-0x7F. + public static string DecodeASCIIPage(byte[] page) + { + if(page == null) + return null; + + if(page[1] == 0 || page[1] > 0x7F) + return null; + + if(page.Length != page[3] + 4) + return null; + + var ascii = new byte[page[4]]; + + Array.Copy(page, 5, ascii, 0, page[4]); + + return StringHandlers.CToString(ascii); + } + + /// Decodes VPD page 0x80: Unit Serial Number + /// The unit serial number. + /// Page 0x80. + public static string DecodePage80(byte[] page) + { + if(page?[1] != 0x80) + return null; + + if(page.Length != page[3] + 4) + return null; + + var ascii = new byte[page.Length - 4]; + + Array.Copy(page, 4, ascii, 0, page.Length - 4); + + for(var i = 0; i < ascii.Length - 1; i++) + { + if(ascii[i] < 0x20) + return null; + } + + return StringHandlers.CToString(ascii); + } + + /// Decodes VPD page 0x82: ASCII implemented operating definition + /// ASCII implemented operating definition. + /// Page 0x82. + public static string DecodePage82(byte[] page) + { + if(page?[1] != 0x82) + return null; + + if(page.Length != page[3] + 4) + return null; + + var ascii = new byte[page.Length - 4]; + + Array.Copy(page, 4, ascii, 0, page.Length - 4); + + return StringHandlers.CToString(ascii); + } + +#region EVPD Page 0xB1: Manufacturer-assigned Serial Number page + + public static string DecodePageB1(byte[] page) + { + if(page?[1] != 0xB1) + return null; + + if(page.Length != page[3] + 4) + return null; + + var ascii = new byte[page.Length - 4]; + + Array.Copy(page, 4, ascii, 0, page.Length - 4); + + return StringHandlers.CToString(ascii).Trim(); + } + +#endregion EVPD Page 0xB1: Manufacturer-assigned Serial Number page + +#region EVPD Page 0xB2: TapeAlert Supported Flags page + + public static ulong DecodePageB2(byte[] page) + { + if(page?[1] != 0xB2) + return 0; + + if(page.Length != 12) + return 0; + + var bitmap = new byte[8]; + + Array.Copy(page, 4, bitmap, 0, 8); + + return BitConverter.ToUInt64(bitmap.Reverse().ToArray(), 0); + } + +#endregion EVPD Page 0xB2: TapeAlert Supported Flags page + +#region EVPD Page 0xB3: Automation Device Serial Number page + + public static string DecodePageB3(byte[] page) + { + if(page?[1] != 0xB3) + return null; + + if(page.Length != page[3] + 4) + return null; + + var ascii = new byte[page.Length - 4]; + + Array.Copy(page, 4, ascii, 0, page.Length - 4); + + return StringHandlers.CToString(ascii).Trim(); + } + +#endregion EVPD Page 0xB3: Automation Device Serial Number page + +#region EVPD Page 0xB4: Data Transfer Device Element Address page + + public static string DecodePageB4(byte[] page) + { + if(page?[1] != 0xB3) + return null; + + if(page.Length != page[3] + 4) + return null; + + var element = new byte[page.Length - 4]; + var sb = new StringBuilder(); + + foreach(byte b in element) + sb.Append($"{b:X2}"); + + return sb.ToString(); + } + +#endregion EVPD Page 0xB4: Data Transfer Device Element Address page + +#region EVPD Page 0x81: Implemented operating definition page + + /// Implemented operating definition page Page code 0x81 + public struct Page_81 + { + /// The peripheral qualifier. + public PeripheralQualifiers PeripheralQualifier; + /// The type of the peripheral device. + public PeripheralDeviceTypes PeripheralDeviceType; + /// The page code. + public byte PageCode; + /// The length of the page. + public byte PageLength; + /// Current operating definition + public ScsiDefinitions Current; + /// Default operating definition + public ScsiDefinitions Default; + /// Support operating definition list + public ScsiDefinitions[] Supported; + } + + public static Page_81? DecodePage_81(byte[] pageResponse) + { + if(pageResponse?[1] != 0x81) + return null; + + if(pageResponse[3] + 4 != pageResponse.Length) + return null; + + if(pageResponse.Length < 6) + return null; + + var decoded = new Page_81 + { + PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), + PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F), + PageLength = (byte)(pageResponse[3] + 4), + Current = (ScsiDefinitions)(pageResponse[4] & 0x7F), + Default = (ScsiDefinitions)(pageResponse[5] & 0x7F) + }; + + var position = 6; + List definitions = new(); + + while(position < pageResponse.Length) + { + var definition = (ScsiDefinitions)(pageResponse[position] & 0x7F); + position++; + definitions.Add(definition); + } + + decoded.Supported = definitions.ToArray(); + + return decoded; + } + + public static string PrettifyPage_81(byte[] pageResponse) => PrettifyPage_81(DecodePage_81(pageResponse)); + + public static string DefinitionToString(ScsiDefinitions definition) => definition switch + { + ScsiDefinitions.Current => "", + ScsiDefinitions.CCS => "CCS", + ScsiDefinitions.SCSI1 => "SCSI-1", + ScsiDefinitions.SCSI2 => "SCSI-2", + ScsiDefinitions.SCSI3 => "SCSI-3", + _ => + $"Unknown definition code {(byte)definition}" + }; + + public static string PrettifyPage_81(Page_81? modePage) + { + if(!modePage.HasValue) + return null; + + Page_81 page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_Implemented_operating_definitions); + + sb.AppendFormat("\t" + Localization.Default_operating_definition_0, DefinitionToString(page.Current)). + AppendLine(); + + sb.AppendFormat("\t" + Localization.Current_operating_definition_0, DefinitionToString(page.Current)). + AppendLine(); + + if(page.Supported.Length == 0) + { + sb.AppendLine("\t" + Localization.There_are_no_supported_definitions); + + return sb.ToString(); + } + + sb.AppendLine("\t" + Localization.Supported_operating_definitions); + + foreach(ScsiDefinitions definition in page.Supported) + sb.AppendFormat("\t" + "\t{0}", DefinitionToString(definition)).AppendLine(); + + return sb.ToString(); + } + +#endregion EVPD Page 0x81: Implemented operating definition page + +#region EVPD Page 0x83: Device identification page + + public enum IdentificationAssociation : byte + { + /// Identifier field is associated with the addressed logical unit + LogicalUnit = 0, + /// Identifier field is associated with the target port + TargetPort = 1, + /// Identifier field is associated with the target device that contains the LUN + TargetDevice = 2 + } + + public enum IdentificationCodeSet : byte + { + /// Identifier is binary + Binary = 1, + /// Identifier is pure ASCII + ASCII = 2, + /// Identifier is in UTF-8 + UTF8 = 3 + } + + public enum IdentificationTypes : byte + { + /// No assignment authority was used and there is no guarantee the identifier is unique + NoAuthority = 0, + /// Concatenates vendor and product identifier from INQUIRY plus unit serial number from page 80h + Inquiry = 1, + /// Identifier is a 64-bit IEEE EUI-64, or extended + EUI = 2, + /// Identifier is compatible with 64-bit FC-PH Name_Identifier + NAA = 3, + /// Identifier to relative port in device + Relative = 4, + /// Identifier to group of target ports in device + TargetPortGroup = 5, + /// Identifier to group of target LUNs in device + LogicalUnitGroup = 6, + /// MD5 of device identification values + MD5 = 7, + /// SCSI name string + SCSI = 8, + /// Protocol specific port identifier + ProtocolSpecific = 9 + } + + public struct IdentificatonDescriptor + { + /// Protocol identifier + public ProtocolIdentifiers ProtocolIdentifier; + /// Defines how the identifier is stored + public IdentificationCodeSet CodeSet; + /// Set if protocol identifier is valid + public bool PIV; + /// Identifies which decide the identifier associates with + public IdentificationAssociation Association; + /// Defines the type of the identifier + public IdentificationTypes Type; + /// Length of the identifier + public byte Length; + /// Identifier as a string if applicable + public string ASCII; + /// Binary identifier + public byte[] Binary; + } + + /// Device identification page Page code 0x83 + public struct Page_83 + { + /// The peripheral qualifier. + public PeripheralQualifiers PeripheralQualifier; + /// The type of the peripheral device. + public PeripheralDeviceTypes PeripheralDeviceType; + /// The page code. + public byte PageCode; + /// The length of the page. + public byte PageLength; + /// The descriptors. + public IdentificatonDescriptor[] Descriptors; + } + + public static Page_83? DecodePage_83(byte[] pageResponse) + { + if(pageResponse?[1] != 0x83) + return null; + + if(pageResponse[3] + 4 != pageResponse.Length) + return null; + + if(pageResponse.Length < 6) + return null; + + var decoded = new Page_83 + { + PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), + PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F), + PageLength = (byte)(pageResponse[3] + 4) + }; + + var position = 4; + List descriptors = new(); + + while(position < pageResponse.Length) + { + var descriptor = new IdentificatonDescriptor + { + ProtocolIdentifier = (ProtocolIdentifiers)((pageResponse[position] & 0xF0) >> 4), + CodeSet = (IdentificationCodeSet)(pageResponse[position] & 0x0F), + PIV = (pageResponse[position + 1] & 0x80) == 0x80, + Association = (IdentificationAssociation)((pageResponse[position + 1] & 0x30) >> 4), + Type = (IdentificationTypes)(pageResponse[position + 1] & 0x0F), + Length = pageResponse[position + 3] + }; + + descriptor.Binary = new byte[descriptor.Length]; + + if(descriptor.Length + position + 4 >= pageResponse.Length) + descriptor.Length = (byte)(pageResponse.Length - position - 4); + + Array.Copy(pageResponse, position + 4, descriptor.Binary, 0, descriptor.Length); + + descriptor.ASCII = descriptor.CodeSet switch + { + IdentificationCodeSet.ASCII => StringHandlers.CToString(descriptor.Binary), + IdentificationCodeSet.UTF8 => Encoding.UTF8.GetString(descriptor.Binary), + _ => "" + }; + + position += 4 + descriptor.Length; + descriptors.Add(descriptor); + } + + decoded.Descriptors = descriptors.ToArray(); + + return decoded; + } + + public static string PrettifyPage_83(byte[] pageResponse) => PrettifyPage_83(DecodePage_83(pageResponse)); + + public static string PrettifyPage_83(Page_83? modePage) + { + if(!modePage.HasValue) + return null; + + Page_83 page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_Device_identification); + + if(page.Descriptors.Length == 0) + { + sb.AppendLine("\t" + Localization.There_are_no_identifiers); + + return sb.ToString(); + } + + foreach(IdentificatonDescriptor descriptor in page.Descriptors) + { + switch(descriptor.Association) + { + case IdentificationAssociation.LogicalUnit: + sb.AppendLine("\t" + Localization.Identifier_belongs_to_addressed_logical_unit); + + break; + case IdentificationAssociation.TargetPort: + sb.AppendLine("\t" + Localization.Identifier_belongs_to_target_port); + + break; + case IdentificationAssociation.TargetDevice: + sb.AppendLine("\t" + + Localization. + Identifier_belongs_to_target_device_that_contains_the_addressed_logical_unit); + + break; + default: + sb.AppendFormat("\t" + Localization.Identifier_has_unknown_association_with_code_0, + (byte)descriptor.Association). + AppendLine(); + + break; + } + + if(descriptor.PIV) + { + string protocol = descriptor.ProtocolIdentifier switch + { + ProtocolIdentifiers.ADT => Localization.Automation_Drive_Interface_Transport, + ProtocolIdentifiers.ATA => Localization.AT_Attachment_Interface__ATA_ATAPI_, + ProtocolIdentifiers.FibreChannel => Localization.Fibre_Channel, + ProtocolIdentifiers.Firewire => Localization.IEEE_1394, + ProtocolIdentifiers.iSCSI => Localization.Internet_SCSI, + ProtocolIdentifiers.NoProtocol => Localization.no_specific_protocol, + ProtocolIdentifiers.PCIe => Localization.PCI_Express, + ProtocolIdentifiers.RDMAP => Localization.SCSI_Remote_Direct_Memory_Access, + ProtocolIdentifiers.SAS => Localization.Serial_Attachment_SCSI, + ProtocolIdentifiers.SCSI => Localization.Parallel_SCSI, + ProtocolIdentifiers.SCSIe => Localization.SCSI_over_PCI_Express, + ProtocolIdentifiers.SSA => Localization.SSA, + ProtocolIdentifiers.UAS => Localization.USB_Attached_SCSI, + _ => string.Format(Localization.unknown_code_protocol_0, + (byte)descriptor.ProtocolIdentifier) + }; + + sb.AppendFormat("\t" + Localization.Descriptor_refers_to_0_protocol, protocol).AppendLine(); + } + + switch(descriptor.Type) + { + case IdentificationTypes.NoAuthority: + switch(descriptor.CodeSet) + { + case IdentificationCodeSet.ASCII: + case IdentificationCodeSet.UTF8: + sb.AppendFormat("\t" + Localization.Vendor_descriptor_contains_0, descriptor.ASCII). + AppendLine(); + + break; + case IdentificationCodeSet.Binary: + sb.AppendFormat("\t" + Localization.Vendor_descriptor_contains_binary_data_hex_0, + PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)). + AppendLine(); + + break; + default: + sb.AppendFormat("\t" + Localization.Vendor_descriptor_contains_unknown_kind_1_of_data_hex_0, + PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40), + (byte)descriptor.CodeSet). + AppendLine(); + + break; + } + + break; + case IdentificationTypes.Inquiry: + switch(descriptor.CodeSet) + { + case IdentificationCodeSet.ASCII: + case IdentificationCodeSet.UTF8: + sb.AppendFormat("\t" + Localization.Inquiry_descriptor_contains_0, descriptor.ASCII). + AppendLine(); + + break; + case IdentificationCodeSet.Binary: + sb.AppendFormat("\t" + Localization.Inquiry_descriptor_contains_binary_data_hex_0, + PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)). + AppendLine(); + + break; + default: + sb. + AppendFormat("\t" + Localization.Inquiry_descriptor_contains_unknown_kind_1_of_data_hex_0, + PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40), + (byte)descriptor.CodeSet). + AppendLine(); + + break; + } + + break; + case IdentificationTypes.EUI: + if(descriptor.CodeSet is IdentificationCodeSet.ASCII or IdentificationCodeSet.UTF8) + sb.AppendFormat("\t" + Localization.IEEE_EUI_64_0, descriptor.ASCII).AppendLine(); + else + { + sb.AppendFormat("\t" + Localization.IEEE_EUI_64_0_X2, descriptor.Binary[0]); + + for(var i = 1; i < descriptor.Binary.Length; i++) + sb.Append($":{descriptor.Binary[i]:X2}"); + + sb.AppendLine(); + } + + break; + case IdentificationTypes.NAA: + if(descriptor.CodeSet is IdentificationCodeSet.ASCII or IdentificationCodeSet.UTF8) + sb.AppendFormat("\t" + Localization.NAA_0, descriptor.ASCII).AppendLine(); + else + { + sb.AppendFormat("\t" + Localization.NAA_0_X2, descriptor.Binary[0]); + + for(var i = 1; i < descriptor.Binary.Length; i++) + sb.Append($":{descriptor.Binary[i]:X2}"); + + sb.AppendLine(); + } + + break; + case IdentificationTypes.Relative: + if(descriptor.CodeSet is IdentificationCodeSet.ASCII or IdentificationCodeSet.UTF8) + { + sb.AppendFormat("\t" + Localization.Relative_target_port_identifier_0, descriptor.ASCII). + AppendLine(); + } + else + { + sb.AppendFormat("\t" + Localization.Relative_target_port_identifier_0, + (descriptor.Binary[2] << 8) + descriptor.Binary[3]). + AppendLine(); + } + + break; + case IdentificationTypes.TargetPortGroup: + if(descriptor.CodeSet is IdentificationCodeSet.ASCII or IdentificationCodeSet.UTF8) + sb.AppendFormat("\t" + Localization.Target_group_identifier_0, descriptor.ASCII).AppendLine(); + else + { + sb.AppendFormat("\t" + Localization.Target_group_identifier_0, + (descriptor.Binary[2] << 8) + descriptor.Binary[3]). + AppendLine(); + } + + break; + case IdentificationTypes.LogicalUnitGroup: + if(descriptor.CodeSet is IdentificationCodeSet.ASCII or IdentificationCodeSet.UTF8) + { + sb.AppendFormat("\t" + Localization.Logical_unit_group_identifier_0, descriptor.ASCII). + AppendLine(); + } + else + { + sb.AppendFormat("\t" + Localization.Logical_unit_group_identifier_0, + (descriptor.Binary[2] << 8) + descriptor.Binary[3]). + AppendLine(); + } + + break; + case IdentificationTypes.MD5: + if(descriptor.CodeSet is IdentificationCodeSet.ASCII or IdentificationCodeSet.UTF8) + { + sb.AppendFormat("\t" + Localization.MD5_logical_unit_identifier_0, descriptor.ASCII). + AppendLine(); + } + else + { + sb.AppendFormat("\t" + Localization.MD5_logical_unit_identifier_0_x2, descriptor.Binary[0]); + + for(var i = 1; i < descriptor.Binary.Length; i++) + sb.Append($"{descriptor.Binary[i]:x2}"); + + sb.AppendLine(); + } + + break; + case IdentificationTypes.SCSI: + if(descriptor.CodeSet is IdentificationCodeSet.ASCII or IdentificationCodeSet.UTF8) + { + sb.AppendFormat("\t" + Localization.SCSI_name_string_identifier_0, descriptor.ASCII). + AppendLine(); + } + else + { + sb.AppendFormat("\t" + Localization.SCSI_name_string_identifier_hex_0, + PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)). + AppendLine(); + } + + break; + case IdentificationTypes.ProtocolSpecific: + { + if(descriptor.PIV) + { + switch(descriptor.ProtocolIdentifier) + { + case ProtocolIdentifiers.ADT: + sb. + AppendFormat("\t" + Localization.Protocol_Automation_Drive_Interface_Transport_specific_descriptor_with_unknown_format_hex_0, + PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)). + AppendLine(); + + break; + case ProtocolIdentifiers.ATA: + sb. + AppendFormat("\t" + Localization.Protocol_ATA_ATAPI_specific_descriptor_with_unknown_format_hex_0, + PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)). + AppendLine(); + + break; + case ProtocolIdentifiers.FibreChannel: + sb. + AppendFormat("\t" + Localization.Protocol_Fibre_Channel_specific_descriptor_with_unknown_format_hex_0, + PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)). + AppendLine(); + + break; + case ProtocolIdentifiers.Firewire: + sb. + AppendFormat("\t" + Localization.Protocol_IEEE_1394_specific_descriptor_with_unknown_format_hex_0, + PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)). + AppendLine(); + + break; + case ProtocolIdentifiers.iSCSI: + sb. + AppendFormat("\t" + Localization.Protocol_Internet_SCSI_specific_descriptor_with_unknown_format_hex_0, + PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)). + AppendLine(); + + break; + case ProtocolIdentifiers.NoProtocol: + sb. + AppendFormat("\t" + Localization.Protocol_unknown_specific_descriptor_with_unknown_format_hex_0, + PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)). + AppendLine(); + + break; + case ProtocolIdentifiers.PCIe: + sb. + AppendFormat("\t" + Localization.Protocol_PCI_Express_specific_descriptor_with_unknown_format_hex_0, + PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)). + AppendLine(); + + break; + case ProtocolIdentifiers.RDMAP: + sb. + AppendFormat("\t" + Localization.Protocol_SCSI_Remote_Direct_Memory_Access_specific_descriptor_with_unknown_format_hex_0, + PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)). + AppendLine(); + + break; + case ProtocolIdentifiers.SAS: + sb. + AppendFormat("\t" + Localization.Protocol_Serial_Attachment_SCSI_specific_descriptor_with_unknown_format_hex_0, + PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)). + AppendLine(); + + break; + case ProtocolIdentifiers.SCSI: + sb. + AppendFormat("\t" + Localization.Protocol_Parallel_SCSI_specific_descriptor_with_unknown_format_hex_0, + PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)). + AppendLine(); + + break; + case ProtocolIdentifiers.SSA: + sb. + AppendFormat("\t" + Localization.Protocol_SSA_specific_descriptor_with_unknown_format_hex_0, + PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)). + AppendLine(); + + break; + case ProtocolIdentifiers.SCSIe: + sb.AppendFormat("\t" + Localization.Protocol_SCSIe_specific_descriptor_Routing_ID_is_0, + (descriptor.Binary[0] << 8) + descriptor.Binary[1]). + AppendLine(); + + break; + case ProtocolIdentifiers.UAS: + sb. + AppendFormat("\t" + Localization.Protocol_UAS_specific_descriptor_USB_address_0_interface_1, + descriptor.Binary[0] & 0x7F, descriptor.Binary[2]). + AppendLine(); + + break; + default: + sb. + AppendFormat("\t" + Localization.Protocol_unknown_code_0_specific_descriptor_with_unknown_format_hex_1, + (byte)descriptor.ProtocolIdentifier, + PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40)). + AppendLine(); + + break; + } + } + } + + break; + default: + switch(descriptor.CodeSet) + { + case IdentificationCodeSet.ASCII: + case IdentificationCodeSet.UTF8: + sb.AppendFormat("\t" + Localization.Unknown_descriptor_type_1_contains_0, descriptor.ASCII, + (byte)descriptor.Type). + AppendLine(); + + break; + case IdentificationCodeSet.Binary: + sb.AppendFormat("\t" + Localization.Unknown_descriptor_type_1_contains_binary_data_hex_0, + PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40), + (byte)descriptor.Type). + AppendLine(); + + break; + default: + sb. + AppendFormat(Localization.Inquiry_descriptor_type_2_contains_unknown_kind_1_of_data_hex_0, + PrintHex.ByteArrayToHexArrayString(descriptor.Binary, 40), + (byte)descriptor.CodeSet, (byte)descriptor.Type). + AppendLine(); + + break; + } + + break; + } + } + + return sb.ToString(); + } + +#endregion EVPD Page 0x83: Device identification page + +#region EVPD Page 0x84: Software Interface Identification page + + public struct SoftwareIdentifier + { + /// EUI-48 identifier + public byte[] Identifier; + } + + /// Software Interface Identification page Page code 0x84 + public struct Page_84 + { + /// The peripheral qualifier. + public PeripheralQualifiers PeripheralQualifier; + /// The type of the peripheral device. + public PeripheralDeviceTypes PeripheralDeviceType; + /// The page code. + public byte PageCode; + /// The length of the page. + public byte PageLength; + /// The descriptors. + public SoftwareIdentifier[] Identifiers; + } + + public static Page_84? DecodePage_84(byte[] pageResponse) + { + if(pageResponse?[1] != 0x84) + return null; + + if(pageResponse[3] + 4 != pageResponse.Length) + return null; + + if(pageResponse.Length < 10) + return null; + + var decoded = new Page_84 + { + PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), + PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F), + PageLength = (byte)(pageResponse[3] + 4) + }; + + var position = 4; + List identifiers = new(); + + while(position < pageResponse.Length) + { + var identifier = new SoftwareIdentifier + { + Identifier = new byte[6] + }; + + Array.Copy(pageResponse, position, identifier.Identifier, 0, 6); + identifiers.Add(identifier); + position += 6; + } + + decoded.Identifiers = identifiers.ToArray(); + + return decoded; + } + + public static string PrettifyPage_84(byte[] pageResponse) => PrettifyPage_84(DecodePage_84(pageResponse)); + + public static string PrettifyPage_84(Page_84? modePage) + { + if(!modePage.HasValue) + return null; + + Page_84 page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_Software_Interface_Identifiers); + + if(page.Identifiers.Length == 0) + { + sb.AppendLine("\t" + Localization.There_are_no_identifiers); + + return sb.ToString(); + } + + foreach(SoftwareIdentifier identifier in page.Identifiers) + { + sb.AppendFormat("\t" + "{0:X2}", identifier.Identifier[0]); + + for(var i = 1; i < identifier.Identifier.Length; i++) + sb.Append($":{identifier.Identifier[i]:X2}"); + + sb.AppendLine(); + } + + return sb.ToString(); + } + +#endregion EVPD Page 0x84: Software Interface Identification page + +#region EVPD Page 0x85: Management Network Addresses page + + public enum NetworkServiceTypes : byte + { + Unspecified = 0, + StorageConf = 1, + Diagnostics = 2, + Status = 3, + Logging = 4, + CodeDownload = 5, + CopyService = 6, + Administrative = 7 + } + + public struct NetworkDescriptor + { + /// Identifies which device the identifier associates with + public IdentificationAssociation Association; + /// Defines the type of the identifier + public NetworkServiceTypes Type; + /// Length of the identifier + public ushort Length; + /// Binary identifier + public byte[] Address; + } + + /// Device identification page Page code 0x85 + public struct Page_85 + { + /// The peripheral qualifier. + public PeripheralQualifiers PeripheralQualifier; + /// The type of the peripheral device. + public PeripheralDeviceTypes PeripheralDeviceType; + /// The page code. + public byte PageCode; + /// The length of the page. + public ushort PageLength; + /// The descriptors. + public NetworkDescriptor[] Descriptors; + } + + public static Page_85? DecodePage_85(byte[] pageResponse) + { + if(pageResponse?[1] != 0x85) + return null; + + if((pageResponse[2] << 8) + pageResponse[3] + 4 != pageResponse.Length) + return null; + + if(pageResponse.Length < 4) + return null; + + var decoded = new Page_85 + { + PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), + PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F), + PageLength = (ushort)((pageResponse[2] << 8) + pageResponse[3] + 4) + }; + + var position = 4; + List descriptors = new(); + + while(position < pageResponse.Length) + { + var descriptor = new NetworkDescriptor + { + Association = (IdentificationAssociation)((pageResponse[position] & 0x60) >> 5), + Type = (NetworkServiceTypes)(pageResponse[position] & 0x1F), + Length = (ushort)((pageResponse[position + 2] << 8) + pageResponse[position + 3]) + }; + + descriptor.Address = new byte[descriptor.Length]; + Array.Copy(pageResponse, position + 4, descriptor.Address, 0, descriptor.Length); + + position += 4 + descriptor.Length; + descriptors.Add(descriptor); + } + + decoded.Descriptors = descriptors.ToArray(); + + return decoded; + } + + public static string PrettifyPage_85(byte[] pageResponse) => PrettifyPage_85(DecodePage_85(pageResponse)); + + public static string PrettifyPage_85(Page_85? modePage) + { + if(!modePage.HasValue) + return null; + + Page_85 page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_Management_Network_Addresses); + + if(page.Descriptors.Length == 0) + { + sb.AppendLine("\t" + Localization.There_are_no_addresses); + + return sb.ToString(); + } + + foreach(NetworkDescriptor descriptor in page.Descriptors) + { + switch(descriptor.Association) + { + case IdentificationAssociation.LogicalUnit: + sb.AppendLine("\t" + Localization.Identifier_belongs_to_addressed_logical_unit); + + break; + case IdentificationAssociation.TargetPort: + sb.AppendLine("\t" + Localization.Identifier_belongs_to_target_port); + + break; + case IdentificationAssociation.TargetDevice: + sb.AppendLine("\t" + + Localization. + Identifier_belongs_to_target_device_that_contains_the_addressed_logical_unit); + + break; + default: + sb.AppendFormat("\t" + Localization.Identifier_has_unknown_association_with_code_0, + (byte)descriptor.Association). + AppendLine(); + + break; + } + + switch(descriptor.Type) + { + case NetworkServiceTypes.CodeDownload: + sb.AppendFormat(Localization.Address_for_code_download_0, + StringHandlers.CToString(descriptor.Address)). + AppendLine(); + + break; + case NetworkServiceTypes.Diagnostics: + sb.AppendFormat(Localization.Address_for_diagnostics_0, + StringHandlers.CToString(descriptor.Address)). + AppendLine(); + + break; + case NetworkServiceTypes.Logging: + sb.AppendFormat(Localization.Address_for_logging_0, StringHandlers.CToString(descriptor.Address)). + AppendLine(); + + break; + case NetworkServiceTypes.Status: + sb.AppendFormat(Localization.Address_for_status_0, StringHandlers.CToString(descriptor.Address)). + AppendLine(); + + break; + case NetworkServiceTypes.StorageConf: + sb.AppendFormat(Localization.Address_for_storage_configuration_service_0, + StringHandlers.CToString(descriptor.Address)). + AppendLine(); + + break; + case NetworkServiceTypes.Unspecified: + sb.AppendFormat(Localization.Unspecified_address_0, StringHandlers.CToString(descriptor.Address)). + AppendLine(); + + break; + case NetworkServiceTypes.CopyService: + sb.AppendFormat(Localization.Address_for_copy_service_0, + StringHandlers.CToString(descriptor.Address)). + AppendLine(); + + break; + case NetworkServiceTypes.Administrative: + sb.AppendFormat(Localization.Address_for_administrative_configuration_service_0, + StringHandlers.CToString(descriptor.Address)). + AppendLine(); + + break; + default: + sb.AppendFormat(Localization.Address_of_unknown_type_1_0, + StringHandlers.CToString(descriptor.Address), (byte)descriptor.Type). + AppendLine(); + + break; + } + } + + return sb.ToString(); + } + +#endregion EVPD Page 0x85: Management Network Addresses page + +#region EVPD Page 0x86: Extended INQUIRY data page + + /// Device identification page Page code 0x86 + public struct Page_86 + { + /// The peripheral qualifier. + public PeripheralQualifiers PeripheralQualifier; + /// The type of the peripheral device. + public PeripheralDeviceTypes PeripheralDeviceType; + /// The page code. + public byte PageCode; + /// The length of the page. + public byte PageLength; + /// Indicates how a device server activates microcode + public byte ActivateMicrocode; + /// Protection types supported by device + public byte SPT; + /// Checks logical block guard field + public bool GRD_CHK; + /// Checks logical block application tag + public bool APP_CHK; + /// Checks logical block reference + public bool REF_CHK; + /// Supports unit attention condition sense key specific data + public bool UASK_SUP; + /// Supports grouping + public bool GROUP_SUP; + /// Supports priority + public bool PRIOR_SUP; + /// Supports head of queue + public bool HEADSUP; + /// Supports ordered + public bool ORDSUP; + /// Supports simple + public bool SIMPSUP; + /// Supports marking a block as uncorrectable + public bool WU_SUP; + /// Supports disabling correction on WRITE LONG + public bool CRD_SUP; + /// Supports a non-volatile cache + public bool NV_SUP; + /// Supports a volatile cache + public bool V_SUP; + /// Disable protection information checks + public bool NO_PI_CHK; + /// Protection information interval supported + public bool P_I_I_SUP; + /// Clears all LUNs unit attention when clearing one + public bool LUICLR; + /// Referrals support + public bool R_SUP; + /// History snapshots release effects + public bool HSSRELEF; + /// Capability based command security + public bool CBCS; + /// Indicates how it handles microcode updating with multiple nexuxes + public byte Nexus; + /// Time to complete extended self-test + public ushort ExtendedTestMinutes; + /// Power on activation support + public bool POA_SUP; + /// Hard reset actication + public bool HRA_SUP; + /// Vendor specific activation + public bool VSA_SUP; + /// Maximum length in bytes of sense data + public byte MaximumSenseLength; + } + + public static Page_86? DecodePage_86(byte[] pageResponse) + { + if(pageResponse?[1] != 0x86) + return null; + + if(pageResponse[3] + 4 != pageResponse.Length) + return null; + + if(pageResponse.Length < 64) + return null; + + return new Page_86 + { + PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), + PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F), + PageLength = (byte)(pageResponse[3] + 4), + ActivateMicrocode = (byte)((pageResponse[4] & 0xC0) >> 6), + SPT = (byte)((pageResponse[4] & 0x38) >> 3), + GRD_CHK = (pageResponse[4] & 0x04) == 0x04, + APP_CHK = (pageResponse[4] & 0x02) == 0x02, + REF_CHK = (pageResponse[4] & 0x01) == 0x01, + UASK_SUP = (pageResponse[5] & 0x20) == 0x20, + GROUP_SUP = (pageResponse[5] & 0x10) == 0x10, + PRIOR_SUP = (pageResponse[5] & 0x08) == 0x08, + HEADSUP = (pageResponse[5] & 0x04) == 0x04, + ORDSUP = (pageResponse[5] & 0x02) == 0x02, + SIMPSUP = (pageResponse[5] & 0x01) == 0x01, + WU_SUP = (pageResponse[6] & 0x08) == 0x08, + CRD_SUP = (pageResponse[6] & 0x04) == 0x04, + NV_SUP = (pageResponse[6] & 0x02) == 0x02, + V_SUP = (pageResponse[6] & 0x01) == 0x01, + NO_PI_CHK = (pageResponse[7] & 0x20) == 0x20, + P_I_I_SUP = (pageResponse[7] & 0x10) == 0x10, + LUICLR = (pageResponse[7] & 0x01) == 0x01, + R_SUP = (pageResponse[8] & 0x10) == 0x10, + HSSRELEF = (pageResponse[8] & 0x02) == 0x02, + CBCS = (pageResponse[8] & 0x01) == 0x01, + Nexus = (byte)(pageResponse[9] & 0x0F), + ExtendedTestMinutes = (ushort)((pageResponse[10] << 8) + pageResponse[11]), + POA_SUP = (pageResponse[12] & 0x80) == 0x80, + HRA_SUP = (pageResponse[12] & 0x40) == 0x40, + VSA_SUP = (pageResponse[12] & 0x20) == 0x20, + MaximumSenseLength = pageResponse[13] + }; + } + + public static string PrettifyPage_86(byte[] pageResponse) => PrettifyPage_86(DecodePage_86(pageResponse)); + + public static string PrettifyPage_86(Page_86? modePage) + { + if(!modePage.HasValue) + return null; + + Page_86 page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_Extended_INQUIRY_Data); + + switch(page.PeripheralDeviceType) + { + case PeripheralDeviceTypes.DirectAccess: + case PeripheralDeviceTypes.SCSIZonedBlockDevice: + switch(page.SPT) + { + case 0: + sb.AppendLine(Localization.Logical_unit_supports_type_1_protection); + + break; + case 1: + sb.AppendLine(Localization.Logical_unit_supports_types_1_and_2_protection); + + break; + case 2: + sb.AppendLine(Localization.Logical_unit_supports_type_2_protection); + + break; + case 3: + sb.AppendLine(Localization.Logical_unit_supports_types_1_and_3_protection); + + break; + case 4: + sb.AppendLine(Localization.Logical_unit_supports_type_3_protection); + + break; + case 5: + sb.AppendLine(Localization.Logical_unit_supports_types_2_and_3_protection); + + break; + case 7: + sb.AppendLine(Localization.Logical_unit_supports_types_1_2_and_3_protection); + + break; + default: + sb.AppendFormat(Localization.Logical_unit_supports_unknown_protection_defined_by_code_0, + page.SPT). + AppendLine(); + + break; + } + + break; + case PeripheralDeviceTypes.SequentialAccess when page.SPT == 1: + sb.AppendLine(Localization.Logical_unit_supports_logical_block_protection); + + break; + } + + if(page.GRD_CHK) + sb.AppendLine(Localization.Device_checks_the_logical_block_guard); + + if(page.APP_CHK) + sb.AppendLine(Localization.Device_checks_the_logical_block_application_tag); + + if(page.REF_CHK) + sb.AppendLine(Localization.Device_checks_the_logical_block_reference_tag); + + if(page.UASK_SUP) + sb.AppendLine(Localization.Device_supports_unit_attention_condition_sense_key_specific_data); + + if(page.GROUP_SUP) + sb.AppendLine(Localization.Device_supports_grouping); + + if(page.PRIOR_SUP) + sb.AppendLine(Localization.Device_supports_priority); + + if(page.HEADSUP) + sb.AppendLine(Localization.Device_supports_head_of_queue); + + if(page.ORDSUP) + sb.AppendLine(Localization.Device_supports_the_ORDERED_task_attribute); + + if(page.SIMPSUP) + sb.AppendLine(Localization.Device_supports_the_SIMPLE_task_attribute); + + if(page.WU_SUP) + sb.AppendLine(Localization.Device_supports_marking_a_block_as_uncorrectable_with_WRITE_LONG); + + if(page.CRD_SUP) + sb.AppendLine(Localization.Device_supports_disabling_correction_with_WRITE_LONG); + + if(page.NV_SUP) + sb.AppendLine(Localization.Device_has_a_non_volatile_cache); + + if(page.V_SUP) + sb.AppendLine(Localization.Device_has_a_volatile_cache); + + if(page.NO_PI_CHK) + sb.AppendLine(Localization.Device_has_disabled_protection_information_checks); + + if(page.P_I_I_SUP) + sb.AppendLine(Localization.Device_supports_protection_information_intervals); + + if(page.LUICLR) + { + sb.AppendLine(Localization. + Device_clears_any_unit_attention_condition_in_all_LUNs_after_reporting_for_any_LUN); + } + + if(page.R_SUP) + sb.AppendLine(Localization.Device_supports_referrals); + + if(page.HSSRELEF) + sb.AppendLine(Localization.Device_implements_alternate_reset_handling); + + if(page.CBCS) + sb.AppendLine(Localization.Device_supports_capability_based_command_security); + + if(page.POA_SUP) + sb.AppendLine(Localization.Device_supports_power_on_activation_for_new_microcode); + + if(page.HRA_SUP) + sb.AppendLine(Localization.Device_supports_hard_reset_activation_for_new_microcode); + + if(page.VSA_SUP) + sb.AppendLine(Localization.Device_supports_vendor_specific_activation_for_new_microcode); + + if(page.ExtendedTestMinutes > 0) + { + sb.AppendFormat(Localization.Extended_self_test_takes_0_to_complete, + TimeSpan.FromMinutes(page.ExtendedTestMinutes)). + AppendLine(); + } + + if(page.MaximumSenseLength > 0) + { + sb.AppendFormat(Localization.Device_supports_a_maximum_of_0_bytes_for_sense_data, page.MaximumSenseLength). + AppendLine(); + } + + return sb.ToString(); + } + +#endregion EVPD Page 0x86: Extended INQUIRY data page + +#region EVPD Page 0x89: ATA Information page + + /// ATA Information page Page code 0x89 + public struct Page_89 + { + /// The peripheral qualifier. + public PeripheralQualifiers PeripheralQualifier; + /// The type of the peripheral device. + public PeripheralDeviceTypes PeripheralDeviceType; + /// The page code. + public byte PageCode; + /// The length of the page. + public ushort PageLength; + /// Contains the SAT vendor identification + public byte[] VendorIdentification; + /// Contains the SAT product identification + public byte[] ProductIdentification; + /// Contains the SAT revision level + public byte[] ProductRevisionLevel; + /// Contains the ATA device signature + public byte[] Signature; + /// Contains the command code used to identify the device + public byte CommandCode; + /// Contains the response to ATA IDENTIFY (PACKET) DEVICE + public byte[] IdentifyData; + } + + public static Page_89? DecodePage_89(byte[] pageResponse) + { + if(pageResponse?[1] != 0x89) + return null; + + if((pageResponse[2] << 8) + pageResponse[3] + 4 != pageResponse.Length) + return null; + + if(pageResponse.Length < 572) + return null; + + var decoded = new Page_89 + { + PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), + PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F), + PageLength = (ushort)((pageResponse[2] << 8) + pageResponse[3] + 4), + VendorIdentification = new byte[8], + ProductIdentification = new byte[16], + ProductRevisionLevel = new byte[4], + Signature = new byte[20], + IdentifyData = new byte[512] + }; + + Array.Copy(pageResponse, 8, decoded.VendorIdentification, 0, 8); + Array.Copy(pageResponse, 16, decoded.ProductIdentification, 0, 16); + Array.Copy(pageResponse, 32, decoded.ProductRevisionLevel, 0, 4); + Array.Copy(pageResponse, 36, decoded.Signature, 0, 20); + decoded.CommandCode = pageResponse[56]; + Array.Copy(pageResponse, 60, decoded.IdentifyData, 0, 512); + + return decoded; + } + + public static string PrettifyPage_89(byte[] pageResponse) => PrettifyPage_89(DecodePage_89(pageResponse)); + + // TODO: Decode ATA signature? + public static string PrettifyPage_89(Page_89? modePage) + { + if(!modePage.HasValue) + return null; + + Page_89 page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_to_ATA_Translation_Layer_Data); + + sb.AppendFormat("\t" + Localization.Translation_layer_vendor_0, + VendorString.Prettify(StringHandlers.CToString(page.VendorIdentification).Trim())). + AppendLine(); + + sb.AppendFormat("\t" + Localization.Translation_layer_name_0, + StringHandlers.CToString(page.ProductIdentification).Trim()). + AppendLine(); + + sb.AppendFormat("\t" + Localization.Translation_layer_release_level_0, + StringHandlers.CToString(page.ProductRevisionLevel).Trim()). + AppendLine(); + + switch(page.CommandCode) + { + case 0xEC: + sb.AppendLine("\t" + Localization.Device_responded_to_ATA_IDENTIFY_DEVICE_command); + + break; + case 0xA1: + sb.AppendLine("\t" + Localization.Device_responded_to_ATA_IDENTIFY_PACKET_DEVICE_command); + + break; + default: + sb.AppendFormat("\t" + Localization.Device_responded_to_ATA_command_0, page.CommandCode).AppendLine(); + + break; + } + + switch(page.Signature[0]) + { + case 0x00: + sb.AppendLine("\t" + Localization.Device_uses_Parallel_ATA); + + break; + case 0x34: + sb.AppendLine("\t" + Localization.Device_uses_Serial_ATA); + + break; + default: + sb.AppendFormat("\t" + Localization.Device_uses_unknown_transport_with_code_0, page.Signature[0]). + AppendLine(); + + break; + } + + Identify.IdentifyDevice? id = Identify.Decode(page.IdentifyData); + + if(id != null) + { + sb.AppendLine("\t" + Localization.ATA_IDENTIFY_information_follows); + sb.Append($"{ATA.Identify.Prettify(id)}").AppendLine(); + } + else + sb.AppendLine("\t" + Localization.Could_not_decode_ATA_IDENTIFY_information); + + return sb.ToString(); + } + +#endregion EVPD Page 0x89: ATA Information page + +#region EVPD Page 0xC0 (Quantum): Firmware Build Information page + + /// Firmware Build Information page Page code 0xC0 (Quantum) + public struct Page_C0_Quantum + { + /// The peripheral qualifier. + public PeripheralQualifiers PeripheralQualifier; + /// The type of the peripheral device. + public PeripheralDeviceTypes PeripheralDeviceType; + /// The page code. + public byte PageCode; + /// The length of the page. + public byte PageLength; + /// Servo firmware checksum + public ushort ServoFirmwareChecksum; + /// Servo EEPROM checksum + public ushort ServoEEPROMChecksum; + /// Read/Write firmware checksum + public uint ReadWriteFirmwareChecksum; + /// Read/Write firmware build data + public byte[] ReadWriteFirmwareBuildData; + } + + public static Page_C0_Quantum? DecodePage_C0_Quantum(byte[] pageResponse) + { + if(pageResponse?[1] != 0xC0) + return null; + + if(pageResponse[3] != 20) + return null; + + if(pageResponse.Length != 36) + return null; + + var decoded = new Page_C0_Quantum + { + PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), + PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F), + PageLength = (byte)(pageResponse[3] + 4), + ServoFirmwareChecksum = (ushort)((pageResponse[4] << 8) + pageResponse[5]), + ServoEEPROMChecksum = (ushort)((pageResponse[6] << 8) + pageResponse[7]), + ReadWriteFirmwareChecksum = (uint)((pageResponse[8] << 24) + + (pageResponse[9] << 16) + + (pageResponse[10] << 8) + + pageResponse[11]), + ReadWriteFirmwareBuildData = new byte[24] + }; + + Array.Copy(pageResponse, 12, decoded.ReadWriteFirmwareBuildData, 0, 24); + + return decoded; + } + + public static string PrettifyPage_C0_Quantum(byte[] pageResponse) => + PrettifyPage_C0_Quantum(DecodePage_C0_Quantum(pageResponse)); + + public static string PrettifyPage_C0_Quantum(Page_C0_Quantum? modePage) + { + if(!modePage.HasValue) + return null; + + Page_C0_Quantum page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.Quantum_Quantum_Firmware_Build_Information_page); + + sb.AppendFormat("\t" + Localization.Quantum_Servo_firmware_checksum_0, page.ServoFirmwareChecksum).AppendLine(); + sb.AppendFormat("\t" + Localization.Quantum_EEPROM_firmware_checksum_0, page.ServoEEPROMChecksum).AppendLine(); + + sb.AppendFormat("\t" + Localization.Quantum_Read_write_firmware_checksum_0, page.ReadWriteFirmwareChecksum). + AppendLine(); + + sb.AppendFormat("\t" + Localization.Quantum_Read_write_firmware_build_date_0, + StringHandlers.CToString(page.ReadWriteFirmwareBuildData)). + AppendLine(); + + return sb.ToString(); + } + +#endregion EVPD Page 0xC0 (Quantum): Firmware Build Information page + +#region EVPD Pages 0xC0, 0xC1 (Certance): Drive component revision level pages + + /// Drive component revision level pages Page codes 0xC0, 0xC1 (Certance) + public struct Page_C0_C1_Certance + { + /// The peripheral qualifier. + public PeripheralQualifiers PeripheralQualifier; + /// The type of the peripheral device. + public PeripheralDeviceTypes PeripheralDeviceType; + /// The page code. + public byte PageCode; + /// The length of the page. + public byte PageLength; + public byte[] Component; + public byte[] Version; + public byte[] Date; + public byte[] Variant; + } + + public static Page_C0_C1_Certance? DecodePage_C0_C1_Certance(byte[] pageResponse) + { + if(pageResponse == null) + return null; + + if(pageResponse[1] != 0xC0 && pageResponse[1] != 0xC1) + return null; + + if(pageResponse[3] != 92) + return null; + + if(pageResponse.Length != 96) + return null; + + var decoded = new Page_C0_C1_Certance + { + PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), + PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F), + PageLength = (byte)(pageResponse[3] + 4), + Component = new byte[26], + Version = new byte[19], + Date = new byte[24], + Variant = new byte[23] + }; + + Array.Copy(pageResponse, 4, decoded.Component, 0, 26); + Array.Copy(pageResponse, 30, decoded.Version, 0, 19); + Array.Copy(pageResponse, 49, decoded.Date, 0, 24); + Array.Copy(pageResponse, 73, decoded.Variant, 0, 23); + + return decoded; + } + + public static string PrettifyPage_C0_C1_Certance(byte[] pageResponse) => + PrettifyPage_C0_C1_Certance(DecodePage_C0_C1_Certance(pageResponse)); + + public static string PrettifyPage_C0_C1_Certance(Page_C0_C1_Certance? modePage) + { + if(!modePage.HasValue) + return null; + + Page_C0_C1_Certance page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.Certance_Certance_Drive_Component_Revision_Levels_page); + + sb.AppendFormat("\t" + Localization.Certance_Component_0, StringHandlers.CToString(page.Component)). + AppendLine(); + + sb.AppendFormat("\t" + Localization.Certance_Version_0, StringHandlers.CToString(page.Version)).AppendLine(); + sb.AppendFormat("\t" + Localization.Certance_Date_0, StringHandlers.CToString(page.Date)).AppendLine(); + sb.AppendFormat("\t" + Localization.Certance_Variant_0, StringHandlers.CToString(page.Variant)).AppendLine(); + + return sb.ToString(); + } + +#endregion EVPD Pages 0xC0, 0xC1 (Certance): Drive component revision level pages + +#region EVPD Pages 0xC2, 0xC3, 0xC4, 0xC5, 0xC6 (Certance): Drive component serial number pages + + /// Drive component serial number pages Page codes 0xC2, 0xC3, 0xC4, 0xC5, 0xC6 (Certance) + public struct Page_C2_C3_C4_C5_C6_Certance + { + /// The peripheral qualifier. + public PeripheralQualifiers PeripheralQualifier; + /// The type of the peripheral device. + public PeripheralDeviceTypes PeripheralDeviceType; + /// The page code. + public byte PageCode; + /// The length of the page. + public byte PageLength; + public byte[] SerialNumber; + } + + public static Page_C2_C3_C4_C5_C6_Certance? DecodePage_C2_C3_C4_C5_C6_Certance(byte[] pageResponse) + { + if(pageResponse == null) + return null; + + if(pageResponse[1] != 0xC2 && + pageResponse[1] != 0xC3 && + pageResponse[1] != 0xC4 && + pageResponse[1] != 0xC5 && + pageResponse[1] != 0xC6) + return null; + + if(pageResponse[3] != 12) + return null; + + if(pageResponse.Length != 16) + return null; + + var decoded = new Page_C2_C3_C4_C5_C6_Certance + { + PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), + PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F), + PageLength = (byte)(pageResponse[3] + 4), + SerialNumber = new byte[12] + }; + + Array.Copy(pageResponse, 4, decoded.SerialNumber, 0, 12); + + return decoded; + } + + public static string PrettifyPage_C2_C3_C4_C5_C6_Certance(byte[] pageResponse) => + PrettifyPage_C2_C3_C4_C5_C6_Certance(DecodePage_C2_C3_C4_C5_C6_Certance(pageResponse)); + + public static string PrettifyPage_C2_C3_C4_C5_C6_Certance(Page_C2_C3_C4_C5_C6_Certance? modePage) + { + if(!modePage.HasValue) + return null; + + Page_C2_C3_C4_C5_C6_Certance page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.Certance_Certance_Drive_Component_Serial_Number_page); + + switch(page.PageCode) + { + case 0xC2: + sb.AppendFormat("\t" + Localization.Certance_Head_Assembly_Serial_Number_0, + StringHandlers.CToString(page.SerialNumber)). + AppendLine(); + + break; + case 0xC3: + sb.AppendFormat("\t" + Localization.Certance_Reel_Motor_1_Serial_Number_0, + StringHandlers.CToString(page.SerialNumber)). + AppendLine(); + + break; + case 0xC4: + sb.AppendFormat("\t" + Localization.Certance_Reel_Motor_2_Serial_Number_0, + StringHandlers.CToString(page.SerialNumber)). + AppendLine(); + + break; + case 0xC5: + sb.AppendFormat("\t" + Localization.Certance_Board_Serial_Number_0, + StringHandlers.CToString(page.SerialNumber)). + AppendLine(); + + break; + case 0xC6: + sb.AppendFormat("\t" + Localization.Certance_Base_Mechanical_Serial_Number_0, + StringHandlers.CToString(page.SerialNumber)). + AppendLine(); + + break; + } + + return sb.ToString(); + } + +#endregion EVPD Pages 0xC0, 0xC1 (Certance): Drive component revision level pages + +#region EVPD Page 0xDF (Certance): Drive status pages + + /// Drive status pages Page codes 0xDF (Certance) + public struct Page_DF_Certance + { + /// The peripheral qualifier. + public PeripheralQualifiers PeripheralQualifier; + /// The type of the peripheral device. + public PeripheralDeviceTypes PeripheralDeviceType; + /// The page code. + public byte PageCode; + /// The length of the page. + public byte PageLength; + /// Command forwarding + public byte CmdFwd; + /// Alerts + public bool Alerts; + /// Removable prevention + public bool NoRemov; + /// Unit reservation + public bool UnitRsvd; + /// Needs cleaning + public bool Clean; + /// Tape threaded + public bool Threaded; + /// Commands await forwarding + public bool Lun1Cmd; + /// Autoload mode + public byte AutoloadMode; + /// Cartridge type + public byte CartridgeType; + /// Cartridge format + public byte CartridgeFormat; + /// Cartridge capacity in 10e9 bytes + public ushort CartridgeCapacity; + /// Port A transport type + public byte PortATransportType; + /// Port A SCSI ID + public byte PortASelectionID; + /// Total number of head-tape contact time + public uint OperatingHours; + /// ID that reserved the device + public ulong InitiatorID; + /// Cartridge serial number + public byte[] CartridgeSerialNumber; + } + + public static Page_DF_Certance? DecodePage_DF_Certance(byte[] pageResponse) + { + if(pageResponse?[1] != 0xDF) + return null; + + if(pageResponse[3] != 60) + return null; + + if(pageResponse.Length != 64) + return null; + + var decoded = new Page_DF_Certance + { + PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), + PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F), + PageLength = (byte)(pageResponse[3] + 4), + CmdFwd = (byte)((pageResponse[5] & 0xC0) >> 5), + Alerts = (pageResponse[5] & 0x20) == 0x20, + NoRemov = (pageResponse[5] & 0x08) == 0x08, + UnitRsvd = (pageResponse[5] & 0x04) == 0x04, + Clean = (pageResponse[5] & 0x01) == 0x01, + Threaded = (pageResponse[6] & 0x10) == 0x10, + Lun1Cmd = (pageResponse[6] & 0x08) == 0x08, + AutoloadMode = (byte)(pageResponse[6] & 0x07), + CartridgeType = pageResponse[8], + CartridgeFormat = pageResponse[9], + CartridgeCapacity = (ushort)((pageResponse[10] << 8) + pageResponse[11] + 4), + PortATransportType = pageResponse[12], + PortASelectionID = pageResponse[15], + OperatingHours = (uint)((pageResponse[20] << 24) + + (pageResponse[21] << 16) + + (pageResponse[22] << 8) + + pageResponse[23]), + CartridgeSerialNumber = new byte[32] + }; + + var buf = new byte[8]; + Array.Copy(pageResponse, 24, buf, 0, 8); + decoded.InitiatorID = BitConverter.ToUInt64(buf.Reverse().ToArray(), 0); + Array.Copy(pageResponse, 32, decoded.CartridgeSerialNumber, 0, 32); + + return decoded; + } + + public static string PrettifyPage_DF_Certance(byte[] pageResponse) => + PrettifyPage_DF_Certance(DecodePage_DF_Certance(pageResponse)); + + public static string PrettifyPage_DF_Certance(Page_DF_Certance? modePage) + { + if(!modePage.HasValue) + return null; + + Page_DF_Certance page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.Certance_drive_status_page); + + switch(page.CmdFwd) + { + case 0: + sb.AppendLine("\t" + Localization.Command_forwarding_is_disabled); + + break; + case 1: + sb.AppendLine("\t" + Localization.Command_forwarding_is_enabled); + + break; + default: + sb.AppendFormat("\t" + Localization.Unknown_command_forwarding_code_0, page.CmdFwd).AppendLine(); + + break; + } + + if(page.Alerts) + sb.AppendLine("\t" + Localization.Alerts_are_enabled); + + if(page.NoRemov) + sb.AppendLine("\t" + Localization.Cartridge_removable_is_prevented); + + if(page.UnitRsvd) + sb.AppendFormat("\t" + Localization.Unit_is_reserved_by_initiator_ID_0, page.InitiatorID).AppendLine(); + + if(page.Clean) + sb.AppendLine("\t" + Localization.Device_needs_cleaning_cartridge); + + if(page.Threaded) + sb.AppendLine("\t" + Localization.Cartridge_tape_is_threaded); + + if(page.Lun1Cmd) + sb.AppendLine("\t" + Localization.There_are_commands_pending_to_be_forwarded); + + switch(page.AutoloadMode) + { + case 0: + sb.AppendLine("\t" + Localization.Cartridge_will_be_loaded_and_threaded_on_insertion); + + break; + case 1: + sb.AppendLine("\t" + Localization.Cartridge_will_be_loaded_but_not_threaded_on_insertion); + + break; + case 2: + sb.AppendLine("\t" + Localization.Cartridge_will_not_be_loaded); + + break; + default: + sb.AppendFormat("\t" + Localization.Unknown_autoloading_mode_code_0, page.AutoloadMode).AppendLine(); + + break; + } + + switch(page.PortATransportType) + { + case 0: + sb.AppendLine("\t" + Localization.Port_A_link_is_down); + + break; + case 3: + sb.AppendLine("\t" + Localization.Port_A_uses_Parallel_SCSI_Ultra_160_interface); + + break; + default: + sb.AppendFormat("\t" + Localization.Unknown_port_A_transport_type_code_0, page.PortATransportType). + AppendLine(); + + break; + } + + if(page.PortATransportType > 0) + sb.AppendFormat("\t" + Localization.Drive_responds_to_SCSI_ID_0, page.PortASelectionID).AppendLine(); + + sb.AppendFormat("\t" + Localization.Drive_has_been_operating_0, TimeSpan.FromHours(page.OperatingHours)). + AppendLine(); + + if(page.CartridgeType > 0) + { + switch(page.CartridgeFormat) + { + case 0: + sb.AppendLine("\t" + Localization.Inserted_cartridge_is_LTO); + + break; + default: + sb.AppendFormat("\t" + Localization.Unknown_cartridge_format_code_0, page.CartridgeType). + AppendLine(); + + break; + } + + switch(page.CartridgeType) + { + case 0: + sb.AppendLine("\t" + Localization.There_is_no_cartridge_inserted); + + break; + case 1: + sb.AppendLine("\t" + Localization.Cleaning_cartridge_inserted); + + break; + case 2: + sb.AppendLine("\t" + Localization.Unknown_data_cartridge_inserted); + + break; + case 3: + sb.AppendLine("\t" + Localization.Firmware_cartridge_inserted); + + break; + case 4: + sb.AppendLine("\t" + Localization.LTO_Ultrium_1_Type_A_cartridge_inserted); + + break; + case 5: + sb.AppendLine("\t" + Localization.LTO_Ultrium_1_Type_B_cartridge_inserted); + + break; + case 6: + sb.AppendLine("\t" + Localization.LTO_Ultrium_1_Type_C_cartridge_inserted); + + break; + case 7: + sb.AppendLine("\t" + Localization.LTO_Ultrium_1_Type_D_cartridge_inserted); + + break; + case 8: + sb.AppendLine("\t" + Localization.LTO_Ultrium_2_cartridge_inserted); + + break; + default: + sb.AppendFormat("\t" + Localization.Unknown_cartridge_type_code_0, page.CartridgeType).AppendLine(); + + break; + } + + sb.AppendFormat("\t" + Localization.Cartridge_has_an_uncompressed_capability_of_0_gigabytes, + page.CartridgeCapacity). + AppendLine(); + + sb.AppendFormat("\t" + Localization.Cartridge_serial_number_0, + StringHandlers.SpacePaddedToString(page.CartridgeSerialNumber)). + AppendLine(); + } + else + sb.AppendLine("\t" + Localization.There_is_no_cartridge_inserted); + + return sb.ToString(); + } + +#endregion EVPD Page 0xDF (Certance): Drive status pages + +#region EVPD Page 0xC0 (IBM): Drive Component Revision Levels page + + /// Drive Component Revision Levels page Page code 0xC0 (IBM) + public struct Page_C0_IBM + { + /// The peripheral qualifier. + public PeripheralQualifiers PeripheralQualifier; + /// The type of the peripheral device. + public PeripheralDeviceTypes PeripheralDeviceType; + /// The page code. + public byte PageCode; + /// The length of the page. + public byte PageLength; + public byte[] CodeName; + public byte[] Date; + } + + public static Page_C0_IBM? DecodePage_C0_IBM(byte[] pageResponse) + { + if(pageResponse?[1] != 0xC0) + return null; + + if(pageResponse[3] != 39) + return null; + + if(pageResponse.Length != 43) + return null; + + var decoded = new Page_C0_IBM + { + PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), + PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F), + PageLength = (byte)(pageResponse[3] + 4), + CodeName = new byte[12], + Date = new byte[8] + }; + + Array.Copy(pageResponse, 4, decoded.CodeName, 0, 12); + Array.Copy(pageResponse, 23, decoded.Date, 0, 8); + + return decoded; + } + + public static string PrettifyPage_C0_IBM(byte[] pageResponse) => + PrettifyPage_C0_IBM(DecodePage_C0_IBM(pageResponse)); + + public static string PrettifyPage_C0_IBM(Page_C0_IBM? modePage) + { + if(!modePage.HasValue) + return null; + + Page_C0_IBM page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.IBM_Drive_Component_Revision_Levels_page); + + sb.AppendFormat("\t" + Localization.Code_name_0, StringHandlers.CToString(page.CodeName)).AppendLine(); + sb.AppendFormat("\t" + Localization.Certance_Date_0, StringHandlers.CToString(page.Date)).AppendLine(); + + return sb.ToString(); + } + +#endregion EVPD Page 0xC0 (IBM): Drive Component Revision Levels page + +#region EVPD Page 0xC1 (IBM): Drive Serial Numbers page + + /// Drive Serial Numbers page Page code 0xC1 (IBM) + public struct Page_C1_IBM + { + /// The peripheral qualifier. + public PeripheralQualifiers PeripheralQualifier; + /// The type of the peripheral device. + public PeripheralDeviceTypes PeripheralDeviceType; + /// The page code. + public byte PageCode; + /// The length of the page. + public byte PageLength; + public byte[] ManufacturingSerial; + public byte[] ReportedSerial; + } + + public static Page_C1_IBM? DecodePage_C1_IBM(byte[] pageResponse) + { + if(pageResponse?[1] != 0xC1) + return null; + + if(pageResponse[3] != 24) + return null; + + if(pageResponse.Length != 28) + return null; + + var decoded = new Page_C1_IBM + { + PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), + PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F), + PageLength = (byte)(pageResponse[3] + 4), + ManufacturingSerial = new byte[12], + ReportedSerial = new byte[12] + }; + + Array.Copy(pageResponse, 4, decoded.ManufacturingSerial, 0, 12); + Array.Copy(pageResponse, 16, decoded.ReportedSerial, 0, 12); + + return decoded; + } + + public static string PrettifyPage_C1_IBM(byte[] pageResponse) => + PrettifyPage_C1_IBM(DecodePage_C1_IBM(pageResponse)); + + public static string PrettifyPage_C1_IBM(Page_C1_IBM? modePage) + { + if(!modePage.HasValue) + return null; + + Page_C1_IBM page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.IBM_Drive_Serial_Numbers_page); + + sb.AppendFormat("\t" + Localization.Manufacturing_serial_number_0, + StringHandlers.CToString(page.ManufacturingSerial)). + AppendLine(); + + sb.AppendFormat("\t" + Localization.Reported_serial_number_0, StringHandlers.CToString(page.ReportedSerial)). + AppendLine(); + + return sb.ToString(); + } + +#endregion EVPD Page 0xC1 (IBM): Drive Serial Numbers page + +#region EVPD Page 0xB0: Sequential-access device capabilities page + + /// Sequential-access device capabilities page Page code 0xB0 + public struct Page_B0 + { + /// The peripheral qualifier. + public PeripheralQualifiers PeripheralQualifier; + /// The type of the peripheral device. + public PeripheralDeviceTypes PeripheralDeviceType; + /// The page code. + public byte PageCode; + /// The length of the page. + public ushort PageLength; + public bool TSMC; + public bool WORM; + } + + public static Page_B0? DecodePage_B0(byte[] pageResponse) + { + if(pageResponse?[1] != 0xB0) + return null; + + if((pageResponse[2] << 8) + pageResponse[3] + 4 != pageResponse.Length) + return null; + + if(pageResponse.Length < 5) + return null; + + var decoded = new Page_B0 + { + PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), + PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F), + PageLength = (ushort)((pageResponse[2] << 8) + pageResponse[3] + 4), + TSMC = (pageResponse[4] & 0x02) == 0x02, + WORM = (pageResponse[4] & 0x01) == 0x01 + }; + + return decoded; + } + + public static string PrettifyPage_B0(byte[] pageResponse) => PrettifyPage_B0(DecodePage_B0(pageResponse)); + + public static string PrettifyPage_B0(Page_B0? modePage) + { + if(!modePage.HasValue) + return null; + + Page_B0 page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_Sequential_access_Device_Capabilities); + + if(page.WORM) + sb.AppendLine("\t" + Localization.Device_supports_WORM_media); + + if(page.TSMC) + sb.AppendLine("\t" + Localization.Device_supports_Tape_Stream_Mirroring); + + return sb.ToString(); + } + +#endregion EVPD Page 0xB0: Sequential-access device capabilities page + +#region EVPD Pages 0xC0 to 0xC5 (HP): Drive component revision level pages + + /// Drive component revision level pages Page codes 0xC0 to 0xC5 (HP) + public struct Page_C0_to_C5_HP + { + /// The peripheral qualifier. + public PeripheralQualifiers PeripheralQualifier; + /// The type of the peripheral device. + public PeripheralDeviceTypes PeripheralDeviceType; + /// The page code. + public byte PageCode; + /// The length of the page. + public byte PageLength; + public byte[] Component; + public byte[] Version; + public byte[] Date; + public byte[] Variant; + public byte[] Copyright; + } + + public static Page_C0_to_C5_HP? DecodePage_C0_to_C5_HP(byte[] pageResponse) + { + if(pageResponse == null) + return null; + + if(pageResponse[1] != 0xC0 && + pageResponse[1] != 0xC1 && + pageResponse[1] != 0xC2 && + pageResponse[1] != 0xC3 && + pageResponse[1] != 0xC4 && + pageResponse[1] != 0xC5) + return null; + + if(pageResponse.Length < 4) + return null; + + var decoded = new Page_C0_to_C5_HP + { + PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), + PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F), + PageLength = (byte)(pageResponse[3] + 4), + PageCode = pageResponse[1] + }; + + if(pageResponse[3] == 92 && pageResponse.Length >= 96) + { + decoded.Component = new byte[26]; + decoded.Version = new byte[19]; + decoded.Date = new byte[24]; + decoded.Variant = new byte[23]; + + Array.Copy(pageResponse, 4, decoded.Component, 0, 26); + Array.Copy(pageResponse, 30, decoded.Version, 0, 19); + Array.Copy(pageResponse, 49, decoded.Date, 0, 24); + Array.Copy(pageResponse, 73, decoded.Variant, 0, 23); + + return decoded; + } + + if(pageResponse[4] != pageResponse[3] - 1) + return null; + + List array = new(); + + const string fwRegExStr = @"Firmware Rev\s+=\s+(?\d+\.\d+)\s+Build date\s+=\s+(?(\w|\d|\s*.)*)\s*$"; + + const string fwcRegExStr = @"FW_CONF\s+=\s+(?0x[0-9A-Fa-f]{8})\s*$"; + const string servoRegExStr = @"Servo\s+Rev\s+=\s+(?\d+\.\d+)\s*$"; + var fwRegEx = new Regex(fwRegExStr); + var fwcRegEx = new Regex(fwcRegExStr); + var servoRegEx = new Regex(servoRegExStr); + + for(var pos = 5; pos < pageResponse.Length; pos++) + { + if(pageResponse[pos] == 0x00) + { + string str = StringHandlers.CToString(array.ToArray()); + Match fwMatch = fwRegEx.Match(str); + Match fwcMatch = fwcRegEx.Match(str); + Match servoMatch = servoRegEx.Match(str); + + if(str.ToLowerInvariant().StartsWith("copyright", StringComparison.Ordinal)) + decoded.Copyright = Encoding.ASCII.GetBytes(str); + else if(fwMatch.Success) + { + decoded.Component = "Firmware"u8.ToArray(); + decoded.Version = Encoding.ASCII.GetBytes(fwMatch.Groups["fw"].Value); + decoded.Date = Encoding.ASCII.GetBytes(fwMatch.Groups["date"].Value); + } + else if(fwcMatch.Success) + decoded.Variant = Encoding.ASCII.GetBytes(fwMatch.Groups["value"].Value); + else if(servoMatch.Success) + { + decoded.Component = "Servo"u8.ToArray(); + decoded.Version = Encoding.ASCII.GetBytes(servoMatch.Groups["version"].Value); + } + + array = new List(); + } + else + array.Add(pageResponse[pos]); + } + + return decoded; + } + + public static string PrettifyPage_C0_to_C5_HP(byte[] pageResponse) => + PrettifyPage_C0_to_C5_HP(DecodePage_C0_to_C5_HP(pageResponse)); + + public static string PrettifyPage_C0_to_C5_HP(Page_C0_to_C5_HP? modePage) + { + if(!modePage.HasValue) + return null; + + Page_C0_to_C5_HP page = modePage.Value; + var sb = new StringBuilder(); + + switch(page.PageCode) + { + case 0xC0: + sb.AppendLine(Localization.HP_Drive_Firmware_Revision_Levels_page); + + break; + case 0xC1: + sb.AppendLine(Localization.HP_Drive_Hardware_Revision_Levels_page); + + break; + case 0xC2: + sb.AppendLine(Localization.HP_Drive_PCA_Revision_Levels_page); + + break; + case 0xC3: + sb.AppendLine(Localization.HP_Drive_Mechanism_Revision_Levels_page); + + break; + case 0xC4: + sb.AppendLine(Localization.HP_Drive_Head_Assembly_Revision_Levels_page); + + break; + case 0xC5: + sb.AppendLine(Localization.HP_Drive_ACI_Revision_Levels_page); + + break; + } + + if(page.Component is { Length: > 0 }) + { + sb.AppendFormat("\t" + Localization.Certance_Component_0, StringHandlers.CToString(page.Component)). + AppendLine(); + } + + if(page.Version is { Length: > 0 }) + { + sb.AppendFormat("\t" + Localization.Certance_Version_0, StringHandlers.CToString(page.Version)). + AppendLine(); + } + + if(page.Date is { Length: > 0 }) + sb.AppendFormat("\t" + Localization.Certance_Date_0, StringHandlers.CToString(page.Date)).AppendLine(); + + if(page.Variant is { Length: > 0 }) + { + sb.AppendFormat("\t" + Localization.Certance_Variant_0, StringHandlers.CToString(page.Variant)). + AppendLine(); + } + + if(page.Copyright is { Length: > 0 }) + sb.AppendFormat("\t" + Localization.Copyright_0, StringHandlers.CToString(page.Copyright)).AppendLine(); + + return sb.ToString(); + } + +#endregion EVPD Pages 0xC0 to 0xC5 (HP): Drive component revision level pages + +#region EVPD Page 0xC0 (Seagate): Firmware numbers page + + /// Firmware numbers page Page code 0xC0 (Seagate) + public struct Page_C0_Seagate + { + /// The peripheral qualifier. + public PeripheralQualifiers PeripheralQualifier; + /// The type of the peripheral device. + public PeripheralDeviceTypes PeripheralDeviceType; + /// The page code. + public byte PageCode; + /// The length of the page. + public byte PageLength; + public byte[] ControllerFirmware; + public byte[] BootFirmware; + public byte[] ServoFirmware; + } + + public static Page_C0_Seagate? DecodePage_C0_Seagate(byte[] pageResponse) + { + if(pageResponse?[1] != 0xC0) + return null; + + if(pageResponse[3] != 12) + return null; + + if(pageResponse.Length != 16) + return null; + + var decoded = new Page_C0_Seagate + { + PeripheralQualifier = (PeripheralQualifiers)((pageResponse[0] & 0xE0) >> 5), + PeripheralDeviceType = (PeripheralDeviceTypes)(pageResponse[0] & 0x1F), + PageLength = (byte)(pageResponse[3] + 4), + PageCode = pageResponse[1], + ControllerFirmware = new byte[4], + BootFirmware = new byte[4], + ServoFirmware = new byte[4] + }; + + Array.Copy(pageResponse, 4, decoded.ControllerFirmware, 0, 4); + Array.Copy(pageResponse, 8, decoded.BootFirmware, 0, 4); + Array.Copy(pageResponse, 12, decoded.ServoFirmware, 0, 4); + + return decoded; + } + + public static string PrettifyPage_C0_Seagate(byte[] pageResponse) => + PrettifyPage_C0_Seagate(DecodePage_C0_Seagate(pageResponse)); + + public static string PrettifyPage_C0_Seagate(Page_C0_Seagate? modePage) + { + if(!modePage.HasValue) + return null; + + Page_C0_Seagate page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.Seagate_Firmware_Numbers_page); + + sb.AppendFormat("\t" + Localization.Controller_firmware_version_0, + StringHandlers.CToString(page.ControllerFirmware)). + AppendLine(); + + sb.AppendFormat("\t" + Localization.Boot_firmware_version_0, StringHandlers.CToString(page.BootFirmware)). + AppendLine(); + + sb.AppendFormat("\t" + Localization.Servo_firmware_version_0, StringHandlers.CToString(page.ServoFirmware)). + AppendLine(); + + return sb.ToString(); + } + +#endregion EVPD Page 0xC0 (Seagate): Firmware numbers page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Inquiry.cs b/Aaru.Decoders/SCSI/Inquiry.cs new file mode 100644 index 000000000..9ce7e2d60 --- /dev/null +++ b/Aaru.Decoders/SCSI/Inquiry.cs @@ -0,0 +1,2543 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : Inquiry.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI INQUIRY responses. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using System.Text; +using Aaru.CommonTypes.Structs.Devices.SCSI; +using Aaru.Helpers; +using Aaru.Localization; + +namespace Aaru.Decoders.SCSI; + +// Information from the following standards: +// T9/375-D revision 10l +// T10/995-D revision 10 +// T10/1236-D revision 20 +// T10/1416-D revision 23 +// T10/1731-D revision 16 +// T10/502 revision 05 +// RFC 7144 +// ECMA-111 +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static class Inquiry +{ + public static string Prettify(CommonTypes.Structs.Devices.SCSI.Inquiry? SCSIInquiryResponse) + { + if(SCSIInquiryResponse == null) + return null; + + CommonTypes.Structs.Devices.SCSI.Inquiry response = SCSIInquiryResponse.Value; + + var sb = new StringBuilder(); + + sb.AppendFormat(Localization.Device_vendor_0, + VendorString.Prettify(StringHandlers.CToString(response.VendorIdentification).Trim())). + AppendLine(); + + sb.AppendFormat(Localization.Device_name_0, StringHandlers.CToString(response.ProductIdentification).Trim()). + AppendLine(); + + sb.AppendFormat(Localization.Device_release_level_0, + StringHandlers.CToString(response.ProductRevisionLevel).Trim()). + AppendLine(); + + switch((PeripheralQualifiers)response.PeripheralQualifier) + { + case PeripheralQualifiers.Supported: + sb.AppendLine(Localization.Device_is_connected_and_supported); + + break; + case PeripheralQualifiers.Unconnected: + sb.AppendLine(Localization.Device_is_supported_but_not_connected); + + break; + case PeripheralQualifiers.Reserved: + sb.AppendLine(Localization.Reserved_value_set_in_Peripheral_Qualifier_field); + + break; + case PeripheralQualifiers.Unsupported: + sb.AppendLine(Localization.Device_is_connected_but_unsupported); + + break; + default: + sb.AppendFormat(Localization.Vendor_value_0_set_in_Peripheral_Qualifier_field, + response.PeripheralQualifier). + AppendLine(); + + break; + } + + switch((PeripheralDeviceTypes)response.PeripheralDeviceType) + { + case PeripheralDeviceTypes.DirectAccess: //0x00, + sb.AppendLine(Localization.Direct_access_device); + + break; + case PeripheralDeviceTypes.SequentialAccess: //0x01, + sb.AppendLine(Localization.Sequential_access_device); + + break; + case PeripheralDeviceTypes.PrinterDevice: //0x02, + sb.AppendLine(Localization.Printer_device); + + break; + case PeripheralDeviceTypes.ProcessorDevice: //0x03, + sb.AppendLine(Localization.Processor_device); + + break; + case PeripheralDeviceTypes.WriteOnceDevice: //0x04, + sb.AppendLine(Localization.Write_once_device); + + break; + case PeripheralDeviceTypes.MultiMediaDevice: //0x05, + sb.AppendLine(Localization.CD_ROM_DVD_etc_device); + + break; + case PeripheralDeviceTypes.ScannerDevice: //0x06, + sb.AppendLine(Localization.Scanner_device); + + break; + case PeripheralDeviceTypes.OpticalDevice: //0x07, + sb.AppendLine(Localization.Optical_memory_device); + + break; + case PeripheralDeviceTypes.MediumChangerDevice: //0x08, + sb.AppendLine(Localization.Medium_change_device); + + break; + case PeripheralDeviceTypes.CommsDevice: //0x09, + sb.AppendLine(Localization.Communications_device); + + break; + case PeripheralDeviceTypes.PrePressDevice1: //0x0A, + sb.AppendLine(Localization.Graphics_arts_pre_press_device_defined_in_ASC_IT8); + + break; + case PeripheralDeviceTypes.PrePressDevice2: //0x0B, + sb.AppendLine(Localization.Graphics_arts_pre_press_device_defined_in_ASC_IT8); + + break; + case PeripheralDeviceTypes.ArrayControllerDevice: //0x0C, + sb.AppendLine(Localization.Array_controller_device); + + break; + case PeripheralDeviceTypes.EnclosureServiceDevice: //0x0D, + sb.AppendLine(Localization.Enclosure_services_device); + + break; + case PeripheralDeviceTypes.SimplifiedDevice: //0x0E, + sb.AppendLine(Localization.Simplified_direct_access_device); + + break; + case PeripheralDeviceTypes.OCRWDevice: //0x0F, + sb.AppendLine(Localization.Optical_card_reader_writer_device); + + break; + case PeripheralDeviceTypes.BridgingExpander: //0x10, + sb.AppendLine(Localization.Bridging_Expanders); + + break; + case PeripheralDeviceTypes.ObjectDevice: //0x11, + sb.AppendLine(Localization.Object_based_Storage_Device); + + break; + case PeripheralDeviceTypes.ADCDevice: //0x12, + sb.AppendLine(Localization.Automation_Drive_Interface); + + break; + case PeripheralDeviceTypes.SCSISecurityManagerDevice: //0x13, + sb.AppendLine(Localization.Security_Manager_Device); + + break; + case PeripheralDeviceTypes.SCSIZonedBlockDevice: //0x14 + sb.AppendLine(Localization.Host_managed_zoned_block_device); + + break; + case PeripheralDeviceTypes.WellKnownDevice: //0x1E, + sb.AppendLine(Localization.Well_known_logical_unit); + + break; + case PeripheralDeviceTypes.UnknownDevice: //0x1F + sb.AppendLine(Localization.Unknown_or_no_device_type); + + break; + default: + sb.AppendFormat(Localization.Unknown_device_type_field_value_0, response.PeripheralDeviceType). + AppendLine(); + + break; + } + + switch((ANSIVersions)response.ANSIVersion) + { + case ANSIVersions.ANSINoVersion: + sb.AppendLine(Localization.Device_does_not_claim_to_comply_with_any_SCSI_ANSI_standard); + + break; + case ANSIVersions.ANSI1986Version: + sb.AppendLine(Localization.Device_claims_to_comply_with_ANSI_X3_131_1986_SCSI_1); + + break; + case ANSIVersions.ANSI1994Version: + sb.AppendLine(Localization.Device_claims_to_comply_with_ANSI_X3_131_1994_SCSI_2); + + break; + case ANSIVersions.ANSI1997Version: + sb.AppendLine(Localization.Device_claims_to_comply_with_ANSI_X3_301_1997_SPC_1); + + break; + case ANSIVersions.ANSI2001Version: + sb.AppendLine(Localization.Device_claims_to_comply_with_ANSI_X3_351_2001_SPC_2); + + break; + case ANSIVersions.ANSI2005Version: + sb.AppendLine(Localization.Device_claims_to_comply_with_ANSI_X3_408_2005_SPC_3); + + break; + case ANSIVersions.ANSI2008Version: + sb.AppendLine(Localization.Device_claims_to_comply_with_ANSI_X3_408_2005_SPC_4); + + break; + default: + sb.AppendFormat(Localization.Device_claims_to_comply_with_unknown_SCSI_ANSI_standard_value_0, + response.ANSIVersion). + AppendLine(); + + break; + } + + switch((ECMAVersions)response.ECMAVersion) + { + case ECMAVersions.ECMANoVersion: + sb.AppendLine(Localization.Device_does_not_claim_to_comply_with_any_SCSI_ECMA_standard); + + break; + case ECMAVersions.ECMA111: + sb.AppendLine(Localization.Device_claims_to_comply_ECMA_111_Small_Computer_System_Interface_SCSI); + + break; + default: + sb.AppendFormat(Localization.Device_claims_to_comply_with_unknown_SCSI_ECMA_standard_value_0, + response.ECMAVersion). + AppendLine(); + + break; + } + + switch((ISOVersions)response.ISOVersion) + { + case ISOVersions.ISONoVersion: + sb.AppendLine(Localization.Device_does_not_claim_to_comply_with_any_SCSI_ISO_IEC_standard); + + break; + case ISOVersions.ISO1995Version: + sb.AppendLine(Localization.Device_claims_to_comply_with_ISO_IEC_9316_1995); + + break; + default: + sb.AppendFormat(Localization.Device_claims_to_comply_with_unknown_SCSI_ISO_IEC_standard_value_0, + response.ISOVersion). + AppendLine(); + + break; + } + + if(response.RMB) + sb.AppendLine(Localization.Device_is_removable); + + if(response.AERC) + sb.AppendLine(Localization.Device_supports_Asynchronous_Event_Reporting_Capability); + + if(response.TrmTsk) + sb.AppendLine(Localization.Device_supports_TERMINATE_TASK_command); + + if(response.NormACA) + sb.AppendLine(Localization.Device_supports_setting_Normal_ACA); + + if(response.HiSup) + sb.AppendLine(Localization.Device_supports_LUN_hierarchical_addressing); + + if(response.SCCS) + sb.AppendLine(Localization.Device_contains_an_embedded_storage_array_controller); + + if(response.ACC) + sb.AppendLine(Localization.Device_contains_an_Access_Control_Coordinator); + + if(response.ThreePC) + sb.AppendLine(Localization.Device_supports_third_party_copy_commands); + + if(response.Protect) + sb.AppendLine(Localization.Device_supports_protection_information); + + if(response.BQue) + sb.AppendLine(Localization.Device_supports_basic_queueing); + + if(response.EncServ) + sb.AppendLine(Localization.Device_contains_an_embedded_enclosure_services_component); + + if(response.MultiP) + sb.AppendLine(Localization.Multi_port_device); + + if(response.MChngr) + sb.AppendLine(Localization.Device_contains_or_is_attached_to_a_medium_changer); + + if(response.ACKREQQ) + sb.AppendLine(Localization.Device_supports_request_and_acknowledge_handshakes); + + if(response.Addr32) + sb.AppendLine(Localization.Device_supports_32_bit_wide_SCSI_addresses); + + if(response.Addr16) + sb.AppendLine(Localization.Device_supports_16_bit_wide_SCSI_addresses); + + if(response.RelAddr) + sb.AppendLine(Localization.Device_supports_relative_addressing); + + if(response.WBus32) + sb.AppendLine(Localization.Device_supports_32_bit_wide_data_transfers); + + if(response.WBus16) + sb.AppendLine(Localization.Device_supports_16_bit_wide_data_transfers); + + if(response.Sync) + sb.AppendLine(Localization.Device_supports_synchronous_data_transfer); + + if(response.Linked) + sb.AppendLine(Localization.Device_supports_linked_commands); + + if(response.TranDis) + sb.AppendLine(Localization.Device_supports_CONTINUE_TASK_and_TARGET_TRANSFER_DISABLE_commands); + + if(response.QAS) + sb.AppendLine(Localization.Device_supports_Quick_Arbitration_and_Selection); + + if(response.CmdQue) + sb.AppendLine(Localization.Device_supports_TCQ_queue); + + if(response.IUS) + sb.AppendLine(Localization.Device_supports_information_unit_transfers); + + if(response.SftRe) + sb.AppendLine(Localization.Device_implements_RESET_as_a_soft_reset); + #if DEBUG + if(response.VS1) + sb.AppendLine(Localization.Vendor_specific_bit_5_on_byte_6_of_INQUIRY_response_is_set); + #endif + + switch((TGPSValues)response.TPGS) + { + case TGPSValues.NotSupported: + sb.AppendLine(Localization.Device_does_not_support_asymmetrical_access); + + break; + case TGPSValues.OnlyImplicit: + sb.AppendLine(Localization.Device_only_supports_implicit_asymmetrical_access); + + break; + case TGPSValues.OnlyExplicit: + sb.AppendLine(Localization.Device_only_supports_explicit_asymmetrical_access); + + break; + case TGPSValues.Both: + sb.AppendLine(Localization.Device_supports_implicit_and_explicit_asymmetrical_access); + + break; + default: + sb.AppendFormat(Localization.Unknown_value_in_TPGS_field_0, response.TPGS).AppendLine(); + + break; + } + + switch((SPIClocking)response.Clocking) + { + case SPIClocking.ST: + sb.AppendLine(Localization.Device_supports_only_ST_clocking); + + break; + case SPIClocking.DT: + sb.AppendLine(Localization.Device_supports_only_DT_clocking); + + break; + case SPIClocking.Reserved: + sb.AppendLine(Localization.Reserved_value_0x02_found_in_SPI_clocking_field); + + break; + case SPIClocking.STandDT: + sb.AppendLine(Localization.Device_supports_ST_and_DT_clocking); + + break; + default: + sb.AppendFormat(Localization.Unknown_value_in_SPI_clocking_field_0, response.Clocking).AppendLine(); + + break; + } + + if(response.VersionDescriptors != null) + { + foreach(ushort VersionDescriptor in response.VersionDescriptors) + { + switch(VersionDescriptor) + { + case 0xFFFF: + case 0x0000: + break; + case 0x0020: + sb.AppendLine(Localization.Device_complies_with_SAM_no_version_claimed); + + break; + case 0x003B: + sb.AppendLine(Localization.Device_complies_with_SAM_T10_0994_D_revision_18); + + break; + case 0x003C: + sb.AppendLine(Localization.Device_complies_with_SAM_ANSI_INCITS_270_1996); + + break; + case 0x0040: + sb.AppendLine(Localization.Device_complies_with_SAM_2_no_version_claimed); + + break; + case 0x0054: + sb.AppendLine(Localization.Device_complies_with_SAM_2_T10_1157_D_revision_23); + + break; + case 0x0055: + sb.AppendLine(Localization.Device_complies_with_SAM_2_T10_1157_D_revision_24); + + break; + case 0x005C: + sb.AppendLine(Localization.Device_complies_with_SAM_2_ANSI_INCITS_366_2003); + + break; + case 0x005E: + sb.AppendLine(Localization.Device_complies_with_SAM_2_ISO_IEC_14776_412); + + break; + case 0x0060: + sb.AppendLine(Localization.Device_complies_with_SAM_3_no_version_claimed); + + break; + case 0x0062: + sb.AppendLine(Localization.Device_complies_with_SAM_3_T10_1561_D_revision_7); + + break; + case 0x0075: + sb.AppendLine(Localization.Device_complies_with_SAM_3_T10_1561_D_revision_13); + + break; + case 0x0076: + sb.AppendLine(Localization.Device_complies_with_SAM_3_T10_1561_D_revision_14); + + break; + case 0x0077: + sb.AppendLine(Localization.Device_complies_with_SAM_3_ANSI_INCITS_402_2005); + + break; + case 0x0080: + sb.AppendLine(Localization.Device_complies_with_SAM_4_no_version_claimed); + + break; + case 0x0087: + sb.AppendLine(Localization.Device_complies_with_SAM_4_T10_1683_D_revision_13); + + break; + case 0x008B: + sb.AppendLine(Localization.Device_complies_with_SAM_4_T10_1683_D_revision_14); + + break; + case 0x0090: + sb.AppendLine(Localization.Device_complies_with_SAM_4_ANSI_INCITS_447_2008); + + break; + case 0x0092: + sb.AppendLine(Localization.Device_complies_with_SAM_4_ISO_IEC_14776_414); + + break; + case 0x00A0: + sb.AppendLine(Localization.Device_complies_with_SAM_5_no_version_claimed); + + break; + case 0x00A2: + sb.AppendLine(Localization.Device_complies_with_SAM_5_T10_2104_D_revision_4); + + break; + case 0x00A4: + sb.AppendLine(Localization.Device_complies_with_SAM_5_T10_2104_D_revision_20); + + break; + case 0x00A6: + sb.AppendLine(Localization.Device_complies_with_SAM_5_T10_2104_D_revision_21); + + break; + case 0x00C0: + sb.AppendLine(Localization.Device_complies_with_SAM_6_no_version_claimed); + + break; + case 0x0120: + sb.AppendLine(Localization.Device_complies_with_SPC_no_version_claimed); + + break; + case 0x013B: + sb.AppendLine(Localization.Device_complies_with_SPC_T10_0995_D_revision_11a); + + break; + case 0x013C: + sb.AppendLine(Localization.Device_complies_with_SPC_ANSI_INCITS_301_1997); + + break; + case 0x0140: + sb.AppendLine(Localization.Device_complies_with_MMC_no_version_claimed); + + break; + case 0x015B: + sb.AppendLine(Localization.Device_complies_with_MMC_T10_1048_D_revision_10a); + + break; + case 0x015C: + sb.AppendLine(Localization.Device_complies_with_MMC_ANSI_INCITS_304_1997); + + break; + case 0x0160: + sb.AppendLine(Localization.Device_complies_with_SCC_no_version_claimed); + + break; + case 0x017B: + sb.AppendLine(Localization.Device_complies_with_SCC_T10_1047_D_revision_06c); + + break; + case 0x017C: + sb.AppendLine(Localization.Device_complies_with_SCC_ANSI_INCITS_276_1997); + + break; + case 0x0180: + sb.AppendLine(Localization.Device_complies_with_SBC_no_version_claimed); + + break; + case 0x019B: + sb.AppendLine(Localization.Device_complies_with_SBC_T10_0996_D_revision_08c); + + break; + case 0x019C: + sb.AppendLine(Localization.Device_complies_with_SBC_ANSI_INCITS_306_1998); + + break; + case 0x01A0: + sb.AppendLine(Localization.Device_complies_with_SMC_no_version_claimed); + + break; + case 0x01BB: + sb.AppendLine(Localization.Device_complies_with_SMC_T10_0999_D_revision_10a); + + break; + case 0x01BC: + sb.AppendLine(Localization.Device_complies_with_SMC_ANSI_INCITS_314_1998); + + break; + case 0x01BE: + sb.AppendLine(Localization.Device_complies_with_SMC_ISO_IEC_14776_351); + + break; + case 0x01C0: + sb.AppendLine(Localization.Device_complies_with_SES_no_version_claimed); + + break; + case 0x01DB: + sb.AppendLine(Localization.Device_complies_with_SES_T10_1212_D_revision_08b); + + break; + case 0x01DC: + sb.AppendLine(Localization.Device_complies_with_SES_ANSI_INCITS_305_1998); + + break; + case 0x01DD: + sb.AppendLine(Localization. + Device_complies_with_SES_T10_1212_revision_08b_Amendment_ANSI_INCITS_305_AM1_2000); + + break; + case 0x01DE: + sb.AppendLine(Localization. + Device_complies_with_SES_ANSI_INCITS_305_1998_Amendment_ANSI_INCITS_305_AM1_2000); + + break; + case 0x01E0: + sb.AppendLine(Localization.Device_complies_with_SCC_2_no_version_claimed); + + break; + case 0x01FB: + sb.AppendLine(Localization.Device_complies_with_SCC_2_T10_1125_D_revision_04); + + break; + case 0x01FC: + sb.AppendLine(Localization.Device_complies_with_SCC_2_ANSI_INCITS_318_1998); + + break; + case 0x0200: + sb.AppendLine(Localization.Device_complies_with_SSC_no_version_claimed); + + break; + case 0x0201: + sb.AppendLine(Localization.Device_complies_with_SSC_T10_0997_D_revision_17); + + break; + case 0x0207: + sb.AppendLine(Localization.Device_complies_with_SSC_T10_0997_D_revision_22); + + break; + case 0x021C: + sb.AppendLine(Localization.Device_complies_with_SSC_ANSI_INCITS_335_2000); + + break; + case 0x0220: + sb.AppendLine(Localization.Device_complies_with_RBC_no_version_claimed); + + break; + case 0x0238: + sb.AppendLine(Localization.Device_complies_with_RBC_T10_1240_D_revision_10a); + + break; + case 0x023C: + sb.AppendLine(Localization.Device_complies_with_RBC_ANSI_INCITS_330_2000); + + break; + case 0x0240: + sb.AppendLine(Localization.Device_complies_with_MMC_2_no_version_claimed); + + break; + case 0x0255: + sb.AppendLine(Localization.Device_complies_with_MMC_2_T10_1228_D_revision_11); + + break; + case 0x025B: + sb.AppendLine(Localization.Device_complies_with_MMC_2_T10_1228_D_revision_11a); + + break; + case 0x025C: + sb.AppendLine(Localization.Device_complies_with_MMC_2_ANSI_INCITS_333_2000); + + break; + case 0x0260: + sb.AppendLine(Localization.Device_complies_with_SPC_2_no_version_claimed); + + break; + case 0x0267: + sb.AppendLine(Localization.Device_complies_with_SPC_2_T10_1236_D_revision_12); + + break; + case 0x0269: + sb.AppendLine(Localization.Device_complies_with_SPC_2_T10_1236_D_revision_18); + + break; + case 0x0275: + sb.AppendLine(Localization.Device_complies_with_SPC_2_T10_1236_D_revision_19); + + break; + case 0x0276: + sb.AppendLine(Localization.Device_complies_with_SPC_2_T10_1236_D_revision_20); + + break; + case 0x0277: + sb.AppendLine(Localization.Device_complies_with_SPC_2_ANSI_INCITS_351_2001); + + break; + case 0x0278: + sb.AppendLine(Localization.Device_complies_with_SPC_2_ISO_IEC_14776_452); + + break; + case 0x0280: + sb.AppendLine(Localization.Device_complies_with_OCRW_no_version_claimed); + + break; + case 0x029E: + sb.AppendLine(Localization.Device_complies_with_OCRW_ISO_IEC_14776_381); + + break; + case 0x02A0: + sb.AppendLine(Localization.Device_complies_with_MMC_3_no_version_claimed); + + break; + case 0x02B5: + sb.AppendLine(Localization.Device_complies_with_MMC_3_T10_1363_D_revision_9); + + break; + case 0x02B6: + sb.AppendLine(Localization.Device_complies_with_MMC_3_T10_1363_D_revision_10g); + + break; + case 0x02B8: + sb.AppendLine(Localization.Device_complies_with_MMC_3_ANSI_INCITS_360_2002); + + break; + case 0x02E0: + sb.AppendLine(Localization.Device_complies_with_SMC_2_no_version_claimed); + + break; + case 0x02F5: + sb.AppendLine(Localization.Device_complies_with_SMC_2_T10_1383_D_revision_5); + + break; + case 0x02FC: + sb.AppendLine(Localization.Device_complies_with_SMC_2_T10_1383_D_revision_6); + + break; + case 0x02FD: + sb.AppendLine(Localization.Device_complies_with_SMC_2_T10_1383_D_revision_7); + + break; + case 0x02FE: + sb.AppendLine(Localization.Device_complies_with_SMC_2_ANSI_INCITS_382_2004); + + break; + case 0x0300: + sb.AppendLine(Localization.Device_complies_with_SPC_3_no_version_claimed); + + break; + case 0x0301: + sb.AppendLine(Localization.Device_complies_with_SPC_3_T10_1416_D_revision_7); + + break; + case 0x0307: + sb.AppendLine(Localization.Device_complies_with_SPC_3_T10_1416_D_revision_21); + + break; + case 0x030F: + sb.AppendLine(Localization.Device_complies_with_SPC_3_T10_1416_D_revision_22); + + break; + case 0x0312: + sb.AppendLine(Localization.Device_complies_with_SPC_3_T10_1416_D_revision_23); + + break; + case 0x0314: + sb.AppendLine(Localization.Device_complies_with_SPC_3_ANSI_INCITS_408_2005); + + break; + case 0x0316: + sb.AppendLine(Localization.Device_complies_with_SPC_3_ISO_IEC_14776_453); + + break; + case 0x0320: + sb.AppendLine(Localization.Device_complies_with_SBC_2_no_version_claimed); + + break; + case 0x0322: + sb.AppendLine(Localization.Device_complies_with_SBC_2_T10_1417_D_revision_5a); + + break; + case 0x0324: + sb.AppendLine(Localization.Device_complies_with_SBC_2_T10_1417_D_revision_15); + + break; + case 0x033B: + sb.AppendLine(Localization.Device_complies_with_SBC_2_T10_1417_D_revision_16); + + break; + case 0x033D: + sb.AppendLine(Localization.Device_complies_with_SBC_2_ANSI_INCITS_405_2005); + + break; + case 0x033E: + sb.AppendLine(Localization.Device_complies_with_SBC_2_ISO_IEC_14776_322); + + break; + case 0x0340: + sb.AppendLine(Localization.Device_complies_with_OSD_no_version_claimed); + + break; + case 0x0341: + sb.AppendLine(Localization.Device_complies_with_OSD_T10_1355_D_revision_0); + + break; + case 0x0342: + sb.AppendLine(Localization.Device_complies_with_OSD_T10_1355_D_revision_7a); + + break; + case 0x0343: + sb.AppendLine(Localization.Device_complies_with_OSD_T10_1355_D_revision_8); + + break; + case 0x0344: + sb.AppendLine(Localization.Device_complies_with_OSD_T10_1355_D_revision_9); + + break; + case 0x0355: + sb.AppendLine(Localization.Device_complies_with_OSD_T10_1355_D_revision_10); + + break; + case 0x0356: + sb.AppendLine(Localization.Device_complies_with_OSD_ANSI_INCITS_400_2004); + + break; + case 0x0360: + sb.AppendLine(Localization.Device_complies_with_SSC_2_no_version_claimed); + + break; + case 0x0374: + sb.AppendLine(Localization.Device_complies_with_SSC_2_T10_1434_D_revision_7); + + break; + case 0x0375: + sb.AppendLine(Localization.Device_complies_with_SSC_2_T10_1434_D_revision_9); + + break; + case 0x037D: + sb.AppendLine(Localization.Device_complies_with_SSC_2_ANSI_INCITS_380_2003); + + break; + case 0x0380: + sb.AppendLine(Localization.Device_complies_with_BCC_no_version_claimed); + + break; + case 0x03A0: + sb.AppendLine(Localization.Device_complies_with_MMC_4_no_version_claimed); + + break; + case 0x03B0: + sb.AppendLine(Localization.Device_complies_with_MMC_4_T10_1545_D_revision_5); + + break; + case 0x03B1: + sb.AppendLine(Localization.Device_complies_with_MMC_4_T10_1545_D_revision_5a); + + break; + case 0x03BD: + sb.AppendLine(Localization.Device_complies_with_MMC_4_T10_1545_D_revision_3); + + break; + case 0x03BE: + sb.AppendLine(Localization.Device_complies_with_MMC_4_T10_1545_D_revision_3d); + + break; + case 0x03BF: + sb.AppendLine(Localization.Device_complies_with_MMC_4_ANSI_INCITS_401_2005); + + break; + case 0x03C0: + sb.AppendLine(Localization.Device_complies_with_ADC_no_version_claimed); + + break; + case 0x03D5: + sb.AppendLine(Localization.Device_complies_with_ADC_T10_1558_D_revision_6); + + break; + case 0x03D6: + sb.AppendLine(Localization.Device_complies_with_ADC_T10_1558_D_revision_7); + + break; + case 0x03D7: + sb.AppendLine(Localization.Device_complies_with_ADC_ANSI_INCITS_403_2005); + + break; + case 0x03E0: + sb.AppendLine(Localization.Device_complies_with_SES_2_no_version_claimed); + + break; + case 0x03E1: + sb.AppendLine(Localization.Device_complies_with_SES_2_T10_1559_D_revision_16); + + break; + case 0x03E7: + sb.AppendLine(Localization.Device_complies_with_SES_2_T10_1559_D_revision_19); + + break; + case 0x03EB: + sb.AppendLine(Localization.Device_complies_with_SES_2_T10_1559_D_revision_20); + + break; + case 0x03F0: + sb.AppendLine(Localization.Device_complies_with_SES_2_ANSI_INCITS_448_2008); + + break; + case 0x03F2: + sb.AppendLine(Localization.Device_complies_with_SES_2_ISO_IEC_14776_372); + + break; + case 0x0400: + sb.AppendLine(Localization.Device_complies_with_SSC_3_no_version_claimed); + + break; + case 0x0403: + sb.AppendLine(Localization.Device_complies_with_SSC_3_T10_1611_D_revision_04a); + + break; + case 0x0407: + sb.AppendLine(Localization.Device_complies_with_SSC_3_T10_1611_D_revision_05); + + break; + case 0x0409: + sb.AppendLine(Localization.Device_complies_with_SSC_3_ANSI_INCITS_467_2011); + + break; + case 0x040B: + sb.AppendLine(Localization.Device_complies_with_SSC_3_ISO_IEC_14776_333_2013); + + break; + case 0x0420: + sb.AppendLine(Localization.Device_complies_with_MMC_5_no_version_claimed); + + break; + case 0x042F: + sb.AppendLine(Localization.Device_complies_with_MMC_5_T10_1675_D_revision_03); + + break; + case 0x0431: + sb.AppendLine(Localization.Device_complies_with_MMC_5_T10_1675_D_revision_03b); + + break; + case 0x0432: + sb.AppendLine(Localization.Device_complies_with_MMC_5_T10_1675_D_revision_04); + + break; + case 0x0434: + sb.AppendLine(Localization.Device_complies_with_MMC_5_ANSI_INCITS_430_2007); + + break; + case 0x0440: + sb.AppendLine(Localization.Device_complies_with_OSD_2_no_version_claimed); + + break; + case 0x0444: + sb.AppendLine(Localization.Device_complies_with_OSD_2_T10_1729_D_revision_4); + + break; + case 0x0446: + sb.AppendLine(Localization.Device_complies_with_OSD_2_T10_1729_D_revision_5); + + break; + case 0x0448: + sb.AppendLine(Localization.Device_complies_with_OSD_2_ANSI_INCITS_458_2011); + + break; + case 0x0460: + sb.AppendLine(Localization.Device_complies_with_SPC_4_no_version_claimed); + + break; + case 0x0461: + sb.AppendLine(Localization.Device_complies_with_SPC_4_T10_BSR_INCITS_513_revision_16); + + break; + case 0x0462: + sb.AppendLine(Localization.Device_complies_with_SPC_4_T10_BSR_INCITS_513_revision_18); + + break; + case 0x0463: + sb.AppendLine(Localization.Device_complies_with_SPC_4_T10_BSR_INCITS_513_revision_23); + + break; + case 0x0466: + sb.AppendLine(Localization.Device_complies_with_SPC_4_T10_BSR_INCITS_513_revision_36); + + break; + case 0x0468: + sb.AppendLine(Localization.Device_complies_with_SPC_4_T10_BSR_INCITS_513_revision_37); + + break; + case 0x0469: + sb.AppendLine(Localization.Device_complies_with_SPC_4_T10_BSR_INCITS_513_revision_37a); + + break; + case 0x046C: + sb.AppendLine(Localization.Device_complies_with_SPC_4_ANSI_INCITS_513_2015); + + break; + case 0x0480: + sb.AppendLine(Localization.Device_complies_with_SMC_3_no_version_claimed); + + break; + case 0x0482: + sb.AppendLine(Localization.Device_complies_with_SMC_3_T10_1730_D_revision_15); + + break; + case 0x0484: + sb.AppendLine(Localization.Device_complies_with_SMC_3_T10_1730_D_revision_16); + + break; + case 0x0486: + sb.AppendLine(Localization.Device_complies_with_SMC_3_ANSI_INCITS_484_2012); + + break; + case 0x04A0: + sb.AppendLine(Localization.Device_complies_with_ADC_2_no_version_claimed); + + break; + case 0x04A7: + sb.AppendLine(Localization.Device_complies_with_ADC_2_T10_1741_D_revision_7); + + break; + case 0x04AA: + sb.AppendLine(Localization.Device_complies_with_ADC_2_T10_1741_D_revision_8); + + break; + case 0x04AC: + sb.AppendLine(Localization.Device_complies_with_ADC_2_ANSI_INCITS_441_2008); + + break; + case 0x04C0: + sb.AppendLine(Localization.Device_complies_with_SBC_3_no_version_claimed); + + break; + case 0x04C3: + sb.AppendLine(Localization.Device_complies_with_SBC_3_T10_BSR_INCITS_514_revision_35); + + break; + case 0x04C5: + sb.AppendLine(Localization.Device_complies_with_SBC_3_T10_BSR_INCITS_514_revision_36); + + break; + case 0x04C8: + sb.AppendLine(Localization.Device_complies_with_SBC_3_ANSI_INCITS_514_2014); + + break; + case 0x04E0: + sb.AppendLine(Localization.Device_complies_with_MMC_6_no_version_claimed); + + break; + case 0x04E3: + sb.AppendLine(Localization.Device_complies_with_MMC_6_T10_1836_D_revision_02b); + + break; + case 0x04E5: + sb.AppendLine(Localization.Device_complies_with_MMC_6_T10_1836_D_revision_02g); + + break; + case 0x04E6: + sb.AppendLine(Localization.Device_complies_with_MMC_6_ANSI_INCITS_468_2010); + + break; + case 0x04E7: + sb.AppendLine(Localization. + Device_complies_with_MMC_6_ANSI_INCITS_468_2010_MMC_6_AM1_ANSI_INCITS_468_2010_AM_1); + + break; + case 0x0500: + sb.AppendLine(Localization.Device_complies_with_ADC_3_no_version_claimed); + + break; + case 0x0502: + sb.AppendLine(Localization.Device_complies_with_ADC_3_T10_1895_D_revision_04); + + break; + case 0x0504: + sb.AppendLine(Localization.Device_complies_with_ADC_3_T10_1895_D_revision_05); + + break; + case 0x0506: + sb.AppendLine(Localization.Device_complies_with_ADC_3_T10_1895_D_revision_05a); + + break; + case 0x050A: + sb.AppendLine(Localization.Device_complies_with_ADC_3_ANSI_INCITS_497_2012); + + break; + case 0x0520: + sb.AppendLine(Localization.Device_complies_with_SSC_4_no_version_claimed); + + break; + case 0x0523: + sb.AppendLine(Localization.Device_complies_with_SSC_4_T10_BSR_INCITS_516_revision_2); + + break; + case 0x0525: + sb.AppendLine(Localization.Device_complies_with_SSC_4_T10_BSR_INCITS_516_revision_3); + + break; + case 0x0527: + sb.AppendLine(Localization.Device_complies_with_SSC_4_ANSI_INCITS_516_2013); + + break; + case 0x0560: + sb.AppendLine(Localization.Device_complies_with_OSD_3_no_version_claimed); + + break; + case 0x0580: + sb.AppendLine(Localization.Device_complies_with_SES_3_no_version_claimed); + + break; + case 0x05A0: + sb.AppendLine(Localization.Device_complies_with_SSC_5_no_version_claimed); + + break; + case 0x05C0: + sb.AppendLine(Localization.Device_complies_with_SPC_5_no_version_claimed); + + break; + case 0x05E0: + sb.AppendLine(Localization.Device_complies_with_SFSC_no_version_claimed); + + break; + case 0x05E3: + sb.AppendLine(Localization.Device_complies_with_SFSC_BSR_INCITS_501_revision_01); + + break; + case 0x0600: + sb.AppendLine(Localization.Device_complies_with_SBC_4_no_version_claimed); + + break; + case 0x0620: + sb.AppendLine(Localization.Device_complies_with_ZBC_no_version_claimed); + + break; + case 0x0622: + sb.AppendLine(Localization.Device_complies_with_ZBC_BSR_INCITS_536_revision_02); + + break; + case 0x0640: + sb.AppendLine(Localization.Device_complies_with_ADC_4_no_version_claimed); + + break; + case 0x0820: + sb.AppendLine(Localization.Device_complies_with_SSA_TL2_no_version_claimed); + + break; + case 0x083B: + sb.AppendLine(Localization.Device_complies_with_SSA_TL2_T10_1_1147_D_revision_05b); + + break; + case 0x083C: + sb.AppendLine(Localization.Device_complies_with_SSA_TL2_ANSI_INCITS_308_1998); + + break; + case 0x0840: + sb.AppendLine(Localization.Device_complies_with_SSA_TL1_no_version_claimed); + + break; + case 0x085B: + sb.AppendLine(Localization.Device_complies_with_SSA_TL1_T10_1_0989_D_revision_10b); + + break; + case 0x085C: + sb.AppendLine(Localization.Device_complies_with_SSA_TL1_ANSI_INCITS_295_1996); + + break; + case 0x0860: + sb.AppendLine(Localization.Device_complies_with_SSA_S3P_no_version_claimed); + + break; + case 0x087B: + sb.AppendLine(Localization.Device_complies_with_SSA_S3P_T10_1_1051_D_revision_05b); + + break; + case 0x087C: + sb.AppendLine(Localization.Device_complies_with_SSA_S3P_ANSI_INCITS_309_1998); + + break; + case 0x0880: + sb.AppendLine(Localization.Device_complies_with_SSA_S2P_no_version_claimed); + + break; + case 0x089B: + sb.AppendLine(Localization.Device_complies_with_SSA_S2P_T10_1_1121_D_revision_07b); + + break; + case 0x089C: + sb.AppendLine(Localization.Device_complies_with_SSA_S2P_ANSI_INCITS_294_1996); + + break; + case 0x08A0: + sb.AppendLine(Localization.Device_complies_with_SIP_no_version_claimed); + + break; + case 0x08BB: + sb.AppendLine(Localization.Device_complies_with_SIP_T10_0856_D_revision_10); + + break; + case 0x08BC: + sb.AppendLine(Localization.Device_complies_with_SIP_ANSI_INCITS_292_1997); + + break; + case 0x08C0: + sb.AppendLine(Localization.Device_complies_with_FCP_no_version_claimed); + + break; + case 0x08DB: + sb.AppendLine(Localization.Device_complies_with_FCP_T10_0993_D_revision_12); + + break; + case 0x08DC: + sb.AppendLine(Localization.Device_complies_with_FCP_ANSI_INCITS_269_1996); + + break; + case 0x08E0: + sb.AppendLine(Localization.Device_complies_with_SBP_2_no_version_claimed); + + break; + case 0x08FB: + sb.AppendLine(Localization.Device_complies_with_SBP_2_T10_1155_D_revision_04); + + break; + case 0x08FC: + sb.AppendLine(Localization.Device_complies_with_SBP_2_ANSI_INCITS_325_1998); + + break; + case 0x0900: + sb.AppendLine(Localization.Device_complies_with_FCP_2_no_version_claimed); + + break; + case 0x0901: + sb.AppendLine(Localization.Device_complies_with_FCP_2_T10_1144_D_revision_4); + + break; + case 0x0915: + sb.AppendLine(Localization.Device_complies_with_FCP_2_T10_1144_D_revision_7); + + break; + case 0x0916: + sb.AppendLine(Localization.Device_complies_with_FCP_2_T10_1144_D_revision_7a); + + break; + case 0x0917: + sb.AppendLine(Localization.Device_complies_with_FCP_2_ANSI_INCITS_350_2003); + + break; + case 0x0918: + sb.AppendLine(Localization.Device_complies_with_FCP_2_T10_1144_D_revision_8); + + break; + case 0x0920: + sb.AppendLine(Localization.Device_complies_with_SST_no_version_claimed); + + break; + case 0x0935: + sb.AppendLine(Localization.Device_complies_with_SST_T10_1380_D_revision_8b); + + break; + case 0x0940: + sb.AppendLine(Localization.Device_complies_with_SRP_no_version_claimed); + + break; + case 0x0954: + sb.AppendLine(Localization.Device_complies_with_SRP_T10_1415_D_revision_10); + + break; + case 0x0955: + sb.AppendLine(Localization.Device_complies_with_SRP_T10_1415_D_revision_16a); + + break; + case 0x095C: + sb.AppendLine(Localization.Device_complies_with_SRP_ANSI_INCITS_365_2002); + + break; + case 0x0960: + sb.AppendLine(Localization.Device_complies_with_iSCSI_no_version_claimed); + + break; + case 0x0961: + case 0x0962: + case 0x0963: + case 0x0964: + case 0x0965: + case 0x0966: + case 0x0967: + case 0x0968: + case 0x0969: + case 0x096A: + case 0x096B: + case 0x096C: + case 0x096D: + case 0x096E: + case 0x096F: + case 0x0970: + case 0x0971: + case 0x0972: + case 0x0973: + case 0x0974: + case 0x0975: + case 0x0976: + case 0x0977: + case 0x0978: + case 0x0979: + case 0x097A: + case 0x097B: + case 0x097C: + case 0x097D: + case 0x097E: + case 0x097F: + sb.AppendFormat(Localization.Device_complies_with_iSCSI_revision_0, VersionDescriptor & 0x1F). + AppendLine(); + + break; + case 0x0980: + sb.AppendLine(Localization.Device_complies_with_SBP_3_no_version_claimed); + + break; + case 0x0982: + sb.AppendLine(Localization.Device_complies_with_SBP_3_T10_1467_D_revision_1f); + + break; + case 0x0994: + sb.AppendLine(Localization.Device_complies_with_SBP_3_T10_1467_D_revision_3); + + break; + case 0x099A: + sb.AppendLine(Localization.Device_complies_with_SBP_3_T10_1467_D_revision_4); + + break; + case 0x099B: + sb.AppendLine(Localization.Device_complies_with_SBP_3_T10_1467_D_revision_5); + + break; + case 0x099C: + sb.AppendLine(Localization.Device_complies_with_SBP_3_ANSI_INCITS_375_2004); + + break; + case 0x09C0: + sb.AppendLine(Localization.Device_complies_with_ADP_no_version_claimed); + + break; + case 0x09E0: + sb.AppendLine(Localization.Device_complies_with_ADT_no_version_claimed); + + break; + case 0x09F9: + sb.AppendLine(Localization.Device_complies_with_ADT_T10_1557_D_revision_11); + + break; + case 0x09FA: + sb.AppendLine(Localization.Device_complies_with_ADT_T10_1557_D_revision_14); + + break; + case 0x09FD: + sb.AppendLine(Localization.Device_complies_with_ADT_ANSI_INCITS_406_2005); + + break; + case 0x0A00: + sb.AppendLine(Localization.Device_complies_with_FCP_3_no_version_claimed); + + break; + case 0x0A07: + sb.AppendLine(Localization.Device_complies_with_FCP_3_T10_1560_D_revision_3f); + + break; + case 0x0A0F: + sb.AppendLine(Localization.Device_complies_with_FCP_3_T10_1560_D_revision_4); + + break; + case 0x0A11: + sb.AppendLine(Localization.Device_complies_with_FCP_3_ANSI_INCITS_416_2006); + + break; + case 0x0A1C: + sb.AppendLine(Localization.Device_complies_with_FCP_3_ISO_IEC_14776_223); + + break; + case 0x0A20: + sb.AppendLine(Localization.Device_complies_with_ADT_2_no_version_claimed); + + break; + case 0x0A22: + sb.AppendLine(Localization.Device_complies_with_ADT_2_T10_1742_D_revision_06); + + break; + case 0x0A27: + sb.AppendLine(Localization.Device_complies_with_ADT_2_T10_1742_D_revision_08); + + break; + case 0x0A28: + sb.AppendLine(Localization.Device_complies_with_ADT_2_T10_1742_D_revision_09); + + break; + case 0x0A2B: + sb.AppendLine(Localization.Device_complies_with_ADT_2_ANSI_INCITS_472_2011); + + break; + case 0x0A40: + sb.AppendLine(Localization.Device_complies_with_FCP_4_no_version_claimed); + + break; + case 0x0A42: + sb.AppendLine(Localization.Device_complies_with_FCP_4_T10_1828_D_revision_01); + + break; + case 0x0A44: + sb.AppendLine(Localization.Device_complies_with_FCP_4_T10_1828_D_revision_02); + + break; + case 0x0A45: + sb.AppendLine(Localization.Device_complies_with_FCP_4_T10_1828_D_revision_02b); + + break; + case 0x0A46: + sb.AppendLine(Localization.Device_complies_with_FCP_4_ANSI_INCITS_481_2012); + + break; + case 0x0A60: + sb.AppendLine(Localization.Device_complies_with_ADT_3_no_version_claimed); + + break; + case 0x0AA0: + sb.AppendLine(Localization.Device_complies_with_SPI_no_version_claimed); + + break; + case 0x0AB9: + sb.AppendLine(Localization.Device_complies_with_SPI_T10_0855_D_revision_15a); + + break; + case 0x0ABA: + sb.AppendLine(Localization.Device_complies_with_SPI_ANSI_INCITS_253_1995); + + break; + case 0x0ABB: + sb.AppendLine(Localization. + Device_complies_with_SPI_T10_0855_D_revision_15a_with_SPI_Amnd_revision_3a); + + break; + case 0x0ABC: + sb.AppendLine(Localization. + Device_complies_with_SPI_ANSI_INCITS_253_1995_with_SPI_Amnd_ANSI_INCITS_253_AM1_1998); + + break; + case 0x0AC0: + sb.AppendLine(Localization.Device_complies_with_Fast_20_no_version_claimed); + + break; + case 0x0ADB: + sb.AppendLine(Localization.Device_complies_with_Fast_20_T10_1071_revision_06); + + break; + case 0x0ADC: + sb.AppendLine(Localization.Device_complies_with_Fast_20_ANSI_INCITS_277_1996); + + break; + case 0x0AE0: + sb.AppendLine(Localization.Device_complies_with_SPI_2_no_version_claimed); + + break; + case 0x0AFB: + sb.AppendLine(Localization.Device_complies_with_SPI_2_T10_1142_D_revision_20b); + + break; + case 0x0AFC: + sb.AppendLine(Localization.Device_complies_with_SPI_2_ANSI_INCITS_302_1999); + + break; + case 0x0B00: + sb.AppendLine(Localization.Device_complies_with_SPI_3_no_version_claimed); + + break; + case 0x0B18: + sb.AppendLine(Localization.Device_complies_with_SPI_3_T10_1302_D_revision_10); + + break; + case 0x0B19: + sb.AppendLine(Localization.Device_complies_with_SPI_3_T10_1302_D_revision_13a); + + break; + case 0x0B1A: + sb.AppendLine(Localization.Device_complies_with_SPI_3_T10_1302_D_revision_14); + + break; + case 0x0B1C: + sb.AppendLine(Localization.Device_complies_with_SPI_3_ANSI_INCITS_336_2000); + + break; + case 0x0B20: + sb.AppendLine(Localization.Device_complies_with_EPI_no_version_claimed); + + break; + case 0x0B3B: + sb.AppendLine(Localization.Device_complies_with_EPI_T10_1134_revision_16); + + break; + case 0x0B3C: + sb.AppendLine(Localization.Device_complies_with_EPI_ANSI_INCITS_TR_23_1999); + + break; + case 0x0B40: + sb.AppendLine(Localization.Device_complies_with_SPI_4_no_version_claimed); + + break; + case 0x0B54: + sb.AppendLine(Localization.Device_complies_with_SPI_4_T10_1365_D_revision_7); + + break; + case 0x0B55: + sb.AppendLine(Localization.Device_complies_with_SPI_4_T10_1365_D_revision_9); + + break; + case 0x0B56: + sb.AppendLine(Localization.Device_complies_with_SPI_4_ANSI_INCITS_362_2002); + + break; + case 0x0B59: + sb.AppendLine(Localization.Device_complies_with_SPI_4_T10_1365_D_revision_10); + + break; + case 0x0B60: + sb.AppendLine(Localization.Device_complies_with_SPI_5_no_version_claimed); + + break; + case 0x0B79: + sb.AppendLine(Localization.Device_complies_with_SPI_5_T10_1525_D_revision_3); + + break; + case 0x0B7A: + sb.AppendLine(Localization.Device_complies_with_SPI_5_T10_1525_D_revision_5); + + break; + case 0x0B7B: + sb.AppendLine(Localization.Device_complies_with_SPI_5_T10_1525_D_revision_6); + + break; + case 0x0B7C: + sb.AppendLine(Localization.Device_complies_with_SPI_5_ANSI_INCITS_367_2003); + + break; + case 0x0BE0: + sb.AppendLine(Localization.Device_complies_with_SAS_no_version_claimed); + + break; + case 0x0BE1: + sb.AppendLine(Localization.Device_complies_with_SAS_T10_1562_D_revision_01); + + break; + case 0x0BF5: + sb.AppendLine(Localization.Device_complies_with_SAS_T10_1562_D_revision_03); + + break; + case 0x0BFA: + sb.AppendLine(Localization.Device_complies_with_SAS_T10_1562_D_revision_04); + + break; + case 0x0BFB: + sb.AppendLine(Localization.Device_complies_with_SAS_T10_1562_D_revision_04); + + break; + case 0x0BFC: + sb.AppendLine(Localization.Device_complies_with_SAS_T10_1562_D_revision_05); + + break; + case 0x0BFD: + sb.AppendLine(Localization.Device_complies_with_SAS_ANSI_INCITS_376_2003); + + break; + case 0x0C00: + sb.AppendLine(Localization.Device_complies_with_SAS_1_1_no_version_claimed); + + break; + case 0x0C07: + sb.AppendLine(Localization.Device_complies_with_SAS_1_1_T10_1601_D_revision_9); + + break; + case 0x0C0F: + sb.AppendLine(Localization.Device_complies_with_SAS_1_1_T10_1601_D_revision_10); + + break; + case 0x0C11: + sb.AppendLine(Localization.Device_complies_with_SAS_1_1_ANSI_INCITS_417_2006); + + break; + case 0x0C12: + sb.AppendLine(Localization.Device_complies_with_SAS_1_1_ISO_IEC_14776_151); + + break; + case 0x0C20: + sb.AppendLine(Localization.Device_complies_with_SAS_2_no_version_claimed); + + break; + case 0x0C23: + sb.AppendLine(Localization.Device_complies_with_SAS_2_T10_1760_D_revision_14); + + break; + case 0x0C27: + sb.AppendLine(Localization.Device_complies_with_SAS_2_T10_1760_D_revision_15); + + break; + case 0x0C28: + sb.AppendLine(Localization.Device_complies_with_SAS_2_T10_1760_D_revision_16); + + break; + case 0x0C2A: + sb.AppendLine(Localization.Device_complies_with_SAS_2_ANSI_INCITS_457_2010); + + break; + case 0x0C40: + sb.AppendLine(Localization.Device_complies_with_SAS_2_1_no_version_claimed); + + break; + case 0x0C48: + sb.AppendLine(Localization.Device_complies_with_SAS_2_1_T10_2125_D_revision_04); + + break; + case 0x0C4A: + sb.AppendLine(Localization.Device_complies_with_SAS_2_1_T10_2125_D_revision_06); + + break; + case 0x0C4B: + sb.AppendLine(Localization.Device_complies_with_SAS_2_1_T10_2125_D_revision_07); + + break; + case 0x0C4E: + sb.AppendLine(Localization.Device_complies_with_SAS_2_1_ANSI_INCITS_478_2011); + + break; + case 0x0C4F: + sb.AppendLine(Localization. + Device_complies_with_SAS_2_1_ANSI_INCITS_478_2011_w__Amnd_1_ANSI_INCITS_478_AM1_2014); + + break; + case 0x0C52: + sb.AppendLine(Localization.Device_complies_with_SAS_2_1_ISO_IEC_14776_153); + + break; + case 0x0C60: + sb.AppendLine(Localization.Device_complies_with_SAS_3_no_version_claimed); + + break; + case 0x0C63: + sb.AppendLine(Localization.Device_complies_with_SAS_3_T10_BSR_INCITS_519_revision_05a); + + break; + case 0x0C65: + sb.AppendLine(Localization.Device_complies_with_SAS_3_T10_BSR_INCITS_519_revision_06); + + break; + case 0x0C68: + sb.AppendLine(Localization.Device_complies_with_SAS_3_ANSI_INCITS_519_2014); + + break; + case 0x0C80: + sb.AppendLine(Localization.Device_complies_with_SAS_4_no_version_claimed); + + break; + case 0x0D20: + sb.AppendLine(Localization.Device_complies_with_FC_PH_no_version_claimed); + + break; + case 0x0D3B: + sb.AppendLine(Localization.Device_complies_with_FC_PH_ANSI_INCITS_230_1994); + + break; + case 0x0D3C: + sb.AppendLine(Localization. + Device_complies_with_FC_PH_ANSI_INCITS_230_1994_with_Amnd_1_ANSI_INCITS_230_AM1_1996); + + break; + case 0x0D40: + sb.AppendLine(Localization.Device_complies_with_FC_AL_no_version_claimed); + + break; + case 0x0D5C: + sb.AppendLine(Localization.Device_complies_with_FC_AL_ANSI_INCITS_272_1996); + + break; + case 0x0D60: + sb.AppendLine(Localization.Device_complies_with_FC_AL_2_no_version_claimed); + + break; + case 0x0D61: + sb.AppendLine(Localization.Device_complies_with_FC_AL_2_T11_1133_D_revision_7_0); + + break; + case 0x0D63: + sb.AppendLine(Localization. + Device_complies_with_FC_AL_2_ANSI_INCITS_332_1999_with_AM1_2003___AM2_2006); + + break; + case 0x0D64: + sb.AppendLine(Localization. + Device_complies_with_FC_AL_2_ANSI_INCITS_332_1999_with_Amnd_2_AM2_2006); + + break; + case 0x0D65: + sb.AppendLine(Localization.Device_complies_with_FC_AL_2_ISO_IEC_14165_122_with_AM1___AM2); + + break; + case 0x0D7C: + sb.AppendLine(Localization.Device_complies_with_FC_AL_2_ANSI_INCITS_332_1999); + + break; + case 0x0D7D: + sb.AppendLine(Localization. + Device_complies_with_FC_AL_2_ANSI_INCITS_332_1999_with_Amnd_1_AM1_2003); + + break; + case 0x0D80: + sb.AppendLine(Localization.Device_complies_with_FC_PH_3_no_version_claimed); + + break; + case 0x0D9C: + sb.AppendLine(Localization.Device_complies_with_FC_PH_3_ANSI_INCITS_303_1998); + + break; + case 0x0DA0: + sb.AppendLine(Localization.Device_complies_with_FC_FS_no_version_claimed); + + break; + case 0x0DB7: + sb.AppendLine(Localization.Device_complies_with_FC_FS_T11_1331_D_revision_1_2); + + break; + case 0x0DB8: + sb.AppendLine(Localization.Device_complies_with_FC_FS_T11_1331_D_revision_1_7); + + break; + case 0x0DBC: + sb.AppendLine(Localization.Device_complies_with_FC_FS_ANSI_INCITS_373_2003); + + break; + case 0x0DBD: + sb.AppendLine(Localization.Device_complies_with_FC_FS_ISO_IEC_14165_251); + + break; + case 0x0DC0: + sb.AppendLine(Localization.Device_complies_with_FC_PI_no_version_claimed); + + break; + case 0x0DDC: + sb.AppendLine(Localization.Device_complies_with_FC_PI_ANSI_INCITS_352_2002); + + break; + case 0x0DE0: + sb.AppendLine(Localization.Device_complies_with_FC_PI_2_no_version_claimed); + + break; + case 0x0DE2: + sb.AppendLine(Localization.Device_complies_with_FC_PI_2_T11_1506_D_revision_5_0); + + break; + case 0x0DE4: + sb.AppendLine(Localization.Device_complies_with_FC_PI_2_ANSI_INCITS_404_2006); + + break; + case 0x0E00: + sb.AppendLine(Localization.Device_complies_with_FC_FS_2_no_version_claimed); + + break; + case 0x0E02: + sb.AppendLine(Localization.Device_complies_with_FC_FS_2_ANSI_INCITS_242_2007); + + break; + case 0x0E03: + sb.AppendLine(Localization. + Device_complies_with_FC_FS_2_ANSI_INCITS_242_2007_with_AM1_ANSI_INCITS_242_AM1_2007); + + break; + case 0x0E20: + sb.AppendLine(Localization.Device_complies_with_FC_LS_no_version_claimed); + + break; + case 0x0E21: + sb.AppendLine(Localization.Device_complies_with_FC_LS_T11_1620_D_revision_1_62); + + break; + case 0x0E29: + sb.AppendLine(Localization.Device_complies_with_FC_LS_ANSI_INCITS_433_2007); + + break; + case 0x0E40: + sb.AppendLine(Localization.Device_complies_with_FC_SP_no_version_claimed); + + break; + case 0x0E42: + sb.AppendLine(Localization.Device_complies_with_FC_SP_T11_1570_D_revision_1_6); + + break; + case 0x0E45: + sb.AppendLine(Localization.Device_complies_with_FC_SP_ANSI_INCITS_426_2007); + + break; + case 0x0E60: + sb.AppendLine(Localization.Device_complies_with_FC_PI_3_no_version_claimed); + + break; + case 0x0E62: + sb.AppendLine(Localization.Device_complies_with_FC_PI_3_T11_1625_D_revision_2_0); + + break; + case 0x0E68: + sb.AppendLine(Localization.Device_complies_with_FC_PI_3_T11_1625_D_revision_2_1); + + break; + case 0x0E6A: + sb.AppendLine(Localization.Device_complies_with_FC_PI_3_T11_1625_D_revision_4_0); + + break; + case 0x0E6E: + sb.AppendLine(Localization.Device_complies_with_FC_PI_3_ANSI_INCITS_460_2011); + + break; + case 0x0E80: + sb.AppendLine(Localization.Device_complies_with_FC_PI_4_no_version_claimed); + + break; + case 0x0E82: + sb.AppendLine(Localization.Device_complies_with_FC_PI_4_T11_1647_D_revision_8_0); + + break; + case 0x0E88: + sb.AppendLine(Localization.Device_complies_with_FC_PI_4_ANSI_INCITS_450_2009); + + break; + case 0x0EA0: + sb.AppendLine(Localization.Device_complies_with_FC_10GFC_no_version_claimed); + + break; + case 0x0EA2: + sb.AppendLine(Localization.Device_complies_with_FC_10GFC_ANSI_INCITS_364_2003); + + break; + case 0x0EA3: + sb.AppendLine(Localization.Device_complies_with_FC_10GFC_ISO_IEC_14165_116); + + break; + case 0x0EA5: + sb.AppendLine(Localization.Device_complies_with_FC_10GFC_ISO_IEC_14165_116_with_AM1); + + break; + case 0x0EA6: + sb.AppendLine(Localization. + Device_complies_with_FC_10GFC_ANSI_INCITS_364_2003_with_AM1_ANSI_INCITS_364_AM1_2007); + + break; + case 0x0EC0: + sb.AppendLine(Localization.Device_complies_with_FC_SP_2_no_version_claimed); + + break; + case 0x0EE0: + sb.AppendLine(Localization.Device_complies_with_FC_FS_3_no_version_claimed); + + break; + case 0x0EE2: + sb.AppendLine(Localization.Device_complies_with_FC_FS_3_T11_1861_D_revision_0_9); + + break; + case 0x0EE7: + sb.AppendLine(Localization.Device_complies_with_FC_FS_3_T11_1861_D_revision_1_0); + + break; + case 0x0EE9: + sb.AppendLine(Localization.Device_complies_with_FC_FS_3_T11_1861_D_revision_1_10); + + break; + case 0x0EEB: + sb.AppendLine(Localization.Device_complies_with_FC_FS_3_ANSI_INCITS_470_2011); + + break; + case 0x0F00: + sb.AppendLine(Localization.Device_complies_with_FC_LS_2_no_version_claimed); + + break; + case 0x0F03: + sb.AppendLine(Localization.Device_complies_with_FC_LS_2_T11_2103_D_revision_2_11); + + break; + case 0x0F05: + sb.AppendLine(Localization.Device_complies_with_FC_LS_2_T11_2103_D_revision_2_21); + + break; + case 0x0F07: + sb.AppendLine(Localization.Device_complies_with_FC_LS_2_ANSI_INCITS_477_2011); + + break; + case 0x0F20: + sb.AppendLine(Localization.Device_complies_with_FC_PI_5_no_version_claimed); + + break; + case 0x0F27: + sb.AppendLine(Localization.Device_complies_with_FC_PI_5_T11_2118_D_revision_2_00); + + break; + case 0x0F28: + sb.AppendLine(Localization.Device_complies_with_FC_PI_5_T11_2118_D_revision_3_00); + + break; + case 0x0F2A: + sb.AppendLine(Localization.Device_complies_with_FC_PI_5_T11_2118_D_revision_6_00); + + break; + case 0x0F2B: + sb.AppendLine(Localization.Device_complies_with_FC_PI_5_T11_2118_D_revision_6_10); + + break; + case 0x0F2E: + sb.AppendLine(Localization.Device_complies_with_FC_PI_5_ANSI_INCITS_479_2011); + + break; + case 0x0F40: + sb.AppendLine(Localization.Device_complies_with_FC_PI_6_no_version_claimed); + + break; + case 0x0F60: + sb.AppendLine(Localization.Device_complies_with_FC_FS_4_no_version_claimed); + + break; + case 0x0F80: + sb.AppendLine(Localization.Device_complies_with_FC_LS_3_no_version_claimed); + + break; + case 0x12A0: + sb.AppendLine(Localization.Device_complies_with_FC_SCM_no_version_claimed); + + break; + case 0x12A3: + sb.AppendLine(Localization.Device_complies_with_FC_SCM_T11_1824DT_revision_1_0); + + break; + case 0x12A5: + sb.AppendLine(Localization.Device_complies_with_FC_SCM_T11_1824DT_revision_1_1); + + break; + case 0x12A7: + sb.AppendLine(Localization.Device_complies_with_FC_SCM_T11_1824DT_revision_1_4); + + break; + case 0x12AA: + sb.AppendLine(Localization.Device_complies_with_FC_SCM_INCITS_TR_47_2012); + + break; + case 0x12C0: + sb.AppendLine(Localization.Device_complies_with_FC_DA_2_no_version_claimed); + + break; + case 0x12C3: + sb.AppendLine(Localization.Device_complies_with_FC_DA_2_T11_1870DT_revision_1_04); + + break; + case 0x12C5: + sb.AppendLine(Localization.Device_complies_with_FC_DA_2_T11_1870DT_revision_1_06); + + break; + case 0x12C9: + sb.AppendLine(Localization.Device_complies_with_FC_DA_2_INCITS_TR_49_2012); + + break; + case 0x12E0: + sb.AppendLine(Localization.Device_complies_with_FC_DA_no_version_claimed); + + break; + case 0x12E2: + sb.AppendLine(Localization.Device_complies_with_FC_DA_T11_1513_DT_revision_3_1); + + break; + case 0x12E8: + sb.AppendLine(Localization.Device_complies_with_FC_DA_ANSI_INCITS_TR_36_2004); + + break; + case 0x12E9: + sb.AppendLine(Localization.Device_complies_with_FC_DA_ISO_IEC_14165_341); + + break; + case 0x1300: + sb.AppendLine(Localization.Device_complies_with_FC_Tape_no_version_claimed); + + break; + case 0x1301: + sb.AppendLine(Localization.Device_complies_with_FC_Tape_T11_1315_revision_1_16); + + break; + case 0x131B: + sb.AppendLine(Localization.Device_complies_with_FC_Tape_T11_1315_revision_1_17); + + break; + case 0x131C: + sb.AppendLine(Localization.Device_complies_with_FC_Tape_ANSI_INCITS_TR_24_1999); + + break; + case 0x1320: + sb.AppendLine(Localization.Device_complies_with_FC_FLA_no_version_claimed); + + break; + case 0x133B: + sb.AppendLine(Localization.Device_complies_with_FC_FLA_T11_1235_revision_7); + + break; + case 0x133C: + sb.AppendLine(Localization.Device_complies_with_FC_FLA_ANSI_INCITS_TR_20_1998); + + break; + case 0x1340: + sb.AppendLine(Localization.Device_complies_with_FC_PLDA_no_version_claimed); + + break; + case 0x135B: + sb.AppendLine(Localization.Device_complies_with_FC_PLDA_T11_1162_revision_2_1); + + break; + case 0x135C: + sb.AppendLine(Localization.Device_complies_with_FC_PLDA_ANSI_INCITS_TR_19_1998); + + break; + case 0x1360: + sb.AppendLine(Localization.Device_complies_with_SSA_PH2_no_version_claimed); + + break; + case 0x137B: + sb.AppendLine(Localization.Device_complies_with_SSA_PH2_T10_1_1145_D_revision_09c); + + break; + case 0x137C: + sb.AppendLine(Localization.Device_complies_with_SSA_PH2_ANSI_INCITS_293_1996); + + break; + case 0x1380: + sb.AppendLine(Localization.Device_complies_with_SSA_PH3_no_version_claimed); + + break; + case 0x139B: + sb.AppendLine(Localization.Device_complies_with_SSA_PH3_T10_1_1146_D_revision_05b); + + break; + case 0x139C: + sb.AppendLine(Localization.Device_complies_with_SSA_PH3_ANSI_INCITS_307_1998); + + break; + case 0x14A0: + sb.AppendLine(Localization.Device_complies_with_IEEE_1394_no_version_claimed); + + break; + case 0x14BD: + sb.AppendLine(Localization.Device_complies_with_ANSI_IEEE_1394_1995); + + break; + case 0x14C0: + sb.AppendLine(Localization.Device_complies_with_IEEE_1394a_no_version_claimed); + + break; + case 0x14E0: + sb.AppendLine(Localization.Device_complies_with_IEEE_1394b_no_version_claimed); + + break; + case 0x15E0: + sb.AppendLine(Localization.Device_complies_with_ATA_ATAPI_6_no_version_claimed); + + break; + case 0x15FD: + sb.AppendLine(Localization.Device_complies_with_ATA_ATAPI_6_ANSI_INCITS_361_2002); + + break; + case 0x1600: + sb.AppendLine(Localization.Device_complies_with_ATA_ATAPI_7_no_version_claimed); + + break; + case 0x1602: + sb.AppendLine(Localization.Device_complies_with_ATA_ATAPI_7_T13_1532_D_revision_3); + + break; + case 0x161C: + sb.AppendLine(Localization.Device_complies_with_ATA_ATAPI_7_ANSI_INCITS_397_2005); + + break; + case 0x161E: + sb.AppendLine(Localization.Device_complies_with_ATA_ATAPI_7_ISO_IEC_24739); + + break; + case 0x1620: + sb.AppendLine(Localization.Device_complies_with_ATA_ATAPI_8_ATA8_AAM_no_version_claimed); + + break; + case 0x1621: + sb.AppendLine(Localization. + Device_complies_with_ATA_ATAPI_8_ATA8_APT_Parallel_Transport_no_version_claimed); + + break; + case 0x1622: + sb.AppendLine(Localization. + Device_complies_with_ATA_ATAPI_8_ATA8_AST_Serial_Transport_no_version_claimed); + + break; + case 0x1623: + sb.AppendLine(Localization. + Device_complies_with_ATA_ATAPI_8_ATA8_ACS_ATA_ATAPI_Command_Set_no_version_claimed); + + break; + case 0x1628: + sb.AppendLine(Localization.Device_complies_with_ATA_ATAPI_8_ATA8_AAM_ANSI_INCITS_451_2008); + + break; + case 0x162A: + sb.AppendLine(Localization. + Device_complies_with_ATA_ATAPI_8_ATA8_ACS_ANSI_INCITS_452_2009_w__Amendment_1); + + break; + case 0x1728: + sb.AppendLine(Localization. + Device_complies_with_Universal_Serial_Bus_Specification__Revision_1_1); + + break; + case 0x1729: + sb.AppendLine(Localization. + Device_complies_with_Universal_Serial_Bus_Specification__Revision_2_0); + + break; + case 0x1730: + sb.AppendLine(Localization. + Device_complies_with_USB_Mass_Storage_Class_Bulk_Only_Transport__Revision_1_0); + + break; + case 0x1740: + sb.AppendLine(Localization.Device_complies_with_UAS_no_version_claimed); + + break; + case 0x1743: + sb.AppendLine(Localization.Device_complies_with_UAS_T10_2095_D_revision_02); + + break; + case 0x1747: + sb.AppendLine(Localization.Device_complies_with_UAS_T10_2095_D_revision_04); + + break; + case 0x1748: + sb.AppendLine(Localization.Device_complies_with_UAS_ANSI_INCITS_471_2010); + + break; + case 0x1749: + sb.AppendLine(Localization.Device_complies_with_UAS_ISO_IEC_14776_251_2014); + + break; + case 0x1761: + sb.AppendLine(Localization.Device_complies_with_ACS_2_no_version_claimed); + + break; + case 0x1762: + sb.AppendLine(Localization.Device_complies_with_ACS_2_ANSI_INCITS_482_2013); + + break; + case 0x1765: + sb.AppendLine(Localization.Device_complies_with_ACS_3_no_version_claimed); + + break; + case 0x1780: + sb.AppendLine(Localization.Device_complies_with_UAS_2_no_version_claimed); + + break; + case 0x1EA0: + sb.AppendLine(Localization.Device_complies_with_SAT_no_version_claimed); + + break; + case 0x1EA7: + sb.AppendLine(Localization.Device_complies_with_SAT_T10_1711_D_revision_8); + + break; + case 0x1EAB: + sb.AppendLine(Localization.Device_complies_with_SAT_T10_1711_D_revision_9); + + break; + case 0x1EAD: + sb.AppendLine(Localization.Device_complies_with_SAT_ANSI_INCITS_431_2007); + + break; + case 0x1EC0: + sb.AppendLine(Localization.Device_complies_with_SAT_2_no_version_claimed); + + break; + case 0x1EC4: + sb.AppendLine(Localization.Device_complies_with_SAT_2_T10_1826_D_revision_06); + + break; + case 0x1EC8: + sb.AppendLine(Localization.Device_complies_with_SAT_2_T10_1826_D_revision_09); + + break; + case 0x1ECA: + sb.AppendLine(Localization.Device_complies_with_SAT_2_ANSI_INCITS_465_2010); + + break; + case 0x1EE0: + sb.AppendLine(Localization.Device_complies_with_SAT_3_no_version_claimed); + + break; + case 0x1EE2: + sb.AppendLine(Localization.Device_complies_with_SAT_3_T10_BSR_INCITS_517_revision_4); + + break; + case 0x1EE4: + sb.AppendLine(Localization.Device_complies_with_SAT_3_T10_BSR_INCITS_517_revision_7); + + break; + case 0x1EE8: + sb.AppendLine(Localization.Device_complies_with_SAT_3_ANSI_INCITS_517_2015); + + break; + case 0x1F00: + sb.AppendLine(Localization.Device_complies_with_SAT_4_no_version_claimed); + + break; + case 0x20A0: + sb.AppendLine(Localization.Device_complies_with_SPL_no_version_claimed); + + break; + case 0x20A3: + sb.AppendLine(Localization.Device_complies_with_SPL_T10_2124_D_revision_6a); + + break; + case 0x20A5: + sb.AppendLine(Localization.Device_complies_with_SPL_T10_2124_D_revision_7); + + break; + case 0x20A7: + sb.AppendLine(Localization.Device_complies_with_SPL_ANSI_INCITS_476_2011); + + break; + case 0x20A8: + sb.AppendLine(Localization. + Device_complies_with_SPL_ANSI_INCITS_476_2011_SPL_AM1_INCITS_476_AM1_2012); + + break; + case 0x20AA: + sb.AppendLine(Localization.Device_complies_with_SPL_ISO_IEC_14776_261_2012); + + break; + case 0x20C0: + sb.AppendLine(Localization.Device_complies_with_SPL_2_no_version_claimed); + + break; + case 0x20C2: + sb.AppendLine(Localization.Device_complies_with_SPL_2_T10_BSR_INCITS_505_revision_4); + + break; + case 0x20C4: + sb.AppendLine(Localization.Device_complies_with_SPL_2_T10_BSR_INCITS_505_revision_5); + + break; + case 0x20C8: + sb.AppendLine(Localization.Device_complies_with_SPL_2_ANSI_INCITS_505_2013); + + break; + case 0x20E0: + sb.AppendLine(Localization.Device_complies_with_SPL_3_no_version_claimed); + + break; + case 0x20E4: + sb.AppendLine(Localization.Device_complies_with_SPL_3_T10_BSR_INCITS_492_revision_6); + + break; + case 0x20E6: + sb.AppendLine(Localization.Device_complies_with_SPL_3_T10_BSR_INCITS_492_revision_7); + + break; + case 0x20E8: + sb.AppendLine(Localization.Device_complies_with_SPL_3_ANSI_INCITS_492_2015); + + break; + case 0x2100: + sb.AppendLine(Localization.Device_complies_with_SPL_4_no_version_claimed); + + break; + case 0x21E0: + sb.AppendLine(Localization.Device_complies_with_SOP_no_version_claimed); + + break; + case 0x21E4: + sb.AppendLine(Localization.Device_complies_with_SOP_T10_BSR_INCITS_489_revision_4); + + break; + case 0x21E6: + sb.AppendLine(Localization.Device_complies_with_SOP_T10_BSR_INCITS_489_revision_5); + + break; + case 0x21E8: + sb.AppendLine(Localization.Device_complies_with_SOP_ANSI_INCITS_489_2014); + + break; + case 0x2200: + sb.AppendLine(Localization.Device_complies_with_PQI_no_version_claimed); + + break; + case 0x2204: + sb.AppendLine(Localization.Device_complies_with_PQI_T10_BSR_INCITS_490_revision_6); + + break; + case 0x2206: + sb.AppendLine(Localization.Device_complies_with_PQI_T10_BSR_INCITS_490_revision_7); + + break; + case 0x2208: + sb.AppendLine(Localization.Device_complies_with_PQI_ANSI_INCITS_490_2014); + + break; + case 0x2220: + sb.AppendLine(Localization.Device_complies_with_SOP_2_no_version_claimed); + + break; + case 0x2240: + sb.AppendLine(Localization.Device_complies_with_PQI_2_no_version_claimed); + + break; + case 0xFFC0: + sb.AppendLine(Localization.Device_complies_with_IEEE_1667_no_version_claimed); + + break; + case 0xFFC1: + sb.AppendLine(Localization.Device_complies_with_IEEE_1667_2006); + + break; + case 0xFFC2: + sb.AppendLine(Localization.Device_complies_with_IEEE_1667_2009); + + break; + default: + sb.AppendFormat(Localization.Device_complies_with_unknown_standard_code_0, VersionDescriptor). + AppendLine(); + + break; + } + } + } + + #region Quantum vendor prettifying + + if(response.QuantumPresent && + StringHandlers.CToString(response.VendorIdentification).ToLowerInvariant().Trim() == "quantum") + { + sb.AppendLine(Localization.Quantum_vendor_specific_information); + + switch(response.Qt_ProductFamily) + { + case 0: + sb.AppendLine(Localization.Product_family_is_not_specified); + + break; + case 1: + sb.AppendLine(Localization.Product_family_is_2_6_GB); + + break; + case 2: + sb.AppendLine(Localization.Product_family_is_6_0_GB); + + break; + case 3: + sb.AppendLine(Localization.Product_family_is_10_0_20_0_GB); + + break; + case 5: + sb.AppendLine(Localization.Product_family_is_20_0_40_0_GB); + + break; + case 6: + sb.AppendLine(Localization.Product_family_is_15_0_30_0_GB); + + break; + default: + sb.AppendFormat(Localization.Product_family_0, response.Qt_ProductFamily).AppendLine(); + + break; + } + + sb.AppendFormat(Localization.Release_firmware_0, response.Qt_ReleasedFirmware).AppendLine(); + + sb.AppendFormat(Localization.Firmware_version_0_1, response.Qt_FirmwareMajorVersion, + response.Qt_FirmwareMinorVersion). + AppendLine(); + + sb.AppendFormat(Localization.EEPROM_format_version_0_1, response.Qt_EEPROMFormatMajorVersion, + response.Qt_EEPROMFormatMinorVersion). + AppendLine(); + + sb.AppendFormat(Localization.Firmware_personality_0, response.Qt_FirmwarePersonality).AppendLine(); + sb.AppendFormat(Localization.Firmware_sub_personality_0, response.Qt_FirmwareSubPersonality).AppendLine(); + + sb.AppendFormat(Localization.Tape_directory_format_version_0, response.Qt_TapeDirectoryFormatVersion). + AppendLine(); + + sb.AppendFormat(Localization.Controller_hardware_version_0, response.Qt_ControllerHardwareVersion). + AppendLine(); + + sb.AppendFormat(Localization.Drive_EEPROM_version_0, response.Qt_DriveEEPROMVersion).AppendLine(); + sb.AppendFormat(Localization.Drive_hardware_version_0, response.Qt_DriveHardwareVersion).AppendLine(); + + sb.AppendFormat(Localization.Media_loader_firmware_version_0, response.Qt_MediaLoaderFirmwareVersion). + AppendLine(); + + sb.AppendFormat(Localization.Media_loader_hardware_version_0, response.Qt_MediaLoaderHardwareVersion). + AppendLine(); + + sb.AppendFormat(Localization.Media_loader_mechanical_version_0, response.Qt_MediaLoaderMechanicalVersion). + AppendLine(); + + if(response.Qt_LibraryPresent) + sb.AppendLine(Localization.Library_is_present); + + if(response.Qt_MediaLoaderPresent) + sb.AppendLine(Localization.Media_loader_is_present); + + sb.AppendFormat(Localization.Module_revision_0, StringHandlers.CToString(response.Qt_ModuleRevision)). + AppendLine(); + } + + #endregion Quantum vendor prettifying + + #region IBM vendor prettifying + + if(response.IBMPresent && + StringHandlers.CToString(response.VendorIdentification).ToLowerInvariant().Trim() == "ibm") + { + sb.AppendLine(Localization.IBM_vendor_specific_information); + + if(response.IBM_PerformanceLimit == 0) + sb.AppendLine(Localization.Performance_is_not_limited); + else + sb.AppendFormat(Localization.Performance_is_limited_using_factor_0, response.IBM_PerformanceLimit); + + if(response.IBM_AutDis) + sb.AppendLine(Localization.Automation_is_disabled); + + sb.AppendFormat(Localization.IBM_OEM_Specific_Field_0, response.IBM_OEMSpecific).AppendLine(); + } + + #endregion IBM vendor prettifying + + #region HP vendor prettifying + + if(response.HPPresent && + StringHandlers.CToString(response.VendorIdentification).ToLowerInvariant().Trim() == "hp") + { + sb.AppendLine(Localization.HP_vendor_specific_information); + + if(response.HP_WORM) + sb.AppendFormat(Localization.Device_supports_WORM_version_0, response.HP_WORMVersion).AppendLine(); + + byte[] OBDRSign = "$DR-10"u8.ToArray(); + + if(OBDRSign.SequenceEqual(response.HP_OBDR)) + sb.AppendLine(Localization.Device_supports_Tape_Disaster_Recovery); + } + + #endregion HP vendor prettifying + + #region Seagate vendor prettifying + + if((response.SeagatePresent || response.Seagate2Present || response.Seagate3Present) && + StringHandlers.CToString(response.VendorIdentification).ToLowerInvariant().Trim() == "seagate") + { + sb.AppendLine(Localization.Seagate_vendor_specific_information); + + if(response.SeagatePresent) + { + sb.AppendFormat(Core.Drive_serial_number_0, + StringHandlers.CToString(response.Seagate_DriveSerialNumber)). + AppendLine(); + } + + if(response.Seagate2Present) + { + sb.AppendFormat(Localization.Drive_copyright_0, StringHandlers.CToString(response.Seagate_Copyright)). + AppendLine(); + } + + if(response.Seagate3Present) + { + sb.AppendFormat(Localization.Drive_servo_part_number_0, + PrintHex.ByteArrayToHexArrayString(response.Seagate_ServoPROMPartNo, 40)). + AppendLine(); + } + } + + #endregion Seagate vendor prettifying + + #region Kreon vendor prettifying + + if(response.KreonPresent) + { + sb.AppendFormat(Localization.Drive_is_flashed_with_Kreon_firmware_0, + StringHandlers.CToString(response.KreonVersion)). + AppendLine(); + } + + #endregion Kreon vendor prettifying + + #if DEBUG + if(response.DeviceTypeModifier != 0) + sb.AppendFormat(Localization.Vendor_device_type_modifier_0, response.DeviceTypeModifier).AppendLine(); + + if(response.Reserved2 != 0) + sb.AppendFormat(Localization.Reserved_byte_five_bits_two_to_one_0, response.Reserved2).AppendLine(); + + if(response.Reserved3 != 0) + sb.AppendFormat(Localization.Reserved_byte_56_bits_seven_to_four_0, response.Reserved3).AppendLine(); + + if(response.Reserved4 != 0) + sb.AppendFormat(Localization.Reserved_byte_57, response.Reserved4).AppendLine(); + + if(response.Reserved5 != null) + { + sb.AppendLine(Localization.Reserved_bytes_74_to_95); + sb.AppendLine("============================================================"); + sb.AppendLine(PrintHex.ByteArrayToHexArrayString(response.Reserved5, 60)); + sb.AppendLine("============================================================"); + } + + if(response is { VendorSpecific: not null, IsHiMD: true }) + { + if(response.KreonPresent) + { + var vendor = new byte[7]; + Array.Copy(response.VendorSpecific, 11, vendor, 0, 7); + sb.AppendLine(Localization.Vendor_specific_bytes_47_to_55); + sb.AppendLine("============================================================"); + sb.AppendLine(PrintHex.ByteArrayToHexArrayString(vendor, 60)); + sb.AppendLine("============================================================"); + } + else + { + sb.AppendLine(Localization.Vendor_specific_bytes_36_to_55); + sb.AppendLine("============================================================"); + sb.AppendLine(PrintHex.ByteArrayToHexArrayString(response.VendorSpecific, 60)); + sb.AppendLine("============================================================"); + } + } + + if(response.IsHiMD) + { + sb.AppendLine(Localization.Hi_MD_device_); + + if(response.HiMDSpecific != null) + { + sb.AppendLine(Localization.Hi_MD_specific_bytes_44_to_55); + sb.AppendLine("============================================================"); + sb.AppendLine(PrintHex.ByteArrayToHexArrayString(response.HiMDSpecific, 60)); + sb.AppendLine("============================================================"); + } + } + + if(response.VendorSpecific2 == null) + return sb.ToString(); + + sb.AppendFormat(Localization.Vendor_specific_bytes_96_to_0, response.AdditionalLength + 4).AppendLine(); + sb.AppendLine("============================================================"); + sb.AppendLine(PrintHex.ByteArrayToHexArrayString(response.VendorSpecific2, 60)); + sb.AppendLine("============================================================"); + #endif + + return sb.ToString(); + } + + public static string Prettify(byte[] SCSIInquiryResponse) + { + CommonTypes.Structs.Devices.SCSI.Inquiry? decoded = + CommonTypes.Structs.Devices.SCSI.Inquiry.Decode(SCSIInquiryResponse); + + return Prettify(decoded); + } +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/MMC/AACS.cs b/Aaru.Decoders/SCSI/MMC/AACS.cs new file mode 100644 index 000000000..ee89d3e1e --- /dev/null +++ b/Aaru.Decoders/SCSI/MMC/AACS.cs @@ -0,0 +1,470 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : AACS.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes AACS structures. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Text; +using Aaru.Helpers; + +namespace Aaru.Decoders.SCSI.MMC; + +// Information from the following standards: +// ANSI X3.304-1997 +// T10/1048-D revision 9.0 +// T10/1048-D revision 10a +// T10/1228-D revision 7.0c +// T10/1228-D revision 11a +// T10/1363-D revision 10g +// T10/1545-D revision 1d +// T10/1545-D revision 5 +// T10/1545-D revision 5a +// T10/1675-D revision 2c +// T10/1675-D revision 4 +// T10/1836-D revision 2g +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +[SuppressMessage("ReSharper", "UnusedType.Global")] +public static class AACS +{ + public static AACSVolumeIdentifier? DecodeAACSVolumeIdentifier(byte[] AACSVIResponse) + { + if(AACSVIResponse == null) + return null; + + var decoded = new AACSVolumeIdentifier + { + VolumeIdentifier = new byte[AACSVIResponse.Length - 4], + DataLength = BigEndianBitConverter.ToUInt16(AACSVIResponse, 0), + Reserved1 = AACSVIResponse[2], + Reserved2 = AACSVIResponse[3] + }; + + Array.Copy(AACSVIResponse, 4, decoded.VolumeIdentifier, 0, AACSVIResponse.Length - 4); + + return decoded; + } + + public static string PrettifyAACSVolumeIdentifier(AACSVolumeIdentifier? AACSVIResponse) + { + if(AACSVIResponse == null) + return null; + + AACSVolumeIdentifier response = AACSVIResponse.Value; + + var sb = new StringBuilder(); + + #if DEBUG + if(response.Reserved1 != 0) + sb.AppendFormat(Localization.Reserved1_equals_0_X8, response.Reserved1).AppendLine(); + + if(response.Reserved2 != 0) + sb.AppendFormat(Localization.Reserved2_equals_0_X8, response.Reserved2).AppendLine(); + #endif + sb.AppendFormat(Localization.AACS_Volume_Identifier_in_hex_follows); + sb.AppendLine(PrintHex.ByteArrayToHexArrayString(response.VolumeIdentifier, 80)); + + return sb.ToString(); + } + + public static string PrettifyAACSVolumeIdentifier(byte[] AACSVIResponse) + { + AACSVolumeIdentifier? decoded = DecodeAACSVolumeIdentifier(AACSVIResponse); + + return PrettifyAACSVolumeIdentifier(decoded); + } + + public static AACSMediaSerialNumber? DecodeAACSMediaSerialNumber(byte[] AACSMSNResponse) + { + if(AACSMSNResponse == null) + return null; + + var decoded = new AACSMediaSerialNumber + { + MediaSerialNumber = new byte[AACSMSNResponse.Length - 4], + DataLength = BigEndianBitConverter.ToUInt16(AACSMSNResponse, 0), + Reserved1 = AACSMSNResponse[2], + Reserved2 = AACSMSNResponse[3] + }; + + Array.Copy(AACSMSNResponse, 4, decoded.MediaSerialNumber, 0, AACSMSNResponse.Length - 4); + + return decoded; + } + + public static string PrettifyAACSMediaSerialNumber(AACSMediaSerialNumber? AACSMSNResponse) + { + if(AACSMSNResponse == null) + return null; + + AACSMediaSerialNumber response = AACSMSNResponse.Value; + + var sb = new StringBuilder(); + + #if DEBUG + if(response.Reserved1 != 0) + sb.AppendFormat(Localization.Reserved1_equals_0_X8, response.Reserved1).AppendLine(); + + if(response.Reserved2 != 0) + sb.AppendFormat(Localization.Reserved2_equals_0_X8, response.Reserved2).AppendLine(); + #endif + sb.AppendFormat(Localization.AACS_Media_Serial_Number_in_hex_follows); + sb.AppendLine(PrintHex.ByteArrayToHexArrayString(response.MediaSerialNumber, 80)); + + return sb.ToString(); + } + + public static string PrettifyAACSMediaSerialNumber(byte[] AACSMSNResponse) + { + AACSMediaSerialNumber? decoded = DecodeAACSMediaSerialNumber(AACSMSNResponse); + + return PrettifyAACSMediaSerialNumber(decoded); + } + + public static AACSMediaIdentifier? DecodeAACSMediaIdentifier(byte[] AACSMIResponse) + { + if(AACSMIResponse == null) + return null; + + var decoded = new AACSMediaIdentifier + { + MediaIdentifier = new byte[AACSMIResponse.Length - 4], + DataLength = BigEndianBitConverter.ToUInt16(AACSMIResponse, 0), + Reserved1 = AACSMIResponse[2], + Reserved2 = AACSMIResponse[3] + }; + + Array.Copy(AACSMIResponse, 4, decoded.MediaIdentifier, 0, AACSMIResponse.Length - 4); + + return decoded; + } + + public static string PrettifyAACSMediaIdentifier(AACSMediaIdentifier? AACSMIResponse) + { + if(AACSMIResponse == null) + return null; + + AACSMediaIdentifier response = AACSMIResponse.Value; + + var sb = new StringBuilder(); + + #if DEBUG + if(response.Reserved1 != 0) + sb.AppendFormat(Localization.Reserved1_equals_0_X8, response.Reserved1).AppendLine(); + + if(response.Reserved2 != 0) + sb.AppendFormat(Localization.Reserved2_equals_0_X8, response.Reserved2).AppendLine(); + #endif + sb.AppendFormat(Localization.AACS_Media_Identifier_in_hex_follows); + sb.AppendLine(PrintHex.ByteArrayToHexArrayString(response.MediaIdentifier, 80)); + + return sb.ToString(); + } + + public static string PrettifyAACSMediaIdentifier(byte[] AACSMIResponse) + { + AACSMediaIdentifier? decoded = DecodeAACSMediaIdentifier(AACSMIResponse); + + return PrettifyAACSMediaIdentifier(decoded); + } + + public static AACSMediaKeyBlock? DecodeAACSMediaKeyBlock(byte[] AACSMKBResponse) + { + if(AACSMKBResponse == null) + return null; + + var decoded = new AACSMediaKeyBlock + { + MediaKeyBlockPacks = new byte[AACSMKBResponse.Length - 4], + DataLength = BigEndianBitConverter.ToUInt16(AACSMKBResponse, 0), + Reserved = AACSMKBResponse[2], + TotalPacks = AACSMKBResponse[3] + }; + + Array.Copy(AACSMKBResponse, 4, decoded.MediaKeyBlockPacks, 0, AACSMKBResponse.Length - 4); + + return decoded; + } + + public static string PrettifyAACSMediaKeyBlock(AACSMediaKeyBlock? AACSMKBResponse) + { + if(AACSMKBResponse == null) + return null; + + AACSMediaKeyBlock response = AACSMKBResponse.Value; + + var sb = new StringBuilder(); + + #if DEBUG + if(response.Reserved != 0) + sb.AppendFormat(Localization.Reserved_equals_0_X2, response.Reserved).AppendLine(); + #endif + sb.AppendFormat(Localization.Total_number_of_media_key_blocks_available_to_transfer_0, response.TotalPacks). + AppendLine(); + + sb.AppendFormat(Localization.AACS_Media_Key_Blocks_in_hex_follows); + sb.AppendLine(PrintHex.ByteArrayToHexArrayString(response.MediaKeyBlockPacks, 80)); + + return sb.ToString(); + } + + public static string PrettifyAACSMediaKeyBlock(byte[] AACSMKBResponse) + { + AACSMediaKeyBlock? decoded = DecodeAACSMediaKeyBlock(AACSMKBResponse); + + return PrettifyAACSMediaKeyBlock(decoded); + } + + public static AACSDataKeys? DecodeAACSDataKeys(byte[] AACSDKResponse) + { + if(AACSDKResponse == null) + return null; + + var decoded = new AACSDataKeys + { + DataKeys = new byte[AACSDKResponse.Length - 4], + DataLength = BigEndianBitConverter.ToUInt16(AACSDKResponse, 0), + Reserved1 = AACSDKResponse[2], + Reserved2 = AACSDKResponse[3] + }; + + Array.Copy(AACSDKResponse, 4, decoded.DataKeys, 0, AACSDKResponse.Length - 4); + + return decoded; + } + + public static string PrettifyAACSDataKeys(AACSDataKeys? AACSDKResponse) + { + if(AACSDKResponse == null) + return null; + + AACSDataKeys response = AACSDKResponse.Value; + + var sb = new StringBuilder(); + + #if DEBUG + if(response.Reserved1 != 0) + sb.AppendFormat(Localization.Reserved1_equals_0_X8, response.Reserved1).AppendLine(); + + if(response.Reserved2 != 0) + sb.AppendFormat(Localization.Reserved2_equals_0_X8, response.Reserved2).AppendLine(); + #endif + sb.AppendFormat(Localization.AACS_Data_Keys_in_hex_follows); + sb.AppendLine(PrintHex.ByteArrayToHexArrayString(response.DataKeys, 80)); + + return sb.ToString(); + } + + public static string PrettifyAACSDataKeys(byte[] AACSDKResponse) + { + AACSDataKeys? decoded = DecodeAACSDataKeys(AACSDKResponse); + + return PrettifyAACSDataKeys(decoded); + } + + public static AACSLBAExtentsResponse? DecodeAACSLBAExtents(byte[] AACSLBAExtsResponse) + { + if(AACSLBAExtsResponse == null) + return null; + + var decoded = new AACSLBAExtentsResponse + { + DataLength = BigEndianBitConverter.ToUInt16(AACSLBAExtsResponse, 0), + Reserved = AACSLBAExtsResponse[2], + MaxLBAExtents = AACSLBAExtsResponse[3] + }; + + if((AACSLBAExtsResponse.Length - 4) % 16 != 0) + return decoded; + + decoded.Extents = new AACSLBAExtent[(AACSLBAExtsResponse.Length - 4) / 16]; + + for(var i = 0; i < (AACSLBAExtsResponse.Length - 4) / 16; i++) + { + decoded.Extents[i].Reserved = new byte[8]; + Array.Copy(AACSLBAExtsResponse, 0 + i * 16 + 4, decoded.Extents[i].Reserved, 0, 8); + decoded.Extents[i].StartLBA = BigEndianBitConverter.ToUInt32(AACSLBAExtsResponse, 8 + i * 16 + 4); + decoded.Extents[i].LBACount = BigEndianBitConverter.ToUInt32(AACSLBAExtsResponse, 12 + i * 16 + 4); + } + + return decoded; + } + + public static string PrettifyAACSLBAExtents(AACSLBAExtentsResponse? AACSLBAExtsResponse) + { + if(AACSLBAExtsResponse == null) + return null; + + AACSLBAExtentsResponse response = AACSLBAExtsResponse.Value; + + var sb = new StringBuilder(); + + if(response.MaxLBAExtents == 0) + { + sb.AppendLine(response.DataLength > 2 + ? Localization.Drive_can_store_256_LBA_Extents + : Localization.Drive_cannot_store_LBA_Extents); + } + else + sb.AppendFormat(Localization.Drive_can_store_0_LBA_Extents, response.MaxLBAExtents).AppendLine(); + + for(var i = 0; i < response.Extents.Length; i++) + { + sb.AppendFormat(Localization.LBA_Extent_0_starts_at_LBA_1_and_goes_for_2_sectors, i, + response.Extents[i].StartLBA, response.Extents[i].LBACount); + } + + return sb.ToString(); + } + + public static string PrettifyAACSLBAExtents(byte[] AACSLBAExtsResponse) + { + AACSLBAExtentsResponse? decoded = DecodeAACSLBAExtents(AACSLBAExtsResponse); + + return PrettifyAACSLBAExtents(decoded); + } + +#region Nested type: AACSDataKeys + + public struct AACSDataKeys + { + /// Bytes 0 to 1 Data length + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Bytes 4 to end AACS data keys + public byte[] DataKeys; + } + +#endregion + +#region Nested type: AACSLBAExtent + + public struct AACSLBAExtent + { + /// Bytes 0 to 7 Reserved + public byte[] Reserved; + /// Bytes 8 to 11 Start LBA of extent + public uint StartLBA; + /// Bytes 12 to 15 Extent length + public uint LBACount; + } + +#endregion + +#region Nested type: AACSLBAExtentsResponse + + public struct AACSLBAExtentsResponse + { + /// Bytes 0 to 1 Data Length + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved; + /// + /// Byte 3 Number of LBA extents the drive can store. if(MaxLBAExtents == 0 && DataLength > 2), 256 + /// extents can be stored + /// + public byte MaxLBAExtents; + /// Bytes 4 to end LBA Extents + public AACSLBAExtent[] Extents; + } + +#endregion + +#region Nested type: AACSMediaIdentifier + + public struct AACSMediaIdentifier + { + /// Bytes 0 to 1 Data length + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Bytes 4 to end AACS media identifier data + public byte[] MediaIdentifier; + } + +#endregion + +#region Nested type: AACSMediaKeyBlock + + public struct AACSMediaKeyBlock + { + /// Bytes 0 to 1 Data length + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved; + /// Byte 3 Number of MKB packs available to transfer + public byte TotalPacks; + /// Bytes 4 to end AACS media key block packs + public byte[] MediaKeyBlockPacks; + } + +#endregion + +#region Nested type: AACSMediaSerialNumber + + public struct AACSMediaSerialNumber + { + /// Bytes 0 to 1 Data length + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Bytes 4 to end AACS media serial number + public byte[] MediaSerialNumber; + } + +#endregion + +#region Nested type: AACSVolumeIdentifier + + public struct AACSVolumeIdentifier + { + /// Bytes 0 to 1 Data length + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Bytes 4 to end AACS volume identifier data + public byte[] VolumeIdentifier; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/MMC/CPRM.cs b/Aaru.Decoders/SCSI/MMC/CPRM.cs new file mode 100644 index 000000000..1b0b8e8cf --- /dev/null +++ b/Aaru.Decoders/SCSI/MMC/CPRM.cs @@ -0,0 +1,124 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : CPRM.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes CPRM structures. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Text; +using Aaru.Helpers; + +namespace Aaru.Decoders.SCSI.MMC; + +// Information from the following standards: +// ANSI X3.304-1997 +// T10/1048-D revision 9.0 +// T10/1048-D revision 10a +// T10/1228-D revision 7.0c +// T10/1228-D revision 11a +// T10/1363-D revision 10g +// T10/1545-D revision 1d +// T10/1545-D revision 5 +// T10/1545-D revision 5a +// T10/1675-D revision 2c +// T10/1675-D revision 4 +// T10/1836-D revision 2g +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +[SuppressMessage("ReSharper", "UnusedType.Global")] +public static class CPRM +{ + public static CPRMMediaKeyBlock? DecodeCPRMMediaKeyBlock(byte[] CPRMMKBResponse) + { + if(CPRMMKBResponse == null) + return null; + + var decoded = new CPRMMediaKeyBlock + { + MKBPackData = new byte[CPRMMKBResponse.Length - 4], + DataLength = BigEndianBitConverter.ToUInt16(CPRMMKBResponse, 0), + Reserved = CPRMMKBResponse[2], + TotalPacks = CPRMMKBResponse[3] + }; + + Array.Copy(CPRMMKBResponse, 4, decoded.MKBPackData, 0, CPRMMKBResponse.Length - 4); + + return decoded; + } + + public static string PrettifyCPRMMediaKeyBlock(CPRMMediaKeyBlock? CPRMMKBResponse) + { + if(CPRMMKBResponse == null) + return null; + + CPRMMediaKeyBlock response = CPRMMKBResponse.Value; + + var sb = new StringBuilder(); + + #if DEBUG + if(response.Reserved != 0) + sb.AppendFormat(Localization.Reserved_equals_0_X2, response.Reserved).AppendLine(); + #endif + sb.AppendFormat(Localization.Total_number_of_CPRM_Media_Key_Blocks_available_to_transfer_0, + response.TotalPacks). + AppendLine(); + + sb.AppendFormat(Localization.CPRM_Media_Key_Blocks_in_hex_follows); + sb.AppendLine(PrintHex.ByteArrayToHexArrayString(response.MKBPackData, 80)); + + return sb.ToString(); + } + + public static string PrettifyCPRMMediaKeyBlock(byte[] CPRMMKBResponse) + { + CPRMMediaKeyBlock? decoded = DecodeCPRMMediaKeyBlock(CPRMMKBResponse); + + return PrettifyCPRMMediaKeyBlock(decoded); + } + +#region Nested type: CPRMMediaKeyBlock + + public struct CPRMMediaKeyBlock + { + /// Bytes 0 to 1 Data Length + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved; + /// Byte 3 Number of MKB packs available to transfer + public byte TotalPacks; + /// Byte 4 MKB Packs + public byte[] MKBPackData; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/MMC/DiscInformation.cs b/Aaru.Decoders/SCSI/MMC/DiscInformation.cs new file mode 100644 index 000000000..93b4553f9 --- /dev/null +++ b/Aaru.Decoders/SCSI/MMC/DiscInformation.cs @@ -0,0 +1,493 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : DiscInformation.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes MMC GET DISC INFORMATION structures. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SCSI.MMC; + +// Information from the following standards: +// ANSI X3.304-1997 +// T10/1048-D revision 9.0 +// T10/1048-D revision 10a +// T10/1228-D revision 7.0c +// T10/1228-D revision 11a +// T10/1363-D revision 10g +// T10/1545-D revision 1d +// T10/1545-D revision 5 +// T10/1545-D revision 5a +// T10/1675-D revision 2c +// T10/1675-D revision 4 +// T10/1836-D revision 2g +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +public static class DiscInformation +{ + public static StandardDiscInformation? Decode000b(byte[] response) + { + if(response.Length < 32) + return null; + + if((response[2] & 0xE0) != 0) + return null; + + var decoded = new StandardDiscInformation + { + DataLength = (ushort)((response[0] << 8) + response[1]) + }; + + if(decoded.DataLength + 2 != response.Length) + return null; + + decoded.DataType = (byte)((response[2] & 0xE0) >> 5); + decoded.Erasable |= (response[2] & 0x10) == 0x10; + decoded.LastSessionStatus = (byte)((response[2] & 0x0C) >> 2); + decoded.DiscStatus = (byte)(response[2] & 0x03); + decoded.FirstTrackNumber = response[3]; + decoded.Sessions = (ushort)((response[9] << 8) + response[4]); + decoded.FirstTrackLastSession = (ushort)((response[10] << 8) + response[5]); + decoded.LastTrackLastSession = (ushort)((response[11] << 8) + response[6]); + + decoded.DID_V |= (response[7] & 0x80) == 0x80; + decoded.DBC_V |= (response[7] & 0x40) == 0x40; + decoded.URU |= (response[7] & 0x20) == 0x20; + decoded.DAC_V |= (response[7] & 0x10) == 0x10; + decoded.Reserved |= (response[7] & 0x08) == 0x08; + decoded.Dbit |= (response[7] & 0x04) == 0x04; + decoded.BGFormatStatus = (byte)(response[7] & 0x03); + + decoded.DiscIdentification = + (uint)((response[12] << 24) + (response[13] << 16) + (response[14] << 8) + response[15]); + + decoded.LastSessionLeadInStartLBA = + (uint)((response[16] << 24) + (response[17] << 16) + (response[18] << 8) + response[19]); + + decoded.LastPossibleLeadOutStartLBA = + (uint)((response[20] << 24) + (response[21] << 16) + (response[22] << 8) + response[23]); + + var temp = new byte[8]; + Array.Copy(response, 24, temp, 0, 8); + Array.Reverse(temp); + decoded.DiscBarcode = BitConverter.ToUInt64(temp, 0); + + if(response.Length < 34) + return null; + + decoded.DiscApplicationCode = response[32]; + decoded.OPCTablesNumber = response[33]; + + if(decoded.OPCTablesNumber <= 0 || response.Length != decoded.OPCTablesNumber * 8 + 34) + return decoded; + + decoded.OPCTables = new OPCTable[decoded.OPCTablesNumber]; + + for(var i = 0; i < decoded.OPCTablesNumber; i++) + { + decoded.OPCTables[i].Speed = (ushort)((response[34 + i * 8 + 0] << 16) + response[34 + i * 8 + 1]); + + decoded.OPCTables[i].OPCValues = new byte[6]; + Array.Copy(response, 34 + i * 8 + 2, decoded.OPCTables[i].OPCValues, 0, 6); + } + + return decoded; + } + + public static string Prettify000b(StandardDiscInformation? information) + { + if(information?.DataType != 0) + return null; + + var sb = new StringBuilder(); + + switch(information.Value.DiscType) + { + case 0x00: + sb.AppendLine(Localization.Disc_type_declared_as_CD_DA_or_CD_ROM); + + break; + case 0x10: + sb.AppendLine(Localization.Disc_type_declared_as_CD_i); + + break; + case 0x20: + sb.AppendLine(Localization.Disc_type_declared_as_CD_ROM_XA); + + break; + case 0xFF: + sb.AppendLine(Localization.Disc_type_is_undefined); + + break; + default: + sb.AppendFormat(Localization.Unknown_disc_type_0, information.Value.DiscType).AppendLine(); + + break; + } + + switch(information.Value.DiscStatus) + { + case 0: + sb.AppendLine(Localization.Disc_is_empty); + + break; + case 1: + sb.AppendLine(Localization.Disc_is_incomplete); + + break; + case 2: + sb.AppendLine(Localization.Disc_is_finalized); + + break; + } + + if(information.Value.Erasable) + sb.AppendLine(Localization.Disc_is_erasable); + + switch(information.Value.LastSessionStatus) + { + case 0: + sb.AppendLine(Localization.Last_session_is_empty); + + break; + case 1: + sb.AppendLine(Localization.Last_session_is_incomplete); + + break; + case 2: + sb.AppendLine(Localization.Last_session_is_damaged); + + break; + case 3: + sb.AppendLine(Localization.Last_session_is_complete); + + break; + } + + switch(information.Value.BGFormatStatus) + { + case 1: + sb.AppendLine(Localization. + Media_was_being_formatted_in_the_background_but_it_is_stopped_and_incomplete); + + break; + case 2: + sb.AppendLine(Localization.Media_is_currently_being_formatted_in_the_background); + + break; + case 3: + sb.AppendLine(Localization.Media_background_formatting_has_completed); + + break; + } + + if(information.Value.Dbit) + sb.AppendLine(Localization.MRW_is_dirty); + + sb.AppendFormat(Localization.First_track_on_disc_is_track_0, information.Value.FirstTrackNumber).AppendLine(); + sb.AppendFormat(Localization.Disc_has_0_sessions, information.Value.Sessions).AppendLine(); + + sb.AppendFormat(Localization.First_track_in_last_session_is_track_0, information.Value.FirstTrackLastSession). + AppendLine(); + + sb.AppendFormat(Localization.Last_track_in_last_session_is_track_0, information.Value.LastTrackLastSession). + AppendLine(); + + sb.AppendFormat(Localization.Last_session_Lead_In_address_is_0_as_LBA_or_1_2_3, + information.Value.LastSessionLeadInStartLBA, + (information.Value.LastSessionLeadInStartLBA & 0xFF0000) >> 16, + (information.Value.LastSessionLeadInStartLBA & 0xFF00) >> 8, + information.Value.LastSessionLeadInStartLBA & 0xFF). + AppendLine(); + + sb.AppendFormat(Localization.Last_possible_Lead_Out_address_is_0_as_LBA_or_1_2_3, + information.Value.LastPossibleLeadOutStartLBA, + (information.Value.LastPossibleLeadOutStartLBA & 0xFF0000) >> 16, + (information.Value.LastPossibleLeadOutStartLBA & 0xFF00) >> 8, + information.Value.LastPossibleLeadOutStartLBA & 0xFF). + AppendLine(); + + sb.AppendLine(information.Value.URU + ? Localization.Disc_is_defined_for_unrestricted_use + : Localization.Disc_is_defined_for_restricted_use); + + if(information.Value.DID_V) + sb.AppendFormat(Localization.Disc_ID_0_X6, information.Value.DiscIdentification & 0x00FFFFFF).AppendLine(); + + if(information.Value.DBC_V) + sb.AppendFormat(Localization.Disc_barcode_0, information.Value.DiscBarcode).AppendLine(); + + if(information.Value.DAC_V) + sb.AppendFormat(Localization.Disc_application_code_0, information.Value.DiscApplicationCode).AppendLine(); + + if(information.Value.OPCTables == null) + return sb.ToString(); + + foreach(OPCTable table in information.Value.OPCTables) + { + sb.AppendFormat(Localization.OPC_values_for_0_Kbit_sec_1_2_3_4_5_6, table.Speed, table.OPCValues[0], + table.OPCValues[1], table.OPCValues[2], table.OPCValues[3], table.OPCValues[4], + table.OPCValues[5]). + AppendLine(); + } + + return sb.ToString(); + } + + public static TrackResourcesInformation? Decode001b(byte[] response) + { + if(response.Length != 12) + return null; + + if((response[2] & 0xE0) != 0x20) + return null; + + var decoded = new TrackResourcesInformation + { + DataLength = (ushort)((response[0] << 8) + response[1]) + }; + + if(decoded.DataLength + 2 != response.Length) + return null; + + decoded.DataType = (byte)((response[2] & 0xE0) >> 5); + decoded.MaxTracks = (ushort)((response[4] << 8) + response[5]); + decoded.AssignedTracks = (ushort)((response[6] << 8) + response[7]); + decoded.MaxAppendableTracks = (ushort)((response[8] << 8) + response[9]); + decoded.AppendableTracks = (ushort)((response[10] << 8) + response[11]); + + return decoded; + } + + public static string Prettify001b(TrackResourcesInformation? information) + { + if(information?.DataType != 1) + return null; + + var sb = new StringBuilder(); + + sb.AppendFormat(Localization._0_maximum_possible_tracks_on_the_disc, information.Value.MaxTracks).AppendLine(); + sb.AppendFormat(Localization._0_assigned_tracks_on_the_disc, information.Value.AssignedTracks).AppendLine(); + + sb.AppendFormat(Localization._0_maximum_possible_appendable_tracks_on_the_disc, + information.Value.AppendableTracks). + AppendLine(); + + sb.AppendFormat(Localization._0_current_appendable_tracks_on_the_disc, information.Value.MaxAppendableTracks). + AppendLine(); + + return sb.ToString(); + } + + public static POWResourcesInformation? Decode010b(byte[] response) + { + if(response.Length != 16) + return null; + + if((response[2] & 0xE0) != 0x40) + return null; + + var decoded = new POWResourcesInformation + { + DataLength = (ushort)((response[0] << 8) + response[1]) + }; + + if(decoded.DataLength + 2 != response.Length) + return null; + + decoded.DataType = (byte)((response[2] & 0xE0) >> 5); + + decoded.RemainingPOWReplacements = + (ushort)((response[4] << 24) + (response[5] << 16) + (response[6] << 8) + response[7]); + + decoded.RemainingPOWReallocation = + (ushort)((response[8] << 24) + (response[9] << 16) + (response[10] << 8) + response[11]); + + decoded.RemainingPOWUpdates = + (ushort)((response[12] << 24) + (response[13] << 16) + (response[14] << 8) + response[15]); + + return decoded; + } + + public static string Prettify010b(POWResourcesInformation? information) + { + if(information?.DataType != 1) + return null; + + var sb = new StringBuilder(); + + sb.AppendFormat(Localization._0_remaining_POW_replacements, information.Value.RemainingPOWReplacements). + AppendLine(); + + sb.AppendFormat(Localization._0_remaining_POW_reallocation_map_entries, + information.Value.RemainingPOWReallocation). + AppendLine(); + + sb.AppendFormat(Localization._0_remaining_POW_updates, information.Value.RemainingPOWUpdates).AppendLine(); + + return sb.ToString(); + } + + public static string Prettify(byte[] response) + { + if(response == null) + return null; + + if(response.Length < 12) + return null; + + return (response[2] & 0xE0) switch + { + 0x00 => Prettify000b(Decode000b(response)), + 0x20 => Prettify001b(Decode001b(response)), + 0x40 => Prettify010b(Decode010b(response)), + _ => null + }; + } + +#region Nested type: OPCTable + + public struct OPCTable + { + /// Bytes 0 to 1 kilobytes/sec this OPC table applies to + public ushort Speed; + /// Bytes 2 to 7 OPC values + public byte[] OPCValues; + } + +#endregion + +#region Nested type: POWResourcesInformation + + [SuppressMessage("ReSharper", "UnusedMember.Global")] + public struct POWResourcesInformation + { + /// Bytes 0 to 1 14 + public ushort DataLength; + /// Byte 2, bits 7 to 5 010b + public byte DataType; + /// Byte 2, bits 4 to 0 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Bytes 4 to 7 Remaining POW replacements + public uint RemainingPOWReplacements; + /// Bytes 8 to 11 Remaining POW reallocation map entries + public uint RemainingPOWReallocation; + /// Bytes 12 to 15 Number of remaining POW updates + public uint RemainingPOWUpdates; + } + +#endregion + +#region Nested type: StandardDiscInformation + + public struct StandardDiscInformation + { + /// Bytes 0 to 1 32 + OPCTablesNumber*8 + public ushort DataLength; + /// Byte 2, bits 7 to 5 000b + public byte DataType; + /// Byte 2, bit 4 If set, disc is erasable + public bool Erasable; + /// Byte 2, bits 3 to 2 Status of last session + public byte LastSessionStatus; + /// Byte 2, bits 1 to 0 Status of disc + public byte DiscStatus; + /// Byte 3 Number of logical track that contains LBA 0 + public byte FirstTrackNumber; + /// Byte 9 (MSB) and byte 4 (LSB) Number of sessions + public ushort Sessions; + /// Byte 10 (MSB) and byte 5 (LSB) Number of first track in last session + public ushort FirstTrackLastSession; + /// Byte 11 (MSB) and byte 6 (LSB) Number of last track in last session + public ushort LastTrackLastSession; + /// Byte 7, bit 7 If set, DiscIdentification is valid + public bool DID_V; + /// Byte 7, bit 6 If set, DiscBarcode is valid + public bool DBC_V; + /// Byte 7, bit 5 If set, disc is unrestricted + public bool URU; + /// Byte 7, bit 4 If set DiscApplicationCode is valid + public bool DAC_V; + /// Byte 7, bit 3 Reserved + public bool Reserved; + /// Byte 7, bit 2 Copy of dirty bit from MRW status + public bool Dbit; + /// Byte 7, bits 1 to 0 Background format status + public byte BGFormatStatus; + /// Byte 8 Disc type code + public byte DiscType; + /// Bytes 12 to 15 Disc identification number from PMA + public uint DiscIdentification; + /// Bytes 16 to 19 Last Session Lead-in Start Address (MSF for CD, LBA for others) + public uint LastSessionLeadInStartLBA; + /// Bytes 20 to 23 Last Possible Lead-out Start Address (MSF for CD, LBA for others) + public uint LastPossibleLeadOutStartLBA; + /// Bytes 24 to 31 Disc barcode + public ulong DiscBarcode; + /// Byte 32 Disc application code + public byte DiscApplicationCode; + /// Byte 33 How many OPC tables are + public byte OPCTablesNumber; + /// Bytes 34 to end OPC tables (8 bytes each) + public OPCTable[] OPCTables; + } + +#endregion + +#region Nested type: TrackResourcesInformation + + [SuppressMessage("ReSharper", "UnusedMember.Global")] + public struct TrackResourcesInformation + { + /// Bytes 0 to 1 10 + public ushort DataLength; + /// Byte 2, bits 7 to 5 001b + public byte DataType; + /// Byte 2, bits 4 to 0 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Bytes 4 to 5 Maximum possible number of the tracks on the disc + public ushort MaxTracks; + /// Bytes 6 to 7 Number of the assigned tracks on the disc + public ushort AssignedTracks; + /// Bytes 8 to 9 Maximum possible number of appendable tracks on the disc + public ushort MaxAppendableTracks; + /// Bytes 10 to 11 Current number of appendable tracks on the disc + public ushort AppendableTracks; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/MMC/Enums.cs b/Aaru.Decoders/SCSI/MMC/Enums.cs new file mode 100644 index 000000000..6a4c9c24d --- /dev/null +++ b/Aaru.Decoders/SCSI/MMC/Enums.cs @@ -0,0 +1,87 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : Enums.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Contains various SCSI MMC enumerations. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + + +// ReSharper disable InconsistentNaming +// ReSharper disable UnusedMember.Global +// ReSharper disable UnusedType.Global + +namespace Aaru.Decoders.SCSI.MMC; + +public enum FormatLayerTypeCodes : ushort +{ + CDLayer = 0x0008, + DVDLayer = 0x0010, + BDLayer = 0x0040, + HDDVDLayer = 0x0050 +} + +public enum SessionStatusCodes : byte +{ + Empty = 0x00, + Incomplete = 0x01, + ReservedOrDamaged = 0x02, + Complete = 0x03 +} + +public enum DiscStatusCodes : byte +{ + Empty = 0x00, + Incomplete = 0x01, + Finalized = 0x02, + Others = 0x03 +} + +public enum BGFormatStatusCodes : byte +{ + NoFormattable = 0x00, + IncompleteBackgroundFormat = 0x01, + BackgroundFormatInProgress = 0x02, + FormatComplete = 0x03 +} + +public enum DiscTypeCodes : byte +{ + /// Also valid for CD-DA, DVD and BD + CDROM = 0x00, + CDi = 0x10, + CDROMXA = 0x20, + Undefined = 0xFF +} + +public enum LayerJumpRecordingStatus : byte +{ + Incremental = 0, + Unspecified = 1, + Manual = 2, + RegularInterval = 3 +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/MMC/Features.cs b/Aaru.Decoders/SCSI/MMC/Features.cs new file mode 100644 index 000000000..50a8232f8 --- /dev/null +++ b/Aaru.Decoders/SCSI/MMC/Features.cs @@ -0,0 +1,4871 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : Features.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MMC feature structures. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + + +using System; +using System.Collections.Generic; +using System.Text; +using Aaru.CommonTypes.Structs.Devices.SCSI; +using Aaru.Helpers; +using Aaru.Localization; + +// ReSharper disable MemberCanBePrivate.Global +// ReSharper disable UnusedType.Global +// ReSharper disable NotAccessedField.Global +// ReSharper disable InconsistentNaming +// ReSharper disable MemberCanBeInternal +// ReSharper disable UnusedMember.Global + +namespace Aaru.Decoders.SCSI.MMC; + +/// MMC Feature enumeration +public enum FeatureNumber : ushort +{ + /// Lists all profiles + ProfileList = 0x0000, + /// Mandatory behaviour + Core = 0x0001, + /// Operational changes + Morphing = 0x0002, + /// Removable medium + Removable = 0x0003, + /// Ability to control write protection status + WriteProtect = 0x0004, + /// Ability to read sectors with random addressing + RandomRead = 0x0010, + /// Reads on OSTA Multi-Read + MultiRead = 0x001D, + /// Able to read CD structures + CDRead = 0x001E, + /// Able to read DVD structures + DVDRead = 0x001F, + /// Ability to write sectors with random addressing + RandomWrite = 0x0020, + /// Ability to sequentially write + IncrementalWrite = 0x0021, + /// Support for media that requires erase before write + SectorErasable = 0x0022, + /// Supports formatting media + Formattable = 0x0023, + /// Ability to provide defect-free space + HardwareDefectMgmt = 0x0024, + /// Supports for write-once media in random order + WriteOnce = 0x0025, + /// Supports for media that shall be written from blocking boundaries + RestrictedOverwrite = 0x0026, + /// Supports high speed CD-RW + CDRWCAV = 0x0027, + /// Read and optionally write MRW + MRW = 0x0028, + /// Ability to control RECOVERED ERROR reporting + EnDefectReport = 0x0029, + /// Ability to recognize, read and optionally write DVD+RW + DVDRWPlus = 0x002A, + /// Ability to read DVD+R + DVDRPlus = 0x002B, + RigidOverWrite = 0x002C, + /// Ability to write CD in Track-at-Once + CDTAO = 0x002D, + /// Ability to write CD in Session-at-Once or RAW + CDMastering = 0x002E, + /// Ability to write DVD structures + DVDRWrite = 0x002F, + /// Ability to read DDCD + DDCD = 0x0030, + /// Ability to write DDCD-R + DDCDR = 0x0031, + /// Ability to write DDCD-RW + DDCDRW = 0x0032, + /// Ability to record in layer jump mode + LayerJump = 0x0033, + /// Ability to perform Layer Jump recording on Rigid Restricted Overwrite + LJRigid = 0x0034, + /// Ability to stop the long immediate operation + StopLong = 0x0035, + /// Ability to report CD-RW media sub-types supported for write + CDRWMediaWrite = 0x0037, + /// Logical block overwrite service on BD-R formatted as SRM+POW + BDRPOW = 0x0038, + /// Ability to read DVD+RW DL + DVDRWDLPlus = 0x003A, + /// Ability to read DVD+R DL + DVDRDLPlus = 0x003B, + /// Ability to read BD discs + BDRead = 0x0040, + /// Ability to write BD discs + BDWrite = 0x0041, + /// Timely, Safe Recording + TSR = 0x0042, + /// Ability to read HD DVD + HDDVDRead = 0x0050, + /// Ability to write HD DVD + HDDVDWrite = 0x0051, + /// Ability to write HD DVD-RW fragmented + HDDVDRWFragment = 0x0052, + /// Supports some Hybrid Discs + Hybrid = 0x0080, + /// Host and device directed power management + PowerMgmt = 0x0100, + /// Supports S.M.A.R.T. + SMART = 0x0101, + /// Single machanism multiple disc changer + Changer = 0x0102, + /// Ability to play CD audio to an analogue output + CDAudioExt = 0x0103, + /// Ability to accept new microcode + MicrocodeUpgrade = 0x0104, + /// Ability to respond to all commands within a specific time + Timeout = 0x0105, + /// Supports DVD CSS/CPPM + CSS = 0x0106, + /// Ability to read and write using host requested performance parameters + RTS = 0x0107, + /// Drive has a unique identifier + DriveSerial = 0x0108, + /// Ability to return unique Media Serial Number + MediaSerial = 0x0109, + /// Ability to read and/or write DCBs + DCBs = 0x010A, + /// Supports DVD CPRM + CPRM = 0x010B, + /// Firmware creation date report + FirmwareInfo = 0x010C, + /// Ability to decode and optionally encode AACS + AACS = 0x010D, + /// Ability to perform DVD CSS managed recording + CSSManagedRec = 0x010E, + /// Ability to decode and optionally encode VCPS + VCPS = 0x0110, + /// Supports SecurDisc + SecurDisc = 0x0113, + /// TCG Optical Security Subsystem Class + OSSC = 0x0142 +} + +/// MMC Profile enumeration +public enum ProfileNumber : ushort +{ + /// Not to use + Reserved = 0x0000, + /// Non-removable disk profile + NonRemovable = 0x0001, + /// Rewritable with removable media + Removable = 0x0002, + /// Magneto-Optical with sector erase + MOErasable = 0x0003, + /// Optical write once + OpticalWORM = 0x0004, + /// Advance Storage - Magneto-Optical + ASMO = 0x0005, + /// Read-only Compact Disc + CDROM = 0x0008, + /// Write-once Compact Disc + CDR = 0x0009, + /// Re-writable Compact Disc + CDRW = 0x000A, + /// Read-only DVD + DVDROM = 0x0010, + /// Write-once sequentially recorded DVD-R + DVDRSeq = 0x0011, + /// DVD-RAM + DVDRAM = 0x0012, + /// Restricted overwrite DVD-RW + DVDRWRes = 0x0013, + /// Sequential recording DVD-RW + DVDRWSeq = 0x0014, + /// Sequential recording DVD-R DL + DVDRDLSeq = 0x0015, + /// Layer jump recording DVD-R DL + DVDRDLJump = 0x0016, + /// DVD-RW DL + DVDRWDL = 0x0017, + /// DVD-Download + DVDDownload = 0x0018, + /// DVD+RW + DVDRWPlus = 0x001A, + /// DVD+R + DVDRPlus = 0x001B, + /// DDCD-ROM + DDCDROM = 0x0020, + /// DDCD-R + DDCDR = 0x0021, + /// DDCD-RW + DDCDRW = 0x0022, + /// DVD+RW DL + DVDRWDLPlus = 0x002A, + /// DVD+R DL + DVDRDLPlus = 0x002B, + /// BD-ROM + BDROM = 0x0040, + /// BD-R SRM + BDRSeq = 0x0041, + /// BD-R RRM + BDRRdm = 0x0042, + /// BD-RE + BDRE = 0x0043, + /// HD DVD-ROM + HDDVDROM = 0x0050, + /// HD DVD-R + HDDVDR = 0x0051, + /// HD DVD-RAM + HDDVDRAM = 0x0052, + /// HD DVD-RW + HDDVDRW = 0x0053, + /// HD DVD-R DL + HDDVDRDL = 0x0058, + /// HD DVD-RW DL + HDDVDRWDL = 0x005A, + /// HDBurn CD-ROM + HDBURNROM = 0x0080, + /// HDBurn CD-R + HDBURNR = 0x0081, + /// HDBurn CD-RW + HDBURNRW = 0x0082, + /// Drive does not conform to any profiles + Unconforming = 0xFFFF +} + +public struct Profile +{ + public ProfileNumber Number; + public bool Current; +} + +/// Profile List Feature (0000h) +public struct Feature_0000 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// All supported profiles + public Profile[] Profiles; +} + +/// Core Feature (0001h) +public struct Feature_0001 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Currently in-use physical interface standard + public PhysicalInterfaces PhysicalInterfaceStandard; + /// Supports EVPD, Page Code and 16-bit Allocation Length as defined in SPC-3 + public bool INQ2; + /// Supports Device Busy Event + public bool DBE; +} + +/// Morphing Feature (0002h) +public struct Feature_0002 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Supports Operational Change Request/Nofitication Class Events of GET EVENT/STATUS NOTIFICATION + public bool OCEvent; + /// Supports asynchronous GET EVENT/STATUS NOTIFICATION + public bool Async; +} + +/// Removable Medium Feature (0003h) +public struct Feature_0003 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Mechanism type + public byte LoadingMechanismType; + /// Drive is able to load the medium + public bool Load; + /// Device can eject medium + public bool Eject; + /// Device starts in medium ejection/insertion allow + public bool PreventJumper; + /// Reports Device Busy Class events during medium loading/unloading + public bool DBML; + /// Medium is currently locked + public bool Lock; +} + +/// Write Protect Feature (0004h) +public struct Feature_0004 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Drive can read/write Disc Write Protect PAC on BD-R/-RE media + public bool DWP; + /// Supports reading/writing Write Inhibit DCB on DVD+RW media. + public bool WDCB; + /// Supports PWP status + public bool SPWP; + /// Supports SWPP bit of mode page 1Dh + public bool SSWPP; +} + +/// Random Readable Feature (0010h) +public struct Feature_0010 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Bytes per logical block + public uint LogicalBlockSize; + /// Number of logical blocks per device readable unit + public ushort Blocking; + /// Read/Write Error Recovery page is present + public bool PP; +} + +/// Multi-Read Feature (001Dh) +public struct Feature_001D +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; +} + +/// CD Read Feature (001Eh) +public struct Feature_001E +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Supports DAP bit in READ CD and READ CD MSF + public bool DAP; + /// Supports C2 Error Pointers + public bool C2; + /// Can read CD-Text with READ TOC/PMA/ATIP + public bool CDText; +} + +/// DVD Read Feature (001Fh) +public struct Feature_001F +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Compliant with DVD Multi Drive Read-only specifications + public bool MULTI110; + /// Supports reading all DVD-RW DL + public bool DualRW; + /// Supports reading all DVD-R DL including remapping + public bool DualR; +} + +/// Random Writable Feature (0020h) +public struct Feature_0020 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Last logical block address + public uint LastLBA; + /// Bytes per logical block + public uint LogicalBlockSize; + /// Number of logical blocks per device readable unit + public ushort Blocking; + /// Read/Write Error Recovery page is present + public bool PP; +} + +/// Incremental Streaming Writable Feature (0021h) +public struct Feature_0021 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Bitmask of supported data types + public ushort DataTypeSupported; + /// Can report Track Resources Information of READ DISC INFORMATION + public bool TRIO; + /// Supports Address Mode in RESERVE TRACK + public bool ARSV; + /// Zero loss linking + public bool BUF; + /// Logical blocks per link + public byte[] LinkSizes; +} + +/// Sector Erasable Feature (0022h) +public struct Feature_0022 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; +} + +/// Formattable Feature (0023h) +public struct Feature_0023 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Supports formatting BD-RE without spare area + public bool RENoSA; + /// Supports expansion of the spare area on BD-RE + public bool Expand; + /// Supports FORMAT type 30h sub-type 11b + public bool QCert; + /// Supports FORMAT type 30h sub-type 10b + public bool Cert; + /// Supports FORMAT type 18h + public bool FRF; + /// Supports FORMAT type 00h/32h sub-type 10b on BD-R + public bool RRM; +} + +/// Hardware Defect Management Feature (0024h) +public struct Feature_0024 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Supports READ DISC STRUCTURE with Format Code 0Ah (Spare Area Information) + public bool SSA; +} + +/// Write Once Feature (0025h) +public struct Feature_0025 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Bytes per logical block + public uint LogicalBlockSize; + /// Number of logical blocks per device readable unit + public ushort Blocking; + /// Read/Write Error Recovery page is present + public bool PP; +} + +/// Restricted Overwrite Feature (0026h) +public struct Feature_0026 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; +} + +/// CD-RW CAV Write Feature (0027h) +public struct Feature_0027 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; +} + +/// MRW Feature (0028h) +public struct Feature_0028 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Can read DVD+MRW discs + public bool DVDPRead; + /// Can write DVD+MRW discs + public bool DVDPWrite; + /// Can format and write to CD-MRW discs + public bool Write; +} + +/// Enhanced Defect Reporting Feature (0029h) +public struct Feature_0029 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Supports DRT-DM + public bool DRTDM; + /// Maximum number of DBI cache zones device can handle separately + public byte DBICacheZones; + /// Number of entries in worst case to case DBI overflow + public ushort Entries; +} + +/// DVD+RW Feature (002Ah) +public struct Feature_002A +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Can format DVD+RW discs + public bool Write; + /// FORMAT UNIT supports quick start formatting + public bool QuickStart; + /// Drive only supports read compatibility stop + public bool CloseOnly; +} + +/// DVD+R Feature (002Bh) +public struct Feature_002B +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Can write DVD+R + public bool Write; +} + +/// Rigid Restricted Overwrite Feature (002Ch) +public struct Feature_002C +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Can generate Defect Status Data during formatting + public bool DSDG; + /// Can read Defect Status Data recorded on medium + public bool DSDR; + /// Supports writing on an intermediate state Session and quick formatting + public bool Intermediate; + /// Supports BLANK command types 00h and 01h + public bool Blank; +} + +/// CD Track at Once Feature (002Dh) +public struct Feature_002D +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Supports zero loss linking + public bool BUF; + /// Supports writing R-W subchannels in raw mode + public bool RWRaw; + /// Supports writing R-W subchannels in packed mode + public bool RWPack; + /// Can perform test writes + public bool TestWrite; + /// Supports overwriting a TAO track with another + public bool CDRW; + /// Can write R-W subchannels with user provided data + public bool RWSubchannel; + /// Bitmask of supported data types + public ushort DataTypeSupported; +} + +/// CD Mastering (Session at Once) Feature (002Eh) +public struct Feature_002E +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Supports zero loss linking + public bool BUF; + /// Can write in Session at Once + public bool SAO; + /// Can write multi-session in RAW + public bool RAWMS; + /// Can write in RAW + public bool RAW; + /// Can perform test writes + public bool TestWrite; + /// Can overwrite previously recorded data + public bool CDRW; + /// Can write R-W subchannels with user provided data + public bool RW; + /// Maximum length of a Cue Sheet for Session at Once + public uint MaxCueSheet; +} + +/// DVD-R/-RW Write Feature (002Fh) +public struct Feature_002F +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Buffer Under-run protection + public bool BUF; + /// Supports writing DVD-R DL + public bool RDL; + /// Test write + public bool TestWrite; + /// Can write and erase DVD-RW + public bool DVDRW; +} + +/// Double Density CD Read Feature (0030h) +public struct Feature_0030 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; +} + +/// Double Density CD-R Write Feature (0031h) +public struct Feature_0031 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Test write + public bool TestWrite; +} + +/// Double Density CD-RW Write Feature (0032h) +public struct Feature_0032 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Supports quick formatting + public bool Intermediate; + /// Supports BLANK command + public bool Blank; +} + +/// Layer Jump Recording Feature (0033h) +public struct Feature_0033 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + public byte[] LinkSizes; +} + +/// Stop Long Operation Feature (0035h) +public struct Feature_0035 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; +} + +/// CD-RW Media Write Support Feature (0037h) +public struct Feature_0037 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Bitmask of supported CD-RW media sub-types + public byte SubtypeSupport; +} + +/// BD-R Pseudo-Overwrite (POW) Feature (0038h) +public struct Feature_0038 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; +} + +/// DVD+RW Dual Layer Feature (003Ah) +public struct Feature_003A +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Can format DVD+RW DL discs + public bool Write; + /// FORMAT UNIT supports quick start formatting + public bool QuickStart; + /// Drive only supports read compatibility stop + public bool CloseOnly; +} + +/// DVD+R Dual Layer Feature (003Bh) +public struct Feature_003B +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Can format DVD+R DL discs + public bool Write; + /// FORMAT UNIT supports quick start formatting + public bool QuickStart; + /// Drive only supports read compatibility stop + public bool CloseOnly; +} + +/// BD Read Feature (0040h) +public struct Feature_0040 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Can read BCA + public bool BCA; + /// Supports reading BD-RE Ver.2 + public bool RE2; + /// Supports reading BD-RE Ver.1 + public bool RE1; + /// Obsolete + public bool OldRE; + /// Supports reading BD-R Ver.1 + public bool R; + /// Obsolete + public bool OldR; + /// Supports reading BD-ROM Ver.1 + public bool ROM; + /// Obsolete + public bool OldROM; +} + +/// BD Write Feature (0041h) +public struct Feature_0041 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Supports verify not required + public bool SVNR; + /// Supports writing BD-RE Ver.2 + public bool RE2; + /// Supports writing BD-RE Ver.1 + public bool RE1; + /// Obsolete + public bool OldRE; + /// Supports writing BD-R Ver.1 + public bool R; + /// Obsolete + public bool OldR; +} + +/// TSR Feature (0042h) +public struct Feature_0042 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; +} + +/// HD DVD Read Feature (0050h) +public struct Feature_0050 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Can read HD DVD-R + public bool HDDVDR; + /// Can read HD DVD-RAM + public bool HDDVDRAM; +} + +/// HD DVD Write Feature (0051h) +public struct Feature_0051 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Can write HD DVD-R + public bool HDDVDR; + /// Can write HD DVD-RAM + public bool HDDVDRAM; +} + +/// Hybrid Disc Feature (0080h) +public struct Feature_0080 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Reset immunity + public bool RI; +} + +/// Power Management Feature (0100h) +public struct Feature_0100 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; +} + +/// S.M.A.R.T. Feature (0101h) +public struct Feature_0101 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Mode Page 1Ch is present + public bool PP; +} + +/// Embedded Changer Feature (0102h) +public struct Feature_0102 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Side change capable + public bool SCC; + /// Supports Disc Present + public bool SDP; + /// Number of slots - 1 + public byte HighestSlotNumber; +} + +/// CD Audio External Play Feature (0103h) +public struct Feature_0103 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Supports SCAN command + public bool Scan; + /// Separate Channel Mute + public bool SCM; + /// Separate Volume + public bool SV; + /// Number of volume levels + public ushort VolumeLevels; +} + +/// Microcode Upgrade Feature (0104h) +public struct Feature_0104 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Supports validating 5-bit mode field of READ BUFFER and WRITE BUFFER commands. + public bool M5; +} + +/// Time-Out Feature (0105h) +public struct Feature_0105 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Supports G3Enable bit and Group3 Timeout field in Mode Page 1Dh + public bool Group3; + /// Indicates a unit of block length, in sectors, corresponding to increase a unit of Group 3 time unit + public ushort UnitLength; +} + +/// DVD-CSS Feature (0106h) +public struct Feature_0106 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// CSS version + public byte CSSVersion; +} + +/// Real Time Streaming Feature (0107h) +public struct Feature_0107 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Supports Set Minimum Performance bit in SET STREAMING + public bool SMP; + /// Supports READ BUFFER CAPACITY with block bit set + public bool RBCB; + /// Supports SET CD SPEED + public bool SCS; + /// Has Mode Page 2Ah with Speed Performance Descriptors + public bool MP2A; + /// Supports type 03h of GET PERFORMANCE + public bool WSPD; + /// Supports stream recording + public bool SW; +} + +/// Drive serial number (0108h) +public struct Feature_0108 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Drive serial number + public string Serial; +} + +/// Media Serial Number Feature (0109h) +public struct Feature_0109 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; +} + +/// Disc Control Blocks Feature (010Ah) +public struct Feature_010A +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + public uint[] DCBs; +} + +/// DVD CPRM Feature (010Bh) +public struct Feature_010B +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// CPRM version + public byte CPRMVersion; +} + +/// Firmware Information Feature (010Ch) +public struct Feature_010C +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + public ushort Century; + public ushort Year; + public ushort Month; + public ushort Day; + public ushort Hour; + public ushort Minute; + public ushort Second; +} + +/// AACS Feature (010Dh) +public struct Feature_010D +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Drive supports reading drive certificate + public bool RDC; + /// Drive can read media key block of CPRM + public bool RMC; + /// Drive can write bus encrypted blocks + public bool WBE; + /// Drive supports bus encryption + public bool BEC; + /// Drive supports generating the binding nonce + public bool BNG; + /// Blocks required to store the binding nonce for the media + public byte BindNonceBlocks; + /// Maximum number of AGIDs supported concurrently + public byte AGIDs; + /// AACS version + public byte AACSVersion; +} + +/// DVD CSS Managed Recording Feature (010Eh) +public struct Feature_010E +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Maximum number of Scramble Extent information entries in a single SEND DISC STRUCTURE + public byte MaxScrambleExtent; +} + +/// SecurDisc Feature (0113h) +public struct Feature_0113 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; +} + +/// OSSC Feature (0142h) +public struct Feature_0142 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; + /// Supports PSA updates on write-once media + public bool PSAU; + /// Supports linked OSPBs + public bool LOSPB; + /// Restricted to recording only OSSC disc format + public bool ME; + public ushort[] Profiles; +} + +/// VCPS Feature (0110h) +public struct Feature_0110 +{ + /// Feature version + public byte Version; + /// Feature is persistent + public bool Persistent; + /// Feature is currently in use + public bool Current; +} + +public static class Features +{ + public static Feature_0000? Decode_0000(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 4) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0000) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0000(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + var offset = 4; + List listProfiles = new(); + + while(offset < feature.Length) + { + var prof = new Profile + { + Number = (ProfileNumber)((feature[offset] << 8) + feature[offset + 1]) + }; + + prof.Current |= (feature[offset + 2] & 0x01) == 0x01; + listProfiles.Add(prof); + offset += 4; + } + + decoded.Profiles = listProfiles.ToArray(); + + return decoded; + } + + public static Feature_0001? Decode_0001(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 8) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0001) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0001(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.PhysicalInterfaceStandard = + (PhysicalInterfaces)((feature[4] << 24) + (feature[5] << 16) + (feature[6] << 8) + feature[7]); + + if(decoded.Version >= 1 && feature.Length >= 12) + decoded.DBE |= (feature[8] & 0x01) == 0x01; + + if(decoded.Version >= 2 && feature.Length >= 12) + decoded.INQ2 |= (feature[8] & 0x02) == 0x02; + + return decoded; + } + + public static Feature_0002? Decode_0002(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 8) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0002) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0002(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.Async |= (feature[4] & 0x01) == 0x01; + + if(decoded.Version >= 1) + decoded.OCEvent |= (feature[4] & 0x02) == 0x02; + + return decoded; + } + + public static Feature_0003? Decode_0003(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 8) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0003) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0003(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.LoadingMechanismType = (byte)((feature[4] & 0xE0) >> 5); + decoded.Eject |= (feature[4] & 0x08) == 0x08; + decoded.PreventJumper |= (feature[4] & 0x04) == 0x04; + decoded.Lock |= (feature[4] & 0x01) == 0x01; + + if(decoded.Version < 2) + return decoded; + + decoded.Load |= (feature[4] & 0x10) == 0x10; + decoded.DBML |= (feature[4] & 0x02) == 0x02; + + return decoded; + } + + public static Feature_0004? Decode_0004(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 8) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0004) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0004(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.SPWP |= (feature[4] & 0x02) == 0x02; + decoded.SSWPP |= (feature[4] & 0x01) == 0x01; + + if(decoded.Version >= 1) + decoded.WDCB |= (feature[4] & 0x04) == 0x04; + + if(decoded.Version >= 2) + decoded.DWP |= (feature[4] & 0x08) == 0x08; + + return decoded; + } + + public static Feature_0010? Decode_0010(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 12) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0010) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0010(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.LogicalBlockSize = (uint)((feature[4] << 24) + (feature[5] << 16) + (feature[6] << 8) + feature[7]); + + decoded.Blocking = (ushort)((feature[8] << 8) + feature[9]); + + decoded.PP |= (feature[10] & 0x01) == 0x01; + + return decoded; + } + + public static Feature_001D? Decode_001D(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 4) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x001D) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_001D(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + return decoded; + } + + public static Feature_001E? Decode_001E(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 8) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x001E) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_001E(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + if(decoded.Version >= 1) + { + decoded.C2 |= (feature[4] & 0x02) == 0x02; + decoded.CDText |= (feature[4] & 0x01) == 0x01; + } + + if(decoded.Version >= 2) + decoded.DAP |= (feature[4] & 0x80) == 0x80; + + return decoded; + } + + public static Feature_001F? Decode_001F(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 4) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x001F) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_001F(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + if(decoded.Version >= 2 && feature.Length >= 8) + { + decoded.MULTI110 |= (feature[4] & 0x01) == 0x01; + decoded.DualR |= (feature[6] & 0x01) == 0x01; + } + + // TODO: Check this + if(decoded.Version >= 2 && feature.Length >= 8) + decoded.DualRW |= (feature[6] & 0x02) == 0x02; + + return decoded; + } + + public static Feature_0020? Decode_0020(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 16) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0020) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0020(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + if(decoded.Version < 1) + return decoded; + + decoded.LastLBA = (uint)((feature[4] << 24) + (feature[5] << 16) + (feature[6] << 8) + feature[7]); + + decoded.LogicalBlockSize = (uint)((feature[8] << 24) + (feature[9] << 16) + (feature[10] << 8) + feature[11]); + + decoded.Blocking = (ushort)((feature[12] << 8) + feature[13]); + decoded.PP |= (feature[14] & 0x01) == 0x01; + + return decoded; + } + + public static Feature_0021? Decode_0021(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 8) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0021) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0021(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + if(decoded.Version >= 1) + { + decoded.DataTypeSupported = (ushort)((feature[4] << 8) + feature[5]); + decoded.BUF |= (feature[6] & 0x01) == 0x01; + decoded.LinkSizes = new byte[feature[7]]; + + if(feature.Length > feature[7] + 8) + Array.Copy(feature, 8, decoded.LinkSizes, 0, feature[7]); + } + + if(decoded.Version < 3) + return decoded; + + decoded.TRIO |= (feature[6] & 0x04) == 0x04; + decoded.ARSV |= (feature[6] & 0x02) == 0x02; + + return decoded; + } + + public static Feature_0022? Decode_0022(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 4) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0022) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0022(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + return decoded; + } + + public static Feature_0023? Decode_0023(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 4) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0023) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0023(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + if(decoded.Version >= 1 && feature.Length >= 12) + { + decoded.RENoSA |= (feature[4] & 0x08) == 0x08; + decoded.Expand |= (feature[4] & 0x04) == 0x04; + decoded.QCert |= (feature[4] & 0x02) == 0x02; + decoded.Cert |= (feature[4] & 0x01) == 0x01; + decoded.RRM |= (feature[8] & 0x01) == 0x01; + } + + if(decoded.Version >= 2 && feature.Length >= 12) + decoded.FRF |= (feature[4] & 0x80) == 0x80; + + return decoded; + } + + public static Feature_0024? Decode_0024(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 4) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0024) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0024(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + if(decoded.Version >= 1 && feature.Length >= 8) + decoded.SSA |= (feature[4] & 0x80) == 0x80; + + return decoded; + } + + public static Feature_0025? Decode_0025(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 12) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0025) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0025(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.LogicalBlockSize = (uint)((feature[4] << 24) + (feature[5] << 16) + (feature[6] << 8) + feature[7]); + + decoded.Blocking = (ushort)((feature[8] << 8) + feature[9]); + + decoded.PP |= (feature[10] & 0x01) == 0x01; + + return decoded; + } + + public static Feature_0026? Decode_0026(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 4) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0026) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0026(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + return decoded; + } + + public static Feature_0027? Decode_0027(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 8) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0027) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0027(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + return decoded; + } + + public static Feature_0028? Decode_0028(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 8) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0028) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0028(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.Write |= (feature[4] & 0x01) == 0x01; + + if(decoded.Version < 1) + return decoded; + + decoded.DVDPWrite |= (feature[4] & 0x04) == 0x04; + decoded.DVDPRead |= (feature[4] & 0x02) == 0x02; + + return decoded; + } + + public static Feature_0029? Decode_0029(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 8) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0029) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0029(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.DRTDM |= (feature[4] & 0x01) == 0x01; + decoded.DBICacheZones = feature[5]; + decoded.Entries = (ushort)((feature[6] << 8) + feature[7]); + + return decoded; + } + + public static Feature_002A? Decode_002A(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 8) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x002A) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_002A(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.Write |= (feature[4] & 0x01) == 0x01; + decoded.CloseOnly |= (feature[5] & 0x01) == 0x01; + + if(decoded.Version >= 1) + decoded.QuickStart |= (feature[5] & 0x02) == 0x02; + + return decoded; + } + + public static Feature_002B? Decode_002B(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 8) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x002B) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_002B(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.Write |= (feature[4] & 0x01) == 0x01; + + return decoded; + } + + public static Feature_002C? Decode_002C(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 8) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x002C) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_002C(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.DSDG |= (feature[4] & 0x08) == 0x08; + decoded.DSDR |= (feature[4] & 0x04) == 0x04; + decoded.Intermediate |= (feature[4] & 0x02) == 0x02; + decoded.Blank |= (feature[4] & 0x01) == 0x01; + + return decoded; + } + + public static Feature_002D? Decode_002D(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 8) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x002D) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_002D(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.TestWrite |= (feature[4] & 0x04) == 0x04; + decoded.CDRW |= (feature[4] & 0x02) == 0x02; + decoded.RWSubchannel |= (feature[4] & 0x01) == 0x01; + decoded.DataTypeSupported = (ushort)((feature[6] << 8) + feature[7]); + + if(decoded.Version < 2) + return decoded; + + decoded.BUF |= (feature[4] & 0x40) == 0x40; + decoded.RWRaw |= (feature[4] & 0x10) == 0x10; + decoded.RWPack |= (feature[4] & 0x08) == 0x08; + + return decoded; + } + + public static Feature_002E? Decode_002E(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 8) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x002E) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_002E(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.SAO |= (feature[4] & 0x20) == 0x20; + decoded.RAWMS |= (feature[4] & 0x10) == 0x10; + decoded.RAW |= (feature[4] & 0x08) == 0x08; + decoded.TestWrite |= (feature[4] & 0x04) == 0x04; + decoded.CDRW |= (feature[4] & 0x02) == 0x02; + decoded.RW |= (feature[4] & 0x01) == 0x01; + decoded.MaxCueSheet = (uint)((feature[5] << 16) + (feature[6] << 8) + feature[7]); + + if(decoded.Version >= 1) + decoded.BUF |= (feature[4] & 0x40) == 0x40; + + return decoded; + } + + public static Feature_002F? Decode_002F(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 8) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x002F) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_002F(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.BUF |= (feature[4] & 0x40) == 0x40; + decoded.TestWrite |= (feature[4] & 0x04) == 0x04; + + if(decoded.Version >= 1) + decoded.DVDRW |= (feature[4] & 0x02) == 0x02; + + if(decoded.Version >= 2) + decoded.RDL |= (feature[4] & 0x08) == 0x08; + + return decoded; + } + + public static Feature_0030? Decode_0030(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 4) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0030) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0030(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + return decoded; + } + + public static Feature_0031? Decode_0031(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 8) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0031) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0031(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.TestWrite |= (feature[4] & 0x04) == 0x04; + + return decoded; + } + + public static Feature_0032? Decode_0032(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 8) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0032) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0032(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.Intermediate |= (feature[4] & 0x02) == 0x02; + decoded.Blank |= (feature[4] & 0x01) == 0x01; + + return decoded; + } + + public static Feature_0033? Decode_0033(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 8) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0033) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0033(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + if(feature[7] <= 0 || feature.Length <= feature[7] + 8) + return decoded; + + decoded.LinkSizes = new byte[feature[7]]; + Array.Copy(feature, 8, decoded.LinkSizes, 0, feature[7]); + + return decoded; + } + + public static Feature_0035? Decode_0035(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 4) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0035) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0035(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + return decoded; + } + + public static Feature_0037? Decode_0037(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 8) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0037) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0037(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.SubtypeSupport = feature[5]; + + return decoded; + } + + public static Feature_0038? Decode_0038(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 8) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0038) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0038(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + return decoded; + } + + public static Feature_003A? Decode_003A(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 8) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x003A) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_003A(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.Write |= (feature[4] & 0x01) == 0x01; + decoded.QuickStart |= (feature[5] & 0x02) == 0x02; + decoded.CloseOnly |= (feature[5] & 0x01) == 0x01; + + return decoded; + } + + public static Feature_003B? Decode_003B(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 8) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x003B) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_003B(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.Write |= (feature[4] & 0x01) == 0x01; + + return decoded; + } + + public static Feature_0040? Decode_0040(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 32) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0040) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0040(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.OldRE |= (feature[9] & 0x01) == 0x01; + decoded.OldR |= (feature[17] & 0x01) == 0x01; + decoded.OldROM |= (feature[25] & 0x01) == 0x01; + + if(decoded.Version < 1) + return decoded; + + decoded.BCA |= (feature[4] & 0x01) == 0x01; + decoded.RE2 |= (feature[9] & 0x04) == 0x04; + decoded.RE1 |= (feature[9] & 0x02) == 0x02; + decoded.R |= (feature[17] & 0x02) == 0x02; + decoded.ROM |= (feature[25] & 0x02) == 0x02; + + return decoded; + } + + public static Feature_0041? Decode_0041(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 24) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0041) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0041(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.SVNR |= (feature[4] & 0x01) == 0x01; + decoded.OldRE |= (feature[9] & 0x01) == 0x01; + decoded.OldR |= (feature[17] & 0x01) == 0x01; + + if(decoded.Version < 1) + return decoded; + + decoded.RE2 |= (feature[9] & 0x04) == 0x04; + decoded.RE1 |= (feature[9] & 0x02) == 0x02; + decoded.R |= (feature[17] & 0x02) == 0x02; + + return decoded; + } + + public static Feature_0042? Decode_0042(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 4) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0042) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0042(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + return decoded; + } + + public static Feature_0050? Decode_0050(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 8) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0050) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0050(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.HDDVDR |= (feature[4] & 0x01) == 0x01; + decoded.HDDVDRAM |= (feature[6] & 0x01) == 0x01; + + return decoded; + } + + public static Feature_0051? Decode_0051(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 8) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0051) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0051(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.HDDVDR |= (feature[4] & 0x01) == 0x01; + decoded.HDDVDRAM |= (feature[6] & 0x01) == 0x01; + + return decoded; + } + + public static Feature_0080? Decode_0080(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 8) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0080) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0080(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.RI |= (feature[4] & 0x01) == 0x01; + + return decoded; + } + + public static Feature_0100? Decode_0100(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 4) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0100) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0100(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + return decoded; + } + + public static Feature_0101? Decode_0101(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 8) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0101) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0101(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.PP |= (feature[4] & 0x01) == 0x01; + + return decoded; + } + + public static Feature_0102? Decode_0102(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 4) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0102) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0102(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.SCC |= (feature[4] & 0x10) == 0x10; + decoded.SDP |= (feature[4] & 0x04) == 0x04; + decoded.HighestSlotNumber = (byte)(feature[7] & 0x1F); + + return decoded; + } + + public static Feature_0103? Decode_0103(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 8) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0103) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0103(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.Scan |= (feature[4] & 0x04) == 0x04; + decoded.SCM |= (feature[4] & 0x02) == 0x02; + decoded.SV |= (feature[4] & 0x01) == 0x01; + decoded.VolumeLevels = (ushort)((feature[6] << 8) + feature[7]); + + return decoded; + } + + public static Feature_0104? Decode_0104(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 4) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0104) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0104(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + if(decoded.Version >= 1 && feature.Length >= 8) + decoded.M5 |= (feature[4] & 0x01) == 0x01; + + return decoded; + } + + public static Feature_0105? Decode_0105(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 4) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0105) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0105(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + if(decoded.Version < 1 || feature.Length < 8) + return decoded; + + decoded.Group3 |= (feature[4] & 0x01) == 0x01; + decoded.UnitLength = (ushort)((feature[6] << 8) + feature[7]); + + return decoded; + } + + public static Feature_0106? Decode_0106(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 8) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0106) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0106(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.CSSVersion = feature[7]; + + return decoded; + } + + public static Feature_0107? Decode_0107(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 4) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0107) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0107(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + if(decoded.Version >= 3 && feature.Length >= 8) + { + decoded.RBCB |= (feature[4] & 0x10) == 0x10; + decoded.SCS |= (feature[4] & 0x08) == 0x08; + decoded.MP2A |= (feature[4] & 0x04) == 0x04; + decoded.WSPD |= (feature[4] & 0x02) == 0x02; + decoded.SW |= (feature[4] & 0x01) == 0x01; + } + + if(decoded.Version < 5 || feature.Length < 8) + return decoded; + + decoded.SMP |= (feature[4] & 0x20) == 0x20; + decoded.RBCB |= (feature[4] & 0x10) == 0x10; + + return decoded; + } + + public static Feature_0108? Decode_0108(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 4) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0108) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0108(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + var serial = new byte[feature.Length]; + Array.Copy(feature, 4, serial, 0, feature.Length - 4); + decoded.Serial = StringHandlers.CToString(serial).Trim(); + + return decoded; + } + + public static Feature_0109? Decode_0109(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 4) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0109) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0109(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + return decoded; + } + + public static Feature_010A? Decode_010A(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 8) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x010A) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_010A(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.DCBs = new uint[feature[3] / 4]; + + for(var i = 0; i < decoded.DCBs.Length; i++) + { + decoded.DCBs[i] = (uint)((feature[0 + 4 + i * 4] << 24) + + (feature[1 + 4 + i * 4] << 16) + + (feature[2 + 4 + i * 4] << 8) + + feature[3 + 4 + i * 4]); + } + + return decoded; + } + + public static Feature_010B? Decode_010B(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 4) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x010B) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_010B(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.CPRMVersion = feature[7]; + + return decoded; + } + + public static Feature_010C? Decode_010C(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 20) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x010C) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_010C(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.Century = (ushort)((feature[4] << 8) + feature[5]); + decoded.Year = (ushort)((feature[6] << 8) + feature[7]); + decoded.Month = (ushort)((feature[8] << 8) + feature[9]); + decoded.Day = (ushort)((feature[10] << 8) + feature[11]); + decoded.Hour = (ushort)((feature[12] << 8) + feature[13]); + decoded.Minute = (ushort)((feature[14] << 8) + feature[15]); + decoded.Second = (ushort)((feature[16] << 8) + feature[17]); + + return decoded; + } + + public static Feature_010D? Decode_010D(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 8) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x010D) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_010D(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.BNG |= (feature[4] & 0x01) == 0x01; + decoded.BindNonceBlocks = feature[5]; + decoded.AGIDs = (byte)(feature[6] & 0x0F); + decoded.AACSVersion = feature[7]; + + if(decoded.Version < 2) + return decoded; + + decoded.RDC |= (feature[4] & 0x10) == 0x10; + decoded.RMC |= (feature[4] & 0x08) == 0x08; + decoded.WBE |= (feature[4] & 0x04) == 0x04; + decoded.BEC |= (feature[4] & 0x02) == 0x02; + + return decoded; + } + + public static Feature_010E? Decode_010E(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 8) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x010E) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_010E(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.MaxScrambleExtent = feature[4]; + + return decoded; + } + + public static Feature_0110? Decode_0110(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 8) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0110) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0110(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + return decoded; + } + + public static Feature_0113? Decode_0113(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 4) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0113) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0113(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + return decoded; + } + + public static Feature_0142? Decode_0142(byte[] feature) + { + if(feature == null) + return null; + + if(feature.Length < 6) + return null; + + var number = (ushort)((feature[0] << 8) + feature[1]); + + if(number != 0x0142) + return null; + + if(feature[3] + 4 != feature.Length) + return null; + + var decoded = new Feature_0142(); + + decoded.Current |= (feature[2] & 0x01) == 0x01; + decoded.Persistent |= (feature[2] & 0x02) == 0x02; + decoded.Version = (byte)((feature[2] & 0x3C) >> 2); + + decoded.PSAU |= (feature[4] & 0x80) == 0x80; + decoded.LOSPB |= (feature[4] & 0x40) == 0x40; + decoded.ME |= (feature[4] & 0x01) == 0x01; + decoded.Profiles = new ushort[feature[5]]; + + if(feature[5] * 2 + 6 != feature.Length) + return decoded; + + for(var i = 0; i < feature[5]; i++) + decoded.Profiles[i] = (ushort)((feature[0 + 6 + 2 * i] << 8) + feature[1 + 6 + 2 * i]); + + return decoded; + } + + public static string Prettify_0000(Feature_0000? feature) + { + if(!feature.HasValue) + return null; + + Feature_0000 ftr = feature.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.MMC_Supported_Profiles); + + if(ftr.Profiles == null) + return sb.ToString(); + + foreach(Profile prof in ftr.Profiles) + { + switch(prof.Number) + { + case ProfileNumber.Reserved: + sb.Append("\t" + Localization.Drive_reported_a_reserved_profile_number); + + break; + case ProfileNumber.NonRemovable: + sb.Append("\t" + Localization.Drive_supports_non_removable_changeable_media); + + break; + case ProfileNumber.Removable: + sb.Append("\t" + Localization.Drive_supports_rewritable_and_removable_media); + + break; + case ProfileNumber.MOErasable: + sb.Append("\t" + Localization.Drive_supports_Magneto_Optical_media); + + break; + case ProfileNumber.OpticalWORM: + sb.Append("\t" + Localization.Drive_supports_optical_write_once_media); + + break; + case ProfileNumber.ASMO: + sb.Append("\t" + Localization.Drive_supports_Advanced_Storage_Magneto_Optical); + + break; + case ProfileNumber.CDROM: + sb.Append("\t" + Localization.Drive_supports_CD_ROM); + + break; + case ProfileNumber.CDR: + sb.Append("\t" + Localization.Drive_supports_CD_R); + + break; + case ProfileNumber.CDRW: + sb.Append("\t" + Localization.Drive_supports_CD_RW); + + break; + case ProfileNumber.DVDROM: + sb.Append("\t" + Localization.Drive_supports_DVD_ROM); + + break; + case ProfileNumber.DVDRSeq: + sb.Append("\t" + Localization.Drive_supports_DVD_R); + + break; + case ProfileNumber.DVDRAM: + sb.Append("\t" + Localization.Drive_supports_DVD_RAM); + + break; + case ProfileNumber.DVDRWRes: + sb.Append("\t" + Localization.Drive_supports_restricted_overwrite_DVD_RW); + + break; + case ProfileNumber.DVDRWSeq: + sb.Append("\t" + Localization.Drive_supports_sequentially_recorded_DVD_RW); + + break; + case ProfileNumber.DVDRDLSeq: + sb.Append("\t" + Localization.Drive_supports_sequentially_recorded_DVD_R_DL); + + break; + case ProfileNumber.DVDRDLJump: + sb.Append("\t" + Localization.Drive_supports_layer_jump_recorded_DVD_R_DL); + + break; + case ProfileNumber.DVDRWDL: + sb.Append("\t" + Localization.Drive_supports_DVD_RW_DL); + + break; + case ProfileNumber.DVDDownload: + sb.Append("\t" + Localization.Drive_supports_DVD_Download); + + break; + case ProfileNumber.DVDRWPlus: + sb.Append("\t" + Localization.Drive_supports_DVD_Plus_RW); + + break; + case ProfileNumber.DVDRPlus: + sb.Append("\t" + Localization.Drive_supports_DVD_Plus_R); + + break; + case ProfileNumber.DDCDROM: + sb.Append("\t" + Localization.Drive_supports_DDCD_ROM); + + break; + case ProfileNumber.DDCDR: + sb.Append("\t" + Localization.Drive_supports_DDCD_R); + + break; + case ProfileNumber.DDCDRW: + sb.Append("\t" + Localization.Drive_supports_DDCD_RW); + + break; + case ProfileNumber.DVDRWDLPlus: + sb.Append("\t" + Localization.Drive_supports_DVD_Plus_RW_DL); + + break; + case ProfileNumber.DVDRDLPlus: + sb.Append("\t" + Localization.Drive_supports_DVD_Plus_R_DL); + + break; + case ProfileNumber.BDROM: + sb.Append("\t" + Localization.Drive_supports_BD_ROM); + + break; + case ProfileNumber.BDRSeq: + sb.Append("\t" + Localization.Drive_supports_BD_R_SRM); + + break; + case ProfileNumber.BDRRdm: + sb.Append("\t" + Localization.Drive_supports_BD_R_RRM); + + break; + case ProfileNumber.BDRE: + sb.Append("\t" + Localization.Drive_supports_BD_RE); + + break; + case ProfileNumber.HDDVDROM: + sb.Append("\t" + Localization.Drive_supports_HD_DVD_ROM); + + break; + case ProfileNumber.HDDVDR: + sb.Append("\t" + Localization.Drive_supports_HD_DVD_R); + + break; + case ProfileNumber.HDDVDRAM: + sb.Append("\t" + Localization.Drive_supports_HD_DVD_RAM); + + break; + case ProfileNumber.HDDVDRW: + sb.Append("\t" + Localization.Drive_supports_HD_DVD_RW); + + break; + case ProfileNumber.HDDVDRDL: + sb.Append("\t" + Localization.Drive_supports_HD_DVD_R_DL); + + break; + case ProfileNumber.HDDVDRWDL: + sb.Append("\t" + Localization.Drive_supports_HD_DVD_RW_DL); + + break; + case ProfileNumber.HDBURNROM: + sb.Append("\t" + Localization.Drive_supports_HDBurn_CD_ROM); + + break; + case ProfileNumber.HDBURNR: + sb.Append("\t" + Localization.Drive_supports_HDBurn_CD_R); + + break; + case ProfileNumber.HDBURNRW: + sb.Append("\t" + Localization.Drive_supports_HDBurn_CD_RW); + + break; + case ProfileNumber.Unconforming: + sb.Append("\t" + Localization.Drive_is_not_conforming_to_any_profile); + + break; + default: + sb.AppendFormat("\t" + Localization.Drive_informs_of_unknown_profile_0, (ushort)prof.Number); + + break; + } + + if(prof.Current) + sb.AppendLine(Localization.current); + else + sb.AppendLine(); + } + + return sb.ToString(); + } + + public static string Prettify_0001(Feature_0001? feature) + { + if(!feature.HasValue) + return null; + + Feature_0001 ftr = feature.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.MMC_Core_Feature); + sb.Append("\t"); + + switch(ftr.PhysicalInterfaceStandard) + { + case PhysicalInterfaces.Unspecified: + sb.AppendLine(Localization.Drive_uses_an_unspecified_physical_interface); + + break; + case PhysicalInterfaces.SCSI: + sb.AppendLine(Localization.Drive_uses_a_SCSI_interface); + + break; + case PhysicalInterfaces.ATAPI: + sb.AppendLine(Localization.Drive_uses_an_ATAPI_interface); + + break; + case PhysicalInterfaces.IEEE1394: + sb.AppendLine(Localization.Drive_uses_an_IEEE_1394_interface); + + break; + case PhysicalInterfaces.IEEE1394A: + sb.AppendLine(Localization.Drive_uses_an_IEEE_1394A_interface); + + break; + case PhysicalInterfaces.FC: + sb.AppendLine(Localization.Drive_uses_a_Fibre_Channel_interface); + + break; + case PhysicalInterfaces.IEEE1394B: + sb.AppendLine(Localization.Drive_uses_an_IEEE_1394B_interface); + + break; + case PhysicalInterfaces.SerialATAPI: + sb.AppendLine(Localization.Drive_uses_a_Serial_ATAPI_interface); + + break; + case PhysicalInterfaces.USB: + sb.AppendLine(Localization.Drive_uses_an_USB_interface); + + break; + case PhysicalInterfaces.Vendor: + sb.AppendLine(Localization.Drive_uses_a_vendor_unique_interface); + + break; + default: + sb.AppendFormat(Localization.Drive_uses_an_unknown_interface_with_code_0, + (uint)ftr.PhysicalInterfaceStandard). + AppendLine(); + + break; + } + + if(ftr.DBE) + sb.AppendLine("\t" + Localization.Drive_supports_Device_Busy_events); + + if(ftr.INQ2) + { + sb.AppendLine("\t" + + Localization. + Drive_supports_EVPD_Page_Code_and_16_bit_Allocation_Length_as_described_in_SPC_3); + } + + return sb.ToString(); + } + + public static string Prettify_0002(Feature_0002? feature) + { + if(!feature.HasValue) + return null; + + Feature_0002 ftr = feature.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.MMC_Morphing); + + sb.AppendLine(ftr.Async + ? "\t" + Localization.Drive_supports_polling_and_asynchronous_GET_EVENT_STATUS_NOTIFICATION + : "\t" + Localization.Drive_supports_only_polling_GET_EVENT_STATUS_NOTIFICATION); + + if(ftr.OCEvent) + sb.AppendLine("\t" + Localization.Drive_supports_operational_change_request_notification_class_events); + + return sb.ToString(); + } + + public static string Prettify_0003(Feature_0003? feature) + { + if(!feature.HasValue) + return null; + + Feature_0003 ftr = feature.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.Features_Prettify_0003_MMC_Removable_Medium); + + switch(ftr.LoadingMechanismType) + { + case 0: + sb.AppendLine("\t" + Localization.Features_Prettify_0003_Drive_uses_media_caddy); + + break; + case 1: + sb.AppendLine("\t" + Localization.Features_Prettify_0003_Drive_uses_a_tray); + + break; + case 2: + sb.AppendLine("\t" + Localization.Features_Prettify_0003_Drive_is_pop_up); + + break; + case 4: + sb.AppendLine("\t" + + Localization. + Features_Prettify_0003_Drive_is_a_changer_with_individually_changeable_discs); + + break; + case 5: + sb.AppendLine("\t" + Localization.Features_Prettify_0003_Drive_is_a_changer_using_cartridges); + + break; + default: + sb.AppendFormat("\t" + Localization.Features_Prettify_0003_Drive_uses_unknown_loading_mechanism_type_0, + ftr.LoadingMechanismType). + AppendLine(); + + break; + } + + if(ftr.Lock) + sb.AppendLine("\t" + Localization.Features_Prettify_0003_Drive_can_lock_media); + + if(ftr.PreventJumper) + sb.AppendLine("\t" + Localization.Features_Prettify_0003_Drive_power_ups_locked); + + if(ftr.Eject) + sb.AppendLine("\t" + Localization.Features_Prettify_0003_Drive_can_eject_media); + + if(ftr.Load) + sb.AppendLine("\t" + Localization.Features_Prettify_0003_Drive_can_load_media); + + if(ftr.DBML) + { + sb.AppendLine("\t" + + Localization. + Features_Prettify_0003_Drive_reports_Device_Busy_Class_events_during_medium_loading_unloading); + } + + return sb.ToString(); + } + + public static string Prettify_0004(Feature_0004? feature) + { + if(!feature.HasValue) + return null; + + Feature_0004 ftr = feature.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.MMC_Write_Protect); + + if(ftr.DWP) + { + sb.AppendLine("\t" + + Localization.Drive_supports_reading_writing_the_Disc_Write_Protect_PAC_on_BD_R_RE_media); + } + + if(ftr.WDCB) + sb.AppendLine("\t" + Localization.Drive_supports_writing_the_Write_Inhibit_DCB_on_DVD_RW_media); + + if(ftr.SPWP) + sb.AppendLine("\t" + Localization.Drive_supports_set_release_of_PWP_status); + + if(ftr.SSWPP) + sb.AppendLine("\t" + Localization.Drive_supports_the_SWPP_bit_of_the_Timeout_and_Protect_mode_page); + + return sb.ToString(); + } + + public static string Prettify_0010(Feature_0010? feature) + { + if(!feature.HasValue) + return null; + + Feature_0010 ftr = feature.Value; + var sb = new StringBuilder(); + + sb.Append(Localization.MMC_Random_Readable); + + if(ftr.Current) + sb.Append(Localization.current); + + sb.AppendLine(":"); + + if(ftr.PP) + sb.AppendLine("\t" + Localization.Drive_shall_report_Read_Write_Error_Recovery_mode_page); + + if(ftr.LogicalBlockSize > 0) + sb.AppendFormat("\t" + Localization._0_bytes_per_logical_block, ftr.LogicalBlockSize).AppendLine(); + + if(ftr.Blocking > 1) + sb.AppendFormat("\t" + Localization._0_logical_blocks_per_media_readable_unit, ftr.Blocking).AppendLine(); + + return sb.ToString(); + } + + public static string Prettify_001D(Feature_001D? feature) => + !feature.HasValue + ? null + : Localization.Drive_claims_capability_to_read_all_CD_formats_according_to_OSTA_Multi_Read_Specification + + "\n"; + + public static string Prettify_001E(Feature_001E? feature) + { + if(!feature.HasValue) + return null; + + Feature_001E ftr = feature.Value; + var sb = new StringBuilder(); + + sb.Append(Localization.MMC_CD_Read); + + if(ftr.Current) + sb.Append(Localization.current); + + sb.AppendLine(":"); + + if(ftr.DAP) + sb.AppendLine("\t" + Localization.Drive_supports_the_DAP_bit_in_the_READ_CD_and_READ_CD_MSF_commands); + + if(ftr.C2) + sb.AppendLine("\t" + Localization.Drive_supports_C2_Error_Pointers); + + if(ftr.CDText) + sb.AppendLine("\t" + Localization.Drive_can_return_CD_Text_from_Lead_In); + + return sb.ToString(); + } + + public static string Prettify_001F(Feature_001F? feature) + { + if(!feature.HasValue) + return null; + + Feature_001F ftr = feature.Value; + var sb = new StringBuilder(); + + sb.Append(Localization.MMC_DVD_Read); + + if(ftr.Current) + sb.Append(Localization.current); + + sb.AppendLine(":"); + sb.AppendLine("\t" + Localization.Drive_can_read_DVD_media); + + if(ftr.DualR) + sb.AppendLine("\t" + Localization.Drive_can_read_DVD_R_DL_from_all_recording_modes); + + if(ftr.DualRW) + sb.AppendLine("\t" + Localization.Drive_can_read_DVD_RW_DL_from_all_recording_modes); + + if(ftr.MULTI110) + sb.AppendLine("\t" + Localization.Drive_conforms_to_DVD_Multi_Drive_Read_only_Specifications); + + return sb.ToString(); + } + + public static string Prettify_0020(Feature_0020? feature) + { + if(!feature.HasValue) + return null; + + Feature_0020 ftr = feature.Value; + var sb = new StringBuilder(); + + sb.Append(Localization.MMC_Random_Writable); + + if(ftr.Current) + sb.Append(Localization.current); + + sb.AppendLine(":"); + + if(ftr.PP) + sb.AppendLine("\t" + Localization.Drive_shall_report_Read_Write_Error_Recovery_mode_page); + + if(ftr.LogicalBlockSize > 0) + sb.AppendFormat("\t" + Localization._0_bytes_per_logical_block, ftr.LogicalBlockSize).AppendLine(); + + if(ftr.Blocking > 1) + sb.AppendFormat("\t" + Localization._0_logical_blocks_per_media_writable_unit, ftr.Blocking).AppendLine(); + + if(ftr.LastLBA > 0) + sb.AppendFormat("\t" + Localization.Last_addressable_logical_block_is_0, ftr.LastLBA).AppendLine(); + + return sb.ToString(); + } + + public static string Prettify_0021(Feature_0021? feature) + { + if(!feature.HasValue) + return null; + + Feature_0021 ftr = feature.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.MMC_Incremental_Streaming_Writable); + + if(ftr.DataTypeSupported > 0) + { + sb.Append("\t" + Localization.Drive_supports_data_block_types); + + if((ftr.DataTypeSupported & 0x0001) == 0x0001) + sb.Append(" 0"); + + if((ftr.DataTypeSupported & 0x0002) == 0x0002) + sb.Append(" 1"); + + if((ftr.DataTypeSupported & 0x0004) == 0x0004) + sb.Append(" 2"); + + if((ftr.DataTypeSupported & 0x0008) == 0x0008) + sb.Append(" 3"); + + if((ftr.DataTypeSupported & 0x0010) == 0x0010) + sb.Append(" 4"); + + if((ftr.DataTypeSupported & 0x0020) == 0x0020) + sb.Append(" 5"); + + if((ftr.DataTypeSupported & 0x0040) == 0x0040) + sb.Append(" 6"); + + if((ftr.DataTypeSupported & 0x0080) == 0x0080) + sb.Append(" 7"); + + if((ftr.DataTypeSupported & 0x0100) == 0x0100) + sb.Append(" 8"); + + if((ftr.DataTypeSupported & 0x0200) == 0x0200) + sb.Append(" 9"); + + if((ftr.DataTypeSupported & 0x0400) == 0x0400) + sb.Append(" 10"); + + if((ftr.DataTypeSupported & 0x0800) == 0x0800) + sb.Append(" 11"); + + if((ftr.DataTypeSupported & 0x1000) == 0x1000) + sb.Append(" 12"); + + if((ftr.DataTypeSupported & 0x2000) == 0x2000) + sb.Append(" 13"); + + if((ftr.DataTypeSupported & 0x4000) == 0x4000) + sb.Append(" 14"); + + if((ftr.DataTypeSupported & 0x8000) == 0x8000) + sb.Append(" 15"); + + sb.AppendLine(); + } + + if(ftr.TRIO) + sb.AppendLine("\t" + Localization.Drive_claims_support_to_report_Track_Resources_Information); + + if(ftr.ARSV) + sb.AppendLine("\t" + Localization.Drive_supports_address_mode_reservation_on_the_RESERVE_TRACK_command); + + if(ftr.BUF) + sb.AppendLine("\t" + Localization.Drive_is_capable_of_zero_loss_linking); + + return sb.ToString(); + } + + public static string Prettify_0022(Feature_0022? feature) => + !feature.HasValue ? null : Localization.Drive_supports_media_that_require_erasing_before_writing + "\n"; + + public static string Prettify_0023(Feature_0023? feature) + { + if(!feature.HasValue) + return null; + + Feature_0023 ftr = feature.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.MMC_Formattable); + sb.AppendLine("\t" + Localization.Drive_can_format_media_into_logical_blocks); + + if(ftr.RENoSA) + sb.AppendLine("\t" + Localization.Drive_can_format_BD_RE_with_no_spares_allocated); + + if(ftr.Expand) + sb.AppendLine("\t" + Localization.Drive_can_expand_the_spare_area_on_a_formatted_BD_RE_disc); + + if(ftr.QCert) + sb.AppendLine("\t" + Localization.Drive_can_format_BD_RE_discs_with_quick_certification); + + if(ftr.Cert) + sb.AppendLine("\t" + Localization.Drive_can_format_BD_RE_discs_with_full_certification); + + if(ftr.FRF) + sb.AppendLine("\t" + Localization.Drive_can_fast_re_format_BD_RE_discs); + + if(ftr.RRM) + sb.AppendLine("\t" + Localization.Drive_can_format_BD_R_discs_with_RRM_format); + + return sb.ToString(); + } + + public static string Prettify_0024(Feature_0024? feature) + { + if(!feature.HasValue) + return null; + + Feature_0024 ftr = feature.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.MMC_Hardware_Defect_Management); + sb.AppendLine("\t" + Localization.Drive_shall_be_able_to_provide_a_defect_free_contiguous_address_space); + + if(ftr.SSA) + sb.AppendLine("\t" + Localization.Drive_can_return_Spare_Area_Information); + + return sb.ToString(); + } + + public static string Prettify_0025(Feature_0025? feature) + { + if(!feature.HasValue) + return null; + + Feature_0025 ftr = feature.Value; + var sb = new StringBuilder(); + + sb.Append(Localization.MMC_Write_Once); + + if(ftr.Current) + sb.Append(Localization.current); + + sb.AppendLine(":"); + + if(ftr.PP) + sb.AppendLine("\t" + Localization.Drive_shall_report_Read_Write_Error_Recovery_mode_page); + + if(ftr.LogicalBlockSize > 0) + sb.AppendFormat("\t" + Localization._0_bytes_per_logical_block, ftr.LogicalBlockSize).AppendLine(); + + if(ftr.Blocking > 1) + sb.AppendFormat("\t" + Localization._0_logical_blocks_per_media_writable_unit, ftr.Blocking).AppendLine(); + + return sb.ToString(); + } + + public static string Prettify_0026(Feature_0026? feature) => + !feature.HasValue + ? null + : Localization.Drive_shall_have_the_ability_to_overwrite_logical_blocks_only_in_fixed_sets_at_a_time + "\n"; + + public static string Prettify_0027(Feature_0027? feature) + { + if(!feature.HasValue) + return null; + + Feature_0027 ftr = feature.Value; + var sb = new StringBuilder(); + + sb.Append(Localization.Drive_can_write_High_Speed_CD_RW); + + if(ftr.Current) + sb.AppendLine(Localization.current); + else + sb.AppendLine(); + + return sb.ToString(); + } + + public static string Prettify_0028(Feature_0028? feature) + { + if(!feature.HasValue) + return null; + + Feature_0028 ftr = feature.Value; + var sb = new StringBuilder(); + + if(ftr.Write && ftr is { DVDPRead: true, DVDPWrite: true }) + sb.Append(Localization.Drive_can_read_and_write_CD_MRW_and_DVD_MRW); + else if(ftr is { DVDPRead: true, DVDPWrite: true }) + sb.Append(Localization.Drive_can_read_and_write_DVD_MRW); + else + { + switch(ftr.Write) + { + case true when ftr.DVDPRead: + sb.Append(Localization.Drive_and_read_DVD_MRW_and_read_and_write_CD_MRW); + + break; + case true: + sb.Append(Localization.Drive_can_read_and_write_CD_MRW); + + break; + default: + { + sb.Append(ftr.DVDPRead + ? Localization.Drive_can_read_CD_MRW_and_DVD_MRW + : Localization.Drive_can_read_CD_MRW); + + break; + } + } + } + + if(ftr.Current) + sb.AppendLine(Localization.current); + else + sb.AppendLine(); + + return sb.ToString(); + } + + public static string Prettify_0029(Feature_0029? feature) + { + if(!feature.HasValue) + return null; + + Feature_0029 ftr = feature.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.MMC_Enhanced_Defect_Reporting_Feature); + + sb.AppendLine(ftr.DRTDM + ? "\t" + Localization.Drive_supports_DRT_DM_mode + : "\t" + Localization.Drive_supports_Persistent_DM_mode); + + if(ftr.DBICacheZones > 0) + sb.AppendFormat("\t" + Localization.Drive_has_0_DBI_cache_zones, ftr.DBICacheZones).AppendLine(); + + if(ftr.Entries > 0) + sb.AppendFormat("\t" + Localization.Drive_has_0_DBI_entries, ftr.Entries).AppendLine(); + + return sb.ToString(); + } + + public static string Prettify_002A(Feature_002A? feature) + { + if(!feature.HasValue) + return null; + + Feature_002A ftr = feature.Value; + var sb = new StringBuilder(); + + if(ftr.Write) + { + sb.Append(Localization.Drive_can_read_and_write_DVD_RW); + + if(ftr.Current) + sb.AppendLine(Localization.current); + else + sb.AppendLine(); + + sb.AppendLine(ftr.CloseOnly + ? "\t" + Localization.Drive_supports_only_the_read_compatibility_stop + : "\t" + Localization.Drive_supports_both_forms_of_background_format_stopping); + + if(ftr.QuickStart) + sb.AppendLine("\t" + Localization.Drive_can_do_a_quick_start_formatting); + } + else + { + sb.Append(Localization.Drive_can_read_DVD_Plus_RW); + + if(ftr.Current) + sb.AppendLine(Localization.current); + else + sb.AppendLine(); + } + + return sb.ToString(); + } + + public static string Prettify_002B(Feature_002B? feature) + { + if(!feature.HasValue) + return null; + + Feature_002B ftr = feature.Value; + var sb = new StringBuilder(); + + if(ftr.Write) + { + sb.Append(Localization.Drive_can_read_and_write_DVD_Plus_R); + + if(ftr.Current) + sb.AppendLine(Localization.current); + else + sb.AppendLine(); + } + else + { + sb.Append(Localization.Drive_can_read_DVD_Plus_R); + + if(ftr.Current) + sb.AppendLine(Localization.current); + else + sb.AppendLine(); + } + + return sb.ToString(); + } + + public static string Prettify_002C(Feature_002C? feature) + { + if(!feature.HasValue) + return null; + + Feature_002C ftr = feature.Value; + var sb = new StringBuilder(); + + sb.Append(Localization.MMC_Rigid_Restricted_Overwrite); + sb.AppendLine(ftr.Current ? $"{Localization.current}:" : ":"); + + if(ftr.Blank) + sb.AppendLine("\t" + Localization.Drive_supports_the_BLANK_command); + + if(ftr.Intermediate) + { + sb.AppendLine("\t" + + Localization.Drive_supports_writing_on_an_intermediate_state_session_and_quick_formatting); + } + + if(ftr.DSDR) + sb.AppendLine("\t" + Localization.Drive_can_read_Defect_Status_data_recorded_on_the_medium); + + if(ftr.DSDG) + sb.AppendLine("\t" + Localization.Drive_can_generate_Defect_Status_data_during_formatting); + + return sb.ToString(); + } + + public static string Prettify_002D(Feature_002D? feature) + { + if(!feature.HasValue) + return null; + + Feature_002D ftr = feature.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.Drive_can_write_CDs_in_Track_at_Once_Mode); + + if(ftr.RWSubchannel) + { + sb.AppendLine("\t" + Localization.Drive_can_write_user_provided_data_in_the_R_W_subchannels); + + if(ftr.RWRaw) + sb.AppendLine("\t" + Localization.Drive_accepts_RAW_R_W_subchannel_data); + + if(ftr.RWPack) + sb.AppendLine("\t" + Localization.Drive_accepts_Packed_R_W_subchannel_data); + } + + if(ftr.CDRW) + sb.AppendLine("\t" + Localization.Drive_can_overwrite_a_TAO_track_with_another_in_CD_RWs); + + if(ftr.TestWrite) + sb.AppendLine("\t" + Localization.Drive_can_do_a_test_writing); + + if(ftr.BUF) + sb.AppendLine("\t" + Localization.Drive_supports_zero_loss_linking); + + if(ftr.DataTypeSupported <= 0) + return sb.ToString(); + + sb.Append("\t" + Localization.Drive_supports_data_block_types); + + if((ftr.DataTypeSupported & 0x0001) == 0x0001) + sb.Append(" 0"); + + if((ftr.DataTypeSupported & 0x0002) == 0x0002) + sb.Append(" 1"); + + if((ftr.DataTypeSupported & 0x0004) == 0x0004) + sb.Append(" 2"); + + if((ftr.DataTypeSupported & 0x0008) == 0x0008) + sb.Append(" 3"); + + if((ftr.DataTypeSupported & 0x0010) == 0x0010) + sb.Append(" 4"); + + if((ftr.DataTypeSupported & 0x0020) == 0x0020) + sb.Append(" 5"); + + if((ftr.DataTypeSupported & 0x0040) == 0x0040) + sb.Append(" 6"); + + if((ftr.DataTypeSupported & 0x0080) == 0x0080) + sb.Append(" 7"); + + if((ftr.DataTypeSupported & 0x0100) == 0x0100) + sb.Append(" 8"); + + if((ftr.DataTypeSupported & 0x0200) == 0x0200) + sb.Append(" 9"); + + if((ftr.DataTypeSupported & 0x0400) == 0x0400) + sb.Append(" 10"); + + if((ftr.DataTypeSupported & 0x0800) == 0x0800) + sb.Append(" 11"); + + if((ftr.DataTypeSupported & 0x1000) == 0x1000) + sb.Append(" 12"); + + if((ftr.DataTypeSupported & 0x2000) == 0x2000) + sb.Append(" 13"); + + if((ftr.DataTypeSupported & 0x4000) == 0x4000) + sb.Append(" 14"); + + if((ftr.DataTypeSupported & 0x8000) == 0x8000) + sb.Append(" 15"); + + sb.AppendLine(); + + return sb.ToString(); + } + + public static string Prettify_002E(Feature_002E? feature) + { + if(!feature.HasValue) + return null; + + Feature_002E ftr = feature.Value; + var sb = new StringBuilder(); + + switch(ftr.SAO) + { + case true when !ftr.RAW: + sb.AppendLine(Localization.Drive_can_write_CDs_in_Session_at_Once_Mode); + + break; + case false when ftr.RAW: + sb.AppendLine(Localization.Drive_can_write_CDs_in_raw_Mode); + + break; + default: + sb.AppendLine(Localization.Drive_can_write_CDs_in_Session_at_Once_and_in_Raw_Modes); + + break; + } + + if(ftr is { RAW: true, RAWMS: true }) + sb.AppendLine("\t" + Localization.Drive_can_write_multi_session_CDs_in_raw_mode); + + if(ftr.RW) + sb.AppendLine("\t" + Localization.Drive_can_write_user_provided_data_in_the_R_W_subchannels); + + if(ftr.CDRW) + sb.AppendLine("\t" + Localization.Drive_can_write_CD_RW); + + if(ftr.TestWrite) + sb.AppendLine("\t" + Localization.Drive_can_do_a_test_writing); + + if(ftr.BUF) + sb.AppendLine("\t" + Localization.Drive_supports_zero_loss_linking); + + if(ftr.MaxCueSheet > 0) + { + sb.AppendFormat("\t" + Localization.Drive_supports_a_maximum_of_0_bytes_in_a_single_cue_sheet, + ftr.MaxCueSheet). + AppendLine(); + } + + return sb.ToString(); + } + + public static string Prettify_002F(Feature_002F? feature) + { + if(!feature.HasValue) + return null; + + Feature_002F ftr = feature.Value; + var sb = new StringBuilder(); + + if(ftr is { DVDRW: true, RDL: true }) + sb.AppendLine(Localization.Drive_supports_writing_DVD_R_DVD_RW_and_DVD_R_DL); + else if(ftr.RDL) + sb.AppendLine(Localization.Drive_supports_writing_DVD_R_and_DVD_R_DL); + else if(ftr.DVDRW) + sb.AppendLine(Localization.Drive_supports_writing_DVD_R_and_DVD_RW); + else + sb.AppendLine(Localization.Drive_supports_writing_DVD_R); + + if(ftr.TestWrite) + sb.AppendLine("\t" + Localization.Drive_can_do_a_test_writing); + + if(ftr.BUF) + sb.AppendLine("\t" + Localization.Drive_supports_zero_loss_linking); + + return sb.ToString(); + } + + public static string Prettify_0030(Feature_0030? feature) => + !feature.HasValue ? null : Localization.Drive_can_read_DDCDs + "\n"; + + public static string Prettify_0031(Feature_0031? feature) + { + if(!feature.HasValue) + return null; + + Feature_0031 ftr = feature.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.Drive_supports_writing_DDCD_R); + + if(ftr.TestWrite) + sb.AppendLine("\t" + Localization.Drive_can_do_a_test_writing); + + return sb.ToString(); + } + + public static string Prettify_0032(Feature_0032? feature) + { + if(!feature.HasValue) + return null; + + Feature_0032 ftr = feature.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.Drive_supports_writing_DDCD_RW); + + if(ftr.Blank) + sb.AppendLine("\t" + Localization.Drive_supports_the_BLANK_command); + + if(ftr.Intermediate) + sb.AppendLine("\t" + Localization.Drive_supports_quick_formatting); + + return sb.ToString(); + } + + public static string Prettify_0033(Feature_0033? feature) + { + if(!feature.HasValue) + return null; + + Feature_0033 ftr = feature.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.MMC_Layer_Jump_Recording); + + if(ftr.LinkSizes == null) + return sb.ToString(); + + foreach(byte link in ftr.LinkSizes) + sb.AppendFormat("\t" + Localization.Current_media_has_a_0_bytes_link_available, link).AppendLine(); + + return sb.ToString(); + } + + public static string Prettify_0035(Feature_0035? feature) => + !feature.HasValue ? null : Localization.Drive_can_stop_a_long_immediate_operation + "\n"; + + public static string Prettify_0037(Feature_0037? feature) + { + if(!feature.HasValue) + return null; + + Feature_0037 ftr = feature.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.Drive_can_write_CD_RW); + + if(ftr.SubtypeSupport <= 0) + return sb.ToString(); + + sb.Append("\t" + Localization.Drive_supports_CD_RW_subtypes); + + if((ftr.SubtypeSupport & 0x01) == 0x01) + sb.Append(" 0"); + + if((ftr.SubtypeSupport & 0x02) == 0x02) + sb.Append(" 1"); + + if((ftr.SubtypeSupport & 0x04) == 0x04) + sb.Append(" 2"); + + if((ftr.SubtypeSupport & 0x08) == 0x08) + sb.Append(" 3"); + + if((ftr.SubtypeSupport & 0x10) == 0x10) + sb.Append(" 4"); + + if((ftr.SubtypeSupport & 0x20) == 0x20) + sb.Append(" 5"); + + if((ftr.SubtypeSupport & 0x40) == 0x40) + sb.Append(" 6"); + + if((ftr.SubtypeSupport & 0x80) == 0x80) + sb.Append(" 7"); + + sb.AppendLine(); + + return sb.ToString(); + } + + public static string Prettify_0038(Feature_0038? feature) => + !feature.HasValue ? null : Localization.Drive_can_write_BD_R_on_Pseudo_OVerwrite_SRM_mode + "\n"; + + public static string Prettify_003A(Feature_003A? feature) + { + if(!feature.HasValue) + return null; + + Feature_003A ftr = feature.Value; + var sb = new StringBuilder(); + + if(ftr.Write) + { + sb.Append(Localization.Drive_can_read_and_write_DVD_Plus_RW_DL); + + if(ftr.Current) + sb.AppendLine(Localization.current); + else + sb.AppendLine(); + + sb.AppendLine(ftr.CloseOnly + ? "\t" + Localization.Drive_supports_only_the_read_compatibility_stop + : "\t" + Localization.Drive_supports_both_forms_of_background_format_stopping); + + if(ftr.QuickStart) + sb.AppendLine("\t" + Localization.Drive_can_do_a_quick_start_formatting); + } + else + { + sb.Append(Localization.Drive_can_read_DVD_Plus_RW_DL); + + if(ftr.Current) + sb.AppendLine(Localization.current); + else + sb.AppendLine(); + } + + return sb.ToString(); + } + + public static string Prettify_003B(Feature_003B? feature) + { + if(!feature.HasValue) + return null; + + Feature_003B ftr = feature.Value; + var sb = new StringBuilder(); + + if(ftr.Write) + { + sb.Append(Localization.Drive_can_read_and_write_DVD_Plus_R_DL); + + if(ftr.Current) + sb.AppendLine(Localization.current); + else + sb.AppendLine(); + } + else + { + sb.Append(Localization.Features_Prettify_003B_Drive_can_read_DVD_Plus_R_DL); + + if(ftr.Current) + sb.AppendLine(Localization.current); + else + sb.AppendLine(); + } + + return sb.ToString(); + } + + public static string Prettify_0040(Feature_0040? feature) + { + if(!feature.HasValue) + return null; + + Feature_0040 ftr = feature.Value; + var sb = new StringBuilder(); + + sb.Append(Localization.MMC_BD_Read); + sb.AppendLine(ftr.Current ? $"{Localization.current}:" : ":"); + + if(ftr.OldROM) + sb.AppendLine("\t" + Localization.Drive_can_read_BD_ROM_pre_1_0); + + if(ftr.ROM) + sb.AppendLine("\t" + Localization.Drive_can_read_BD_ROM_Ver_1); + + if(ftr.OldR) + sb.AppendLine("\t" + Localization.Drive_can_read_BD_R_pre_1_0); + + if(ftr.R) + sb.AppendLine("\t" + Localization.Drive_can_read_BD_R_Ver_1); + + if(ftr.OldRE) + sb.AppendLine("\t" + Localization.Drive_can_read_BD_RE_pre_1_0); + + if(ftr.RE1) + sb.AppendLine("\t" + Localization.Drive_can_read_BD_RE_Ver_1); + + if(ftr.RE2) + sb.AppendLine("\t" + Localization.Drive_can_read_BD_RE_Ver_2); + + if(ftr.BCA) + sb.AppendLine("\t" + Localization.Drive_can_read_BDs_Burst_Cutting_Area); + + return sb.ToString(); + } + + public static string Prettify_0041(Feature_0041? feature) + { + if(!feature.HasValue) + return null; + + Feature_0041 ftr = feature.Value; + var sb = new StringBuilder(); + + sb.Append(Localization.MMC_BD_Write); + sb.AppendLine(ftr.Current ? $"{Localization.current}:" : ":"); + + if(ftr.OldR) + sb.AppendLine("\t" + Localization.Drive_can_write_BD_R_pre_1_0); + + if(ftr.R) + sb.AppendLine("\t" + Localization.Drive_can_write_BD_R_Ver_1); + + if(ftr.OldRE) + sb.AppendLine("\t" + Localization.Drive_can_write_BD_RE_pre_1_0); + + if(ftr.RE1) + sb.AppendLine("\t" + Localization.Drive_can_write_BD_RE_Ver_1); + + if(ftr.RE2) + sb.AppendLine("\t" + Localization.Drive_can_write_BD_RE_Ver_2); + + if(ftr.SVNR) + sb.AppendLine("\t" + Localization.Drive_supports_write_without_verify_requirement); + + return sb.ToString(); + } + + public static string Prettify_0042(Feature_0042? feature) => + !feature.HasValue + ? null + : Localization. + Features_Prettify_0042_Drive_is_able_to_detect_and_report_defective_writable_unit_and_behave_accordingly + + "\n"; + + public static string Prettify_0050(Feature_0050? feature) + { + if(!feature.HasValue) + return null; + + Feature_0050 ftr = feature.Value; + var sb = new StringBuilder(); + + switch(ftr.HDDVDR) + { + case true when ftr.HDDVDRAM: + sb.Append(Localization.Drive_can_read_HD_DVD_ROM_HD_DVD_RW_HD_DVD_R_and_HD_DVD_RAM); + + break; + case true: + sb.Append(Localization.Drive_can_read_HD_DVD_ROM_HD_DVD_RW_and_HD_DVD_R); + + break; + default: + { + sb.Append(ftr.HDDVDRAM + ? Localization.Drive_can_read_HD_DVD_ROM_HD_DVD_RW_and_HD_DVD_RAM + : Localization.Drive_can_read_HD_DVD_ROM_and_HD_DVD_RW); + + break; + } + } + + if(ftr.Current) + sb.AppendLine(Localization.current); + else + sb.AppendLine(); + + return sb.ToString(); + } + + public static string Prettify_0051(Feature_0051? feature) + { + if(!feature.HasValue) + return null; + + Feature_0051 ftr = feature.Value; + var sb = new StringBuilder(); + + switch(ftr.HDDVDR) + { + case true when ftr.HDDVDRAM: + sb.Append(Localization.Drive_can_write_HD_DVD_RW_HD_DVD_R_and_HD_DVD_RAM); + + break; + case true: + sb.Append(Localization.Drive_can_write_HD_DVD_RW_and_HD_DVD_R); + + break; + default: + { + sb.Append(ftr.HDDVDRAM + ? Localization.Drive_can_write_HD_DVD_RW_and_HD_DVD_RAM + : Localization.Drive_can_write_HD_DVD_RW); + + break; + } + } + + if(ftr.Current) + sb.AppendLine(Localization.current); + else + sb.AppendLine(); + + return sb.ToString(); + } + + public static string Prettify_0080(Feature_0080? feature) + { + if(!feature.HasValue) + return null; + + Feature_0080 ftr = feature.Value; + var sb = new StringBuilder(); + + sb.Append(Localization.Drive_is_able_to_access_Hybrid_discs); + + if(ftr.Current) + sb.AppendLine(Localization.current); + else + sb.AppendLine(); + + if(ftr.RI) + { + sb.AppendLine("\t" + + Localization. + Drive_is_able_to_maintain_the_online_format_layer_through_reset_and_power_cycling); + } + + return sb.ToString(); + } + + public static string Prettify_0100(Feature_0100? feature) => + !feature.HasValue + ? null + : Localization.Drive_is_able_to_perform_host_and_drive_directed_power_management + "\n"; + + public static string Prettify_0101(Feature_0101? feature) + { + if(!feature.HasValue) + return null; + + Feature_0101 ftr = feature.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.Drive_supports_SMART); + + if(ftr.PP) + sb.AppendLine("\t" + Localization.Drive_supports_the_Informational_Exceptions_Control_mode_page_1Ch); + + return sb.ToString(); + } + + public static string Prettify_0102(Feature_0102? feature) + { + if(!feature.HasValue) + return null; + + Feature_0102 ftr = feature.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.MMC_Embedded_Changer); + + if(ftr.SCC) + sb.AppendLine("\t" + Localization.Drive_can_change_disc_side); + + if(ftr.SDP) + sb.AppendLine("\t" + Localization.Drive_is_able_to_report_slots_contents_after_a_reset_or_change); + + sb.AppendFormat("\t" + Localization.Drive_has_0_slots, ftr.HighestSlotNumber + 1).AppendLine(); + + return sb.ToString(); + } + + public static string Prettify_0103(Feature_0103? feature) + { + if(!feature.HasValue) + return null; + + Feature_0103 ftr = feature.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.Drive_has_an_analogue_audio_output); + + if(ftr.Scan) + sb.AppendLine("\t" + Localization.Drive_supports_the_SCAN_command); + + if(ftr.SCM) + sb.AppendLine("\t" + Localization.Drive_is_able_to_mute_channels_separately); + + if(ftr.SV) + sb.AppendLine("\t" + Localization.Drive_supports_separate_volume_per_channel); + + sb.AppendFormat("\t" + Localization.Drive_has_0_volume_levels, ftr.VolumeLevels + 1).AppendLine(); + + return sb.ToString(); + } + + public static string Prettify_0104(Feature_0104? feature) + { + if(!feature.HasValue) + return null; + + Feature_0104 ftr = feature.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.Drive_supports_Microcode_Upgrade); + + if(ftr.M5) + { + sb.AppendLine(Localization. + Drive_supports_validating_the_5_bit_Mode_of_the_READ_BUFFER_and_WRITE_BUFFER_commands); + } + + return sb.ToString(); + } + + public static string Prettify_0105(Feature_0105? feature) + { + if(!feature.HasValue) + return null; + + Feature_0105 ftr = feature.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.Drive_supports_Timeout_Protect_mode_page_1Dh); + + if(!ftr.Group3) + return sb.ToString(); + + sb.AppendLine("\t" + Localization.Drive_supports_the_Group3_in_Timeout_Protect_mode_page_1Dh); + + if(ftr.UnitLength > 0) + sb.AppendFormat("\t" + Localization.Drive_has_0_increase_of_Group_3_time_unit, ftr.UnitLength).AppendLine(); + + return sb.ToString(); + } + + public static string Prettify_0106(Feature_0106? feature) + { + if(!feature.HasValue) + return null; + + Feature_0106 ftr = feature.Value; + var sb = new StringBuilder(); + + if(ftr.Current) + { + sb.AppendFormat(Localization.Drive_supports_DVD_CSS_CPPM_version_0_and_current_disc_is_encrypted, + ftr.CSSVersion). + AppendLine(); + } + else + sb.AppendFormat(Localization.Drive_supports_DVD_CSS_CPPM_version_0, ftr.CSSVersion).AppendLine(); + + return sb.ToString(); + } + + public static string Prettify_0107(Feature_0107? feature) + { + if(!feature.HasValue) + return null; + + Feature_0107 ftr = feature.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.MMC_Real_Time_Streaming_); + + if(ftr.SMP) + sb.AppendLine("\t" + Localization.Drive_supports_Set_Minimum_Performance_with_the_SET_STREAMING_command); + + if(ftr.RBCB) + sb.AppendLine("\t" + Localization.Drive_supports_the_block_bit_in_the_READ_BUFFER_CAPACITY_command); + + if(ftr.SCS) + sb.AppendLine("\t" + Localization.Drive_supports_the_SET_CD_SPEED_command); + + if(ftr.MP2A) + { + sb.AppendLine("\t" + + Localization. + Drive_supports_the_Write_Speed_Performance_Descriptor_Blocks_in_the_MMC_mode_page_2Ah); + } + + if(ftr.WSPD) + { + sb.AppendLine("\t" + + Localization. + Drive_supports_the_Write_Speed_data_of_GET_PERFORMANCE_and_the_WRC_field_of_SET_STREAMING); + } + + if(ftr.SW) + sb.AppendLine("\t" + Localization.Drive_supports_stream_recording); + + return sb.ToString(); + } + + public static string Prettify_0108(Feature_0108? feature) + { + if(!feature.HasValue) + return null; + + Feature_0108 ftr = feature.Value; + var sb = new StringBuilder(); + + sb.AppendFormat(Core.Drive_serial_number_0, ftr.Serial).AppendLine(); + + return sb.ToString(); + } + + public static string Prettify_0109(Feature_0109? feature) => + !feature.HasValue ? null : Localization.Drive_is_able_to_read_media_serial_number + "\n"; + + public static string Prettify_010A(Feature_010A? feature) + { + if(!feature.HasValue) + return null; + + Feature_010A ftr = feature.Value; + var sb = new StringBuilder(); + + if(ftr.DCBs == null) + return sb.ToString(); + + foreach(uint dcb in ftr.DCBs) + sb.AppendFormat(Localization.Drive_supports_DCB_0, dcb).AppendLine(); + + return sb.ToString(); + } + + public static string Prettify_010B(Feature_010B? feature) + { + if(!feature.HasValue) + return null; + + Feature_010B ftr = feature.Value; + var sb = new StringBuilder(); + + if(ftr.Current) + { + sb.AppendFormat(Localization.Drive_supports_DVD_CPRM_version_0_and_current_disc_is_or_can_be_encrypted, + ftr.CPRMVersion). + AppendLine(); + } + else + sb.AppendFormat(Localization.Drive_supports_DVD_CPRM_version_0, ftr.CPRMVersion).AppendLine(); + + return sb.ToString(); + } + + public static string Prettify_010C(Feature_010C? feature) + { + if(!feature.HasValue) + return null; + + Feature_010C ftr = feature.Value; + var sb = new StringBuilder(); + + var temp = new byte[4]; + temp[0] = (byte)((ftr.Century & 0xFF00) >> 8); + temp[1] = (byte)(ftr.Century & 0xFF); + temp[2] = (byte)((ftr.Year & 0xFF00) >> 8); + temp[3] = (byte)(ftr.Year & 0xFF); + string syear = Encoding.ASCII.GetString(temp); + temp = new byte[2]; + temp[0] = (byte)((ftr.Month & 0xFF00) >> 8); + temp[1] = (byte)(ftr.Month & 0xFF); + string smonth = Encoding.ASCII.GetString(temp); + temp = new byte[2]; + temp[0] = (byte)((ftr.Day & 0xFF00) >> 8); + temp[1] = (byte)(ftr.Day & 0xFF); + string sday = Encoding.ASCII.GetString(temp); + temp = new byte[2]; + temp[0] = (byte)((ftr.Hour & 0xFF00) >> 8); + temp[1] = (byte)(ftr.Hour & 0xFF); + string shour = Encoding.ASCII.GetString(temp); + temp = new byte[2]; + temp[0] = (byte)((ftr.Minute & 0xFF00) >> 8); + temp[1] = (byte)(ftr.Minute & 0xFF); + string sminute = Encoding.ASCII.GetString(temp); + temp = new byte[2]; + temp[0] = (byte)((ftr.Second & 0xFF00) >> 8); + temp[1] = (byte)(ftr.Second & 0xFF); + string ssecond = Encoding.ASCII.GetString(temp); + + try + { + var fwDate = new DateTime(int.Parse(syear), int.Parse(smonth), int.Parse(sday), int.Parse(shour), + int.Parse(sminute), int.Parse(ssecond), DateTimeKind.Utc); + + sb.AppendFormat(Localization.Drive_firmware_is_dated_0, fwDate).AppendLine(); + } + #pragma warning disable RECS0022 // A catch clause that catches System.Exception and has an empty body + catch + { + // ignored + } + #pragma warning restore RECS0022 // A catch clause that catches System.Exception and has an empty body + + return sb.ToString(); + } + + public static string Prettify_010D(Feature_010D? feature) + { + if(!feature.HasValue) + return null; + + Feature_010D ftr = feature.Value; + var sb = new StringBuilder(); + + if(ftr.Current) + { + sb.AppendFormat(Localization.Drive_supports_AACS_version_0_and_current_disc_is_encrypted, ftr.AACSVersion). + AppendLine(); + } + else + sb.AppendFormat(Localization.Drive_supports_AACS_version_0, ftr.AACSVersion).AppendLine(); + + if(ftr.RDC) + sb.AppendLine("\t" + Localization.Drive_supports_reading_the_Drive_Certificate); + + if(ftr.RMC) + sb.AppendLine("\t" + Localization.Drive_supports_reading_Media_Key_Block_of_CPRM); + + if(ftr.WBE) + sb.AppendLine("\t" + Localization.Drive_supports_writing_with_bus_encryption); + + if(ftr.BEC) + sb.AppendLine("\t" + Localization.Drive_supports_bus_encryption); + + if(ftr.BNG) + { + sb.AppendLine("\t" + Localization.Drive_supports_generating_the_binding_nonce); + + if(ftr.BindNonceBlocks > 0) + { + sb.AppendFormat("\t" + Localization._0_media_blocks_are_required_for_the_binding_nonce, + ftr.BindNonceBlocks). + AppendLine(); + } + } + + if(ftr.AGIDs > 0) + sb.AppendFormat("\t" + Localization.Drive_supports_0_AGIDs_concurrently, ftr.AGIDs).AppendLine(); + + return sb.ToString(); + } + + public static string Prettify_010E(Feature_010E? feature) + { + if(!feature.HasValue) + return null; + + Feature_010E ftr = feature.Value; + var sb = new StringBuilder(); + + sb.Append(Localization.Drive_supports_DVD_Download); + + if(ftr.Current) + sb.AppendLine(Localization.current); + else + sb.AppendLine(); + + if(ftr.MaxScrambleExtent > 0) + { + sb.AppendFormat("\t" + Localization.Maximum_0_scramble_extent_information_entries, ftr.MaxScrambleExtent). + AppendLine(); + } + + return sb.ToString(); + } + + public static string Prettify_0110(Feature_0110? feature) + { + if(!feature.HasValue) + return null; + + Feature_0110 ftr = feature.Value; + var sb = new StringBuilder(); + + sb.AppendLine(ftr.Current + ? Localization.Drive_and_currently_inserted_media_support_VCPS + : Localization.Drive_supports_VCPS); + + return sb.ToString(); + } + + public static string Prettify_0113(Feature_0113? feature) + { + if(!feature.HasValue) + return null; + + Feature_0113 ftr = feature.Value; + var sb = new StringBuilder(); + + sb.AppendLine(ftr.Current + ? Localization.Drive_and_currently_inserted_media_support_SecurDisc + : Localization.Drive_supports_SecurDisc); + + return sb.ToString(); + } + + public static string Prettify_0142(Feature_0142? feature) + { + if(!feature.HasValue) + return null; + + Feature_0142 ftr = feature.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.Drive_supports_the_Trusted_Computing_Group_Optical_Security_Subsystem_Class); + + if(ftr.Current) + sb.AppendLine("\t" + Localization.Current_media_is_initialized_with_TCG_OSSC); + + if(ftr.PSAU) + sb.AppendLine("\t" + Localization.Drive_supports_PSA_updates_on_write_once_media); + + if(ftr.LOSPB) + sb.AppendLine("\t" + Localization.Drive_supports_linked_OSPBs); + + if(ftr.ME) + sb.AppendLine("\t" + Localization.Drive_will_only_record_on_the_OSSC_Disc_Format); + + if(ftr.Profiles == null) + return sb.ToString(); + + for(var i = 0; i < ftr.Profiles.Length; i++) + sb.AppendFormat("\t" + Localization.Profile_0_1, i, ftr.Profiles[i]).AppendLine(); + + return sb.ToString(); + } + + public static string Prettify_0000(byte[] feature) => Prettify_0000(Decode_0000(feature)); + + public static string Prettify_0001(byte[] feature) => Prettify_0001(Decode_0001(feature)); + + public static string Prettify_0002(byte[] feature) => Prettify_0002(Decode_0002(feature)); + + public static string Prettify_0003(byte[] feature) => Prettify_0003(Decode_0003(feature)); + + public static string Prettify_0004(byte[] feature) => Prettify_0004(Decode_0004(feature)); + + public static string Prettify_0010(byte[] feature) => Prettify_0010(Decode_0010(feature)); + + public static string Prettify_001D(byte[] feature) => Prettify_001D(Decode_001D(feature)); + + public static string Prettify_001E(byte[] feature) => Prettify_001E(Decode_001E(feature)); + + public static string Prettify_001F(byte[] feature) => Prettify_001F(Decode_001F(feature)); + + public static string Prettify_0020(byte[] feature) => Prettify_0020(Decode_0020(feature)); + + public static string Prettify_0021(byte[] feature) => Prettify_0021(Decode_0021(feature)); + + public static string Prettify_0022(byte[] feature) => Prettify_0022(Decode_0022(feature)); + + public static string Prettify_0023(byte[] feature) => Prettify_0023(Decode_0023(feature)); + + public static string Prettify_0024(byte[] feature) => Prettify_0024(Decode_0024(feature)); + + public static string Prettify_0025(byte[] feature) => Prettify_0025(Decode_0025(feature)); + + public static string Prettify_0026(byte[] feature) => Prettify_0026(Decode_0026(feature)); + + public static string Prettify_0027(byte[] feature) => Prettify_0027(Decode_0027(feature)); + + public static string Prettify_0028(byte[] feature) => Prettify_0028(Decode_0028(feature)); + + public static string Prettify_0029(byte[] feature) => Prettify_0029(Decode_0029(feature)); + + public static string Prettify_002A(byte[] feature) => Prettify_002A(Decode_002A(feature)); + + public static string Prettify_002B(byte[] feature) => Prettify_002B(Decode_002B(feature)); + + public static string Prettify_002C(byte[] feature) => Prettify_002C(Decode_002C(feature)); + + public static string Prettify_002D(byte[] feature) => Prettify_002D(Decode_002D(feature)); + + public static string Prettify_002E(byte[] feature) => Prettify_002E(Decode_002E(feature)); + + public static string Prettify_002F(byte[] feature) => Prettify_002F(Decode_002F(feature)); + + public static string Prettify_0030(byte[] feature) => Prettify_0030(Decode_0030(feature)); + + public static string Prettify_0031(byte[] feature) => Prettify_0031(Decode_0031(feature)); + + public static string Prettify_0032(byte[] feature) => Prettify_0032(Decode_0032(feature)); + + public static string Prettify_0033(byte[] feature) => Prettify_0033(Decode_0033(feature)); + + public static string Prettify_0035(byte[] feature) => Prettify_0035(Decode_0035(feature)); + + public static string Prettify_0037(byte[] feature) => Prettify_0037(Decode_0037(feature)); + + public static string Prettify_0038(byte[] feature) => Prettify_0038(Decode_0038(feature)); + + public static string Prettify_003A(byte[] feature) => Prettify_003A(Decode_003A(feature)); + + public static string Prettify_003B(byte[] feature) => Prettify_003B(Decode_003B(feature)); + + public static string Prettify_0040(byte[] feature) => Prettify_0040(Decode_0040(feature)); + + public static string Prettify_0041(byte[] feature) => Prettify_0041(Decode_0041(feature)); + + public static string Prettify_0042(byte[] feature) => Prettify_0042(Decode_0042(feature)); + + public static string Prettify_0050(byte[] feature) => Prettify_0050(Decode_0050(feature)); + + public static string Prettify_0051(byte[] feature) => Prettify_0051(Decode_0051(feature)); + + public static string Prettify_0080(byte[] feature) => Prettify_0080(Decode_0080(feature)); + + public static string Prettify_0100(byte[] feature) => Prettify_0100(Decode_0100(feature)); + + public static string Prettify_0101(byte[] feature) => Prettify_0101(Decode_0101(feature)); + + public static string Prettify_0102(byte[] feature) => Prettify_0102(Decode_0102(feature)); + + public static string Prettify_0103(byte[] feature) => Prettify_0103(Decode_0103(feature)); + + public static string Prettify_0104(byte[] feature) => Prettify_0104(Decode_0104(feature)); + + public static string Prettify_0105(byte[] feature) => Prettify_0105(Decode_0105(feature)); + + public static string Prettify_0106(byte[] feature) => Prettify_0106(Decode_0106(feature)); + + public static string Prettify_0107(byte[] feature) => Prettify_0107(Decode_0107(feature)); + + public static string Prettify_0108(byte[] feature) => Prettify_0108(Decode_0108(feature)); + + public static string Prettify_0109(byte[] feature) => Prettify_0109(Decode_0109(feature)); + + public static string Prettify_010A(byte[] feature) => Prettify_010A(Decode_010A(feature)); + + public static string Prettify_010B(byte[] feature) => Prettify_010B(Decode_010B(feature)); + + public static string Prettify_010C(byte[] feature) => Prettify_010C(Decode_010C(feature)); + + public static string Prettify_010D(byte[] feature) => Prettify_010D(Decode_010D(feature)); + + public static string Prettify_010E(byte[] feature) => Prettify_010E(Decode_010E(feature)); + + public static string Prettify_0110(byte[] feature) => Prettify_0110(Decode_0110(feature)); + + public static string Prettify_0113(byte[] feature) => Prettify_0113(Decode_0113(feature)); + + public static string Prettify_0142(byte[] feature) => Prettify_0142(Decode_0142(feature)); + + public static SeparatedFeatures Separate(byte[] response) + { + var dec = new SeparatedFeatures + { + DataLength = (uint)((response[0] << 24) + (response[1] << 16) + (response[2] << 8) + response[4]), + CurrentProfile = (ushort)((response[6] << 8) + response[7]) + }; + + uint offset = 8; + List descLst = new(); + + while(offset + 4 < response.Length) + { + var desc = new FeatureDescriptor + { + Code = (ushort)((response[offset + 0] << 8) + response[offset + 1]), + Data = new byte[response[offset + 3] + 4] + }; + + if(desc.Data.Length + offset > response.Length) + desc.Data = new byte[response.Length - offset]; + + Array.Copy(response, offset, desc.Data, 0, desc.Data.Length); + offset += (uint)desc.Data.Length; + + descLst.Add(desc); + } + + dec.Descriptors = descLst.ToArray(); + + return dec; + } + +#region Nested type: FeatureDescriptor + + public struct FeatureDescriptor + { + public ushort Code; + public byte[] Data; + } + +#endregion + +#region Nested type: SeparatedFeatures + + public struct SeparatedFeatures + { + public uint DataLength; + public ushort CurrentProfile; + public FeatureDescriptor[] Descriptors; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/MMC/Hybrid.cs b/Aaru.Decoders/SCSI/MMC/Hybrid.cs new file mode 100644 index 000000000..adcb44f06 --- /dev/null +++ b/Aaru.Decoders/SCSI/MMC/Hybrid.cs @@ -0,0 +1,205 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : Hybrid.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MMC hybrid structures. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; +using Aaru.Helpers; + +namespace Aaru.Decoders.SCSI.MMC; + +// Information from the following standards: +// ANSI X3.304-1997 +// T10/1048-D revision 9.0 +// T10/1048-D revision 10a +// T10/1228-D revision 7.0c +// T10/1228-D revision 11a +// T10/1363-D revision 10g +// T10/1545-D revision 1d +// T10/1545-D revision 5 +// T10/1545-D revision 5a +// T10/1675-D revision 2c +// T10/1675-D revision 4 +// T10/1836-D revision 2g +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +[SuppressMessage("ReSharper", "UnusedType.Global")] +public static class Hybrid +{ + public static RecognizedFormatLayers? DecodeFormatLayers(byte[] FormatLayersResponse) + { + if(FormatLayersResponse == null) + return null; + + if(FormatLayersResponse.Length < 8) + return null; + + var decoded = new RecognizedFormatLayers + { + DataLength = BigEndianBitConverter.ToUInt16(FormatLayersResponse, 0), + Reserved1 = FormatLayersResponse[2], + Reserved2 = FormatLayersResponse[3], + NumberOfLayers = FormatLayersResponse[4], + Reserved3 = (byte)((FormatLayersResponse[5] & 0xC0) >> 6), + DefaultFormatLayer = (byte)((FormatLayersResponse[5] & 0x30) >> 4), + Reserved4 = (byte)((FormatLayersResponse[5] & 0x0C) >> 2), + OnlineFormatLayer = (byte)(FormatLayersResponse[5] & 0x03), + FormatLayers = new ushort[(FormatLayersResponse.Length - 6) / 2] + }; + + for(var i = 0; i < (FormatLayersResponse.Length - 6) / 2; i++) + decoded.FormatLayers[i] = BigEndianBitConverter.ToUInt16(FormatLayersResponse, i * 2 + 6); + + return decoded; + } + + public static string PrettifyFormatLayers(RecognizedFormatLayers? FormatLayersResponse) + { + if(FormatLayersResponse == null) + return null; + + RecognizedFormatLayers response = FormatLayersResponse.Value; + + var sb = new StringBuilder(); + + sb.AppendFormat(Localization._0_format_layers_recognized, response.NumberOfLayers); + + for(var i = 0; i < response.FormatLayers.Length; i++) + { + switch(response.FormatLayers[i]) + { + case (ushort)FormatLayerTypeCodes.BDLayer: + { + sb.AppendFormat(Localization.Layer_0_is_of_type_Blu_ray, i).AppendLine(); + + if(response.DefaultFormatLayer == i) + sb.AppendLine(Localization.This_is_the_default_layer); + + if(response.OnlineFormatLayer == i) + sb.AppendLine(Localization.This_is_the_layer_actually_in_use); + + break; + } + + case (ushort)FormatLayerTypeCodes.CDLayer: + { + sb.AppendFormat(Localization.Layer_0_is_of_type_CD, i).AppendLine(); + + if(response.DefaultFormatLayer == i) + sb.AppendLine(Localization.This_is_the_default_layer); + + if(response.OnlineFormatLayer == i) + sb.AppendLine(Localization.This_is_the_layer_actually_in_use); + + break; + } + + case (ushort)FormatLayerTypeCodes.DVDLayer: + { + sb.AppendFormat(Localization.Layer_0_is_of_type_DVD, i).AppendLine(); + + if(response.DefaultFormatLayer == i) + sb.AppendLine(Localization.This_is_the_default_layer); + + if(response.OnlineFormatLayer == i) + sb.AppendLine(Localization.This_is_the_layer_actually_in_use); + + break; + } + + case (ushort)FormatLayerTypeCodes.HDDVDLayer: + { + sb.AppendFormat(Localization.Layer_0_is_of_type_HD_DVD, i).AppendLine(); + + if(response.DefaultFormatLayer == i) + sb.AppendLine(Localization.This_is_the_default_layer); + + if(response.OnlineFormatLayer == i) + sb.AppendLine(Localization.This_is_the_layer_actually_in_use); + + break; + } + + default: + { + sb.AppendFormat(Localization.Layer_0_is_of_unknown_type_1, i, response.FormatLayers[i]). + AppendLine(); + + if(response.DefaultFormatLayer == i) + sb.AppendLine(Localization.This_is_the_default_layer); + + if(response.OnlineFormatLayer == i) + sb.AppendLine(Localization.This_is_the_layer_actually_in_use); + + break; + } + } + } + + return sb.ToString(); + } + + public static string PrettifyFormatLayers(byte[] FormatLayersResponse) + { + RecognizedFormatLayers? decoded = DecodeFormatLayers(FormatLayersResponse); + + return PrettifyFormatLayers(decoded); + } + +#region Nested type: RecognizedFormatLayers + + public struct RecognizedFormatLayers + { + /// Bytes 0 to 1 Data Length + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Byte 4 Number of format layers in hybrid disc identified by drive + public byte NumberOfLayers; + /// Byte 5, bits 7 to 6 Reserved + public byte Reserved3; + /// Byte 5, bits 5 to 4 Layer no. used when disc is inserted + public byte DefaultFormatLayer; + /// Byte 5, bits 3 to 2 Reserved + public byte Reserved4; + /// Byte 5, bits 1 to 0 Layer no. currently in use + public byte OnlineFormatLayer; + /// Bytes 6 to end Recognized format layers + public ushort[] FormatLayers; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/MMC/TrackInformation.cs b/Aaru.Decoders/SCSI/MMC/TrackInformation.cs new file mode 100644 index 000000000..e04eec01e --- /dev/null +++ b/Aaru.Decoders/SCSI/MMC/TrackInformation.cs @@ -0,0 +1,110 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : TrackInformation.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ License ] -------------------------------------------------------------- +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; + +namespace Aaru.Decoders.SCSI.MMC; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +public class TrackInformation +{ + public bool Blank; + public bool Copy; + public bool Damage; + public ushort DataLength; + public byte DataMode; + public uint FixedPacketSize; + public bool FP; + public uint FreeBlocks; + public uint LastLayerJumpAddress; + public uint LastRecordedAddress; + public LayerJumpRecordingStatus LayerJumpRecordingStatus; + public ushort LogicalTrackNumber; + public uint LogicalTrackSize; + public uint LogicalTrackStartAddress; + public bool LraV; + public uint NextLayerJumpAddress; + public uint NextWritableAddress; + public bool NwaV; + public bool Packet; + public uint ReadCompatibilityLba; + public bool RT; + public ushort SessionNumber; + public byte TrackMode; + + public static TrackInformation Decode(byte[] response) + { + if(response.Length < 32) + return null; + + var decoded = new TrackInformation + { + DataLength = (ushort)((response[0] << 8) + response[1]), + LogicalTrackNumber = response[2], + SessionNumber = response[3], + LayerJumpRecordingStatus = (LayerJumpRecordingStatus)(response[5] >> 6), + Damage = (response[5] & 0x20) == 0x20, + Copy = (response[5] & 0x10) == 0x10, + TrackMode = (byte)(response[5] & 0xF), + RT = (response[6] & 0x80) == 0x80, + Blank = (response[6] & 0x40) == 0x40, + Packet = (response[6] & 0x20) == 0x20, + FP = (response[6] & 0x10) == 0x10, + DataMode = (byte)(response[6] & 0xF), + LraV = (response[7] & 0x02) == 0x02, + NwaV = (response[7] & 0x01) == 0x01, + LogicalTrackStartAddress = + (uint)((response[8] << 24) + (response[9] << 16) + (response[10] << 8) + response[11]), + NextWritableAddress = + (uint)((response[12] << 24) + (response[13] << 16) + (response[14] << 8) + response[15]), + FreeBlocks = (uint)((response[16] << 24) + (response[17] << 16) + (response[18] << 8) + response[19]), + FixedPacketSize = (uint)((response[20] << 24) + (response[21] << 16) + (response[22] << 8) + response[23]), + LogicalTrackSize = (uint)((response[24] << 24) + (response[25] << 16) + (response[26] << 8) + response[27]), + LastRecordedAddress = + (uint)((response[28] << 24) + (response[29] << 16) + (response[30] << 8) + response[31]) + }; + + if(response.Length < 48) + return decoded; + + decoded.LogicalTrackNumber += (ushort)(response[32] << 8); + + decoded.SessionNumber += (ushort)(response[33] << 8); + + decoded.ReadCompatibilityLba = + (uint)((response[36] << 24) + (response[37] << 16) + (response[38] << 8) + response[39]); + + decoded.NextLayerJumpAddress = + (uint)((response[40] << 24) + (response[41] << 16) + (response[42] << 8) + response[43]); + + decoded.LastLayerJumpAddress = + (uint)((response[44] << 24) + (response[45] << 16) + (response[46] << 8) + response[47]); + + return decoded; + } +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/MMC/WriteProtect.cs b/Aaru.Decoders/SCSI/MMC/WriteProtect.cs new file mode 100644 index 000000000..545bfc274 --- /dev/null +++ b/Aaru.Decoders/SCSI/MMC/WriteProtect.cs @@ -0,0 +1,162 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : WriteProtect.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MMC write protection structures. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Text; +using Aaru.Helpers; + +namespace Aaru.Decoders.SCSI.MMC; + +// Information from the following standards: +// ANSI X3.304-1997 +// T10/1048-D revision 9.0 +// T10/1048-D revision 10a +// T10/1228-D revision 7.0c +// T10/1228-D revision 11a +// T10/1363-D revision 10g +// T10/1545-D revision 1d +// T10/1545-D revision 5 +// T10/1545-D revision 5a +// T10/1675-D revision 2c +// T10/1675-D revision 4 +// T10/1836-D revision 2g +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +public static class WriteProtect +{ + public static WriteProtectionStatus? DecodeWriteProtectionStatus(byte[] WPSResponse) + { + if(WPSResponse == null) + return null; + + var decoded = new WriteProtectionStatus + { + DataLength = BigEndianBitConverter.ToUInt16(WPSResponse, 0), + Reserved1 = WPSResponse[2], + Reserved2 = WPSResponse[3], + Reserved3 = (byte)((WPSResponse[4] & 0xF0) >> 4), + MSWI = Convert.ToBoolean(WPSResponse[4] & 0x08), + CWP = Convert.ToBoolean(WPSResponse[4] & 0x04), + PWP = Convert.ToBoolean(WPSResponse[4] & 0x02), + SWPP = Convert.ToBoolean(WPSResponse[4] & 0x01), + Reserved4 = WPSResponse[5], + Reserved5 = WPSResponse[6], + Reserved6 = WPSResponse[7] + }; + + return decoded; + } + + public static string PrettifyWriteProtectionStatus(WriteProtectionStatus? WPSResponse) + { + if(WPSResponse == null) + return null; + + WriteProtectionStatus response = WPSResponse.Value; + + var sb = new StringBuilder(); + + if(response.MSWI) + sb.AppendLine(Localization.Writing_inhibited_by_media_specific_reason); + + if(response.CWP) + sb.AppendLine(Localization.Cartridge_sets_write_protection); + + if(response.PWP) + sb.AppendLine(Localization.Media_surface_sets_write_protection); + + if(response.SWPP) + sb.AppendLine(Localization.Software_write_protection_is_set_until_power_down); + + #if DEBUG + if(response.Reserved1 != 0) + sb.AppendFormat(Localization.Reserved1_equals_0_X8, response.Reserved1).AppendLine(); + + if(response.Reserved2 != 0) + sb.AppendFormat(Localization.Reserved2_equals_0_X8, response.Reserved2).AppendLine(); + + if(response.Reserved3 != 0) + sb.AppendFormat(Localization.Reserved_3_equals_0_X2, response.Reserved3).AppendLine(); + + if(response.Reserved4 != 0) + sb.AppendFormat(Localization.Reserved_4_equals_0_X2, response.Reserved4).AppendLine(); + + if(response.Reserved5 != 0) + sb.AppendFormat(Localization.Reserved_5_equals_0_X2, response.Reserved5).AppendLine(); + + if(response.Reserved6 != 0) + sb.AppendFormat(Localization.Reserved_6_equals_0_X2, response.Reserved6).AppendLine(); + #endif + + return sb.ToString(); + } + + public static string PrettifyWriteProtectionStatus(byte[] WPSResponse) + { + WriteProtectionStatus? decoded = DecodeWriteProtectionStatus(WPSResponse); + + return PrettifyWriteProtectionStatus(decoded); + } + +#region Nested type: WriteProtectionStatus + + public struct WriteProtectionStatus + { + /// Bytes 0 to 1 Data Length + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + /// Byte 4, bits 7 to 4 Reserved + public byte Reserved3; + /// Byte 4, bit 3 Writing inhibited by media specific reason + public bool MSWI; + /// Byte 4, bit 2 Cartridge sets write protection + public bool CWP; + /// Byte 4, bit 1 Media surface sets write protection + public bool PWP; + /// Byte 4, bit 0 Software write protection until power down + public bool SWPP; + /// Byte 5 Reserved + public byte Reserved4; + /// Byte 6 Reserved + public byte Reserved5; + /// Byte 7 Reserved + public byte Reserved6; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/00_SFF.cs b/Aaru.Decoders/SCSI/Modes/00_SFF.cs new file mode 100644 index 000000000..8bc2c7fa3 --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/00_SFF.cs @@ -0,0 +1,119 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 00_SFF.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MODE PAGE 00h: Drive Operation Mode page. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ +#region Mode Page 0x00: Drive Operation Mode page + + /// Drive Operation Mode page Page code 0x00 4 bytes in INF-8070 + public struct ModePage_00_SFF + { + /// Parameters can be saved + public bool PS; + /// Select LUN Mode + public bool SLM; + /// Select LUN for rewritable + public bool SLR; + /// Disable verify for WRITE + public bool DVW; + /// Disable deferred error + public bool DDE; + } + + public static ModePage_00_SFF? DecodeModePage_00_SFF(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x00) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length < 4) + return null; + + var decoded = new ModePage_00_SFF(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + + decoded.SLM |= (pageResponse[2] & 0x80) == 0x80; + decoded.SLR |= (pageResponse[2] & 0x40) == 0x40; + decoded.DVW |= (pageResponse[2] & 0x20) == 0x20; + + decoded.DDE |= (pageResponse[3] & 0x10) == 0x10; + + return decoded; + } + + public static string PrettifyModePage_00_SFF(byte[] pageResponse) => + PrettifyModePage_00_SFF(DecodeModePage_00_SFF(pageResponse)); + + public static string PrettifyModePage_00_SFF(ModePage_00_SFF? modePage) + { + if(!modePage.HasValue) + return null; + + ModePage_00_SFF page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_Drive_Operation_Mode_page); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + if(page.DVW) + sb.AppendLine("\t" + Localization.Verifying_after_writing_is_disabled); + + if(page.DDE) + sb.AppendLine("\t" + Localization.Drive_will_abort_when_a_writing_error_is_detected); + + if(!page.SLM) + return sb.ToString(); + + sb.Append("\t" + Localization.Drive_has_two_LUNs_with_rewritable_being); + sb.AppendLine(page.SLR ? "LUN 1" : "LUN 0"); + + return sb.ToString(); + } + +#endregion Mode Page 0x00: Drive Operation Mode page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/01.cs b/Aaru.Decoders/SCSI/Modes/01.cs new file mode 100644 index 000000000..57c370f1e --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/01.cs @@ -0,0 +1,248 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 01.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes and encodes SCSI MODE PAGE 01h: Read-write error recovery page. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ + public static byte[] EncodeModePage_01(ModePage_01 page) + { + var pg = new byte[8]; + + pg[0] = 0x01; + pg[1] = 6; + + if(page.PS) + pg[0] += 0x80; + + if(page.AWRE) + pg[2] += 0x80; + + if(page.ARRE) + pg[2] += 0x40; + + if(page.TB) + pg[2] += 0x20; + + if(page.RC) + pg[2] += 0x10; + + if(page.EER) + pg[2] += 0x08; + + if(page.PER) + pg[2] += 0x04; + + if(page.DTE) + pg[2] += 0x02; + + if(page.DCR) + pg[2] += 0x01; + + pg[3] = page.ReadRetryCount; + pg[4] = page.CorrectionSpan; + pg[5] = (byte)page.HeadOffsetCount; + pg[6] = (byte)page.DataStrobeOffsetCount; + + // This is from a newer version of SCSI unknown what happen for drives expecting an 8 byte page + /* + pg[8] = page.WriteRetryCount; + if (page.LBPERE) + pg[7] += 0x80; + pg[10] = (byte)((page.RecoveryTimeLimit & 0xFF00) << 8); + pg[11] = (byte)(page.RecoveryTimeLimit & 0xFF);*/ + + return pg; + } + +#region Mode Page 0x01: Read-write error recovery page + + /// Disconnect-reconnect page Page code 0x01 12 bytes in SCSI-2, SBC-1, SBC-2 + public struct ModePage_01 + { + /// Parameters can be saved + public bool PS; + /// Automatic Write Reallocation Enabled + public bool AWRE; + /// Automatic Read Reallocation Enabled + public bool ARRE; + /// Transfer block + public bool TB; + /// Read continuous + public bool RC; + /// Enable early recovery + public bool EER; + /// Post error reporting + public bool PER; + /// Disable transfer on error + public bool DTE; + /// Disable correction + public bool DCR; + /// How many times to retry a read operation + public byte ReadRetryCount; + /// How many bits of largest data burst error is maximum to apply error correction on it + public byte CorrectionSpan; + /// Offset to move the heads + public sbyte HeadOffsetCount; + /// Incremental position to which the recovered data strobe shall be adjusted + public sbyte DataStrobeOffsetCount; + /// How many times to retry a write operation + public byte WriteRetryCount; + /// Maximum time in ms to use in data error recovery procedures + public ushort RecoveryTimeLimit; + + /// Logical block provisioning error reporting is enabled + public bool LBPERE; + } + + public static ModePage_01? DecodeModePage_01(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x01) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length < 8) + return null; + + var decoded = new ModePage_01(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.AWRE |= (pageResponse[2] & 0x80) == 0x80; + decoded.ARRE |= (pageResponse[2] & 0x40) == 0x40; + decoded.TB |= (pageResponse[2] & 0x20) == 0x20; + decoded.RC |= (pageResponse[2] & 0x10) == 0x10; + decoded.EER |= (pageResponse[2] & 0x08) == 0x08; + decoded.PER |= (pageResponse[2] & 0x04) == 0x04; + decoded.DTE |= (pageResponse[2] & 0x02) == 0x02; + decoded.DCR |= (pageResponse[2] & 0x01) == 0x01; + + decoded.ReadRetryCount = pageResponse[3]; + decoded.CorrectionSpan = pageResponse[4]; + decoded.HeadOffsetCount = (sbyte)pageResponse[5]; + decoded.DataStrobeOffsetCount = (sbyte)pageResponse[6]; + + if(pageResponse.Length < 12) + return decoded; + + decoded.WriteRetryCount = pageResponse[8]; + decoded.RecoveryTimeLimit = (ushort)((pageResponse[10] << 8) + pageResponse[11]); + decoded.LBPERE |= (pageResponse[7] & 0x80) == 0x80; + + return decoded; + } + + public static string PrettifyModePage_01(byte[] pageResponse) => + PrettifyModePage_01(DecodeModePage_01(pageResponse)); + + public static string PrettifyModePage_01(ModePage_01? modePage) + { + if(!modePage.HasValue) + return null; + + ModePage_01 page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_Read_write_error_recovery_page); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + if(page.AWRE) + sb.AppendLine("\t" + Localization.Automatic_write_reallocation_is_enabled); + + if(page.ARRE) + sb.AppendLine("\t" + Localization.Automatic_read_reallocation_is_enabled); + + if(page.TB) + { + sb.AppendLine("\t" + + Localization. + Data_not_recovered_within_limits_shall_be_transferred_back_before_a_CHECK_CONDITION); + } + + if(page.RC) + { + sb.AppendLine("\t" + + Localization. + Drive_will_transfer_the_entire_requested_length_without_delaying_to_perform_error_recovery); + } + + if(page.EER) + sb.AppendLine("\t" + Localization.Drive_will_use_the_most_expedient_form_of_error_recovery_first); + + if(page.PER) + sb.AppendLine("\t" + Localization.Drive_shall_report_recovered_errors); + + if(page.DTE) + sb.AppendLine("\t" + Localization.Transfer_will_be_terminated_upon_error_detection); + + if(page.DCR) + sb.AppendLine("\t" + Localization.Error_correction_is_disabled); + + if(page.ReadRetryCount > 0) + { + sb.AppendFormat("\t" + Localization.Drive_will_repeat_read_operations_0_times, page.ReadRetryCount). + AppendLine(); + } + + if(page.WriteRetryCount > 0) + { + sb.AppendFormat("\t" + Localization.Drive_will_repeat_write_operations_0_times, page.WriteRetryCount). + AppendLine(); + } + + if(page.RecoveryTimeLimit > 0) + { + sb.AppendFormat("\t" + Localization.Drive_will_employ_a_maximum_of_0_ms_to_recover_data, + page.RecoveryTimeLimit). + AppendLine(); + } + + if(page.LBPERE) + sb.AppendLine(Localization.Logical_block_provisioning_error_reporting_is_enabled); + + return sb.ToString(); + } + +#endregion Mode Page 0x01: Read-write error recovery page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/01_MMC.cs b/Aaru.Decoders/SCSI/Modes/01_MMC.cs new file mode 100644 index 000000000..6bc9d83b0 --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/01_MMC.cs @@ -0,0 +1,253 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 01_MMC.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MODE PAGE 01h: Read error recovery page for MultiMedia Devices. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ + public static byte[] EncodeModePage_01_MMC(ModePage_01_MMC page) + { + var pg = new byte[12]; + + pg[0] = 0x01; + pg[1] = 10; + + if(page.PS) + pg[0] += 0x80; + + pg[2] = page.Parameter; + pg[3] = page.ReadRetryCount; + + // This is from a newer version of SCSI unknown what happen for drives expecting an 8 byte page + + pg[8] = page.WriteRetryCount; + pg[10] = (byte)((page.RecoveryTimeLimit & 0xFF00) << 8); + pg[11] = (byte)(page.RecoveryTimeLimit & 0xFF); + + return pg; + } + +#region Mode Page 0x01: Read error recovery page for MultiMedia Devices + + /// + /// Read error recovery page for MultiMedia Devices Page code 0x01 8 bytes in SCSI-2, MMC-1 12 bytes in MMC-2, + /// MMC-3 + /// + public struct ModePage_01_MMC + { + /// Parameters can be saved + public bool PS; + /// Error recovery parameter + public byte Parameter; + /// How many times to retry a read operation + public byte ReadRetryCount; + /// How many times to retry a write operation + public byte WriteRetryCount; + /// Maximum time in ms to use in data error recovery procedures + public ushort RecoveryTimeLimit; + } + + public static ModePage_01_MMC? DecodeModePage_01_MMC(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x01) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length < 8) + return null; + + var decoded = new ModePage_01_MMC(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.Parameter = pageResponse[2]; + decoded.ReadRetryCount = pageResponse[3]; + + if(pageResponse.Length < 12) + return decoded; + + decoded.WriteRetryCount = pageResponse[8]; + decoded.RecoveryTimeLimit = (ushort)((pageResponse[10] << 8) + pageResponse[11]); + + return decoded; + } + + public static string PrettifyModePage_01_MMC(byte[] pageResponse) => + PrettifyModePage_01_MMC(DecodeModePage_01_MMC(pageResponse)); + + public static string PrettifyModePage_01_MMC(ModePage_01_MMC? modePage) + { + if(!modePage.HasValue) + return null; + + ModePage_01_MMC page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_Read_error_recovery_page_for_MultiMedia_Devices); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + if(page.ReadRetryCount > 0) + { + sb.AppendFormat("\t" + Localization.Drive_will_repeat_read_operations_0_times, page.ReadRetryCount). + AppendLine(); + } + + string AllUsed = "\t" + Localization.All_available_recovery_procedures_will_be_used + "\n"; + string CIRCRetriesUsed = "\t" + Localization.Only_retries_and_CIRC_are_used + "\n"; + string RetriesUsed = "\t" + Localization.Only_retries_are_used + "\n"; + string RecoveredNotReported = "\t" + Localization.Recovered_errors_will_not_be_reported + "\n"; + string RecoveredReported = "\t" + Localization.Recovered_errors_will_be_reported + "\n"; + + string RecoveredAbort = + "\t" + Localization.Recovered_errors_will_be_reported_and_aborted_with_CHECK_CONDITION + "\n"; + + string UnrecECCAbort = "\t" + Localization.Unrecovered_ECC_errors_will_return_CHECK_CONDITION; + string UnrecCIRCAbort = "\t" + Localization.Unrecovered_CIRC_errors_will_return_CHECK_CONDITION; + string UnrecECCNotAbort = "\t" + Localization.Unrecovered_ECC_errors_will_not_abort_the_transfer; + string UnrecCIRCNotAbort = "\t" + Localization.Unrecovered_CIRC_errors_will_not_abort_the_transfer; + + string UnrecECCAbortData = + "\t" + Localization.Unrecovered_ECC_errors_will_return_CHECK_CONDITION_and_the_uncorrected_data; + + string UnrecCIRCAbortData = + "\t" + Localization.Unrecovered_CIRC_errors_will_return_CHECK_CONDITION_and_the_uncorrected_data; + + switch(page.Parameter) + { + case 0x00: + sb.AppendLine(AllUsed + RecoveredNotReported + UnrecECCAbort); + + break; + case 0x01: + sb.AppendLine(CIRCRetriesUsed + RecoveredNotReported + UnrecCIRCAbort); + + break; + case 0x04: + sb.AppendLine(AllUsed + RecoveredReported + UnrecECCAbort); + + break; + case 0x05: + sb.AppendLine(CIRCRetriesUsed + RecoveredReported + UnrecCIRCAbort); + + break; + case 0x06: + sb.AppendLine(AllUsed + RecoveredAbort + UnrecECCAbort); + + break; + case 0x07: + sb.AppendLine(RetriesUsed + RecoveredAbort + UnrecCIRCAbort); + + break; + case 0x10: + sb.AppendLine(AllUsed + RecoveredNotReported + UnrecECCNotAbort); + + break; + case 0x11: + sb.AppendLine(CIRCRetriesUsed + RecoveredNotReported + UnrecCIRCNotAbort); + + break; + case 0x14: + sb.AppendLine(AllUsed + RecoveredReported + UnrecECCNotAbort); + + break; + case 0x15: + sb.AppendLine(CIRCRetriesUsed + RecoveredReported + UnrecCIRCNotAbort); + + break; + case 0x20: + sb.AppendLine(AllUsed + RecoveredNotReported + UnrecECCAbortData); + + break; + case 0x21: + sb.AppendLine(CIRCRetriesUsed + RecoveredNotReported + UnrecCIRCAbortData); + + break; + case 0x24: + sb.AppendLine(AllUsed + RecoveredReported + UnrecECCAbortData); + + break; + case 0x25: + sb.AppendLine(CIRCRetriesUsed + RecoveredReported + UnrecCIRCAbortData); + + break; + case 0x26: + sb.AppendLine(AllUsed + RecoveredAbort + UnrecECCAbortData); + + break; + case 0x27: + sb.AppendLine(RetriesUsed + RecoveredAbort + UnrecCIRCAbortData); + + break; + case 0x30: + goto case 0x10; + case 0x31: + goto case 0x11; + case 0x34: + goto case 0x14; + case 0x35: + goto case 0x15; + default: + sb.AppendFormat(Localization.Unknown_recovery_parameter_0, page.Parameter).AppendLine(); + + break; + } + + if(page.WriteRetryCount > 0) + { + sb.AppendFormat("\t" + Localization.Drive_will_repeat_write_operations_0_times, page.WriteRetryCount). + AppendLine(); + } + + if(page.RecoveryTimeLimit > 0) + { + sb.AppendFormat("\t" + Localization.Drive_will_employ_a_maximum_of_0_ms_to_recover_data, + page.RecoveryTimeLimit). + AppendLine(); + } + + return sb.ToString(); + } + +#endregion Mode Page 0x01: Read error recovery page for MultiMedia Devices +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/02.cs b/Aaru.Decoders/SCSI/Modes/02.cs new file mode 100644 index 000000000..e39c98303 --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/02.cs @@ -0,0 +1,224 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 02.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MODE PAGE 02h: Disconnect-reconnect page. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ +#region Mode Page 0x02: Disconnect-reconnect page + + /// Disconnect-reconnect page Page code 0x02 16 bytes in SCSI-2, SPC-1, SPC-2, SPC-3, SPC-4, SPC-5 + public struct ModePage_02 + { + /// Parameters can be saved + public bool PS; + /// How full should be the buffer prior to attempting a reselection + public byte BufferFullRatio; + /// How empty should be the buffer prior to attempting a reselection + public byte BufferEmptyRatio; + /// Max. time in 100 µs increments that the target is permitted to assert BSY without a REQ/ACK + public ushort BusInactivityLimit; + /// Min. time in 100 µs increments to wait after releasing the bus before attempting reselection + public ushort DisconnectTimeLimit; + /// + /// Max. time in 100 µs increments allowed to use the bus before disconnecting, if granted the privilege and not + /// restricted by + /// + public ushort ConnectTimeLimit; + /// Maximum amount of data before disconnecting in 512 bytes increments + public ushort MaxBurstSize; + /// Data transfer disconnect control + public byte DTDC; + + /// Target shall not transfer data for a command during the same interconnect tenancy + public bool DIMM; + /// Wether to use fair or unfair arbitration when requesting an interconnect tenancy + public byte FairArbitration; + /// Max. ammount of data in 512 bytes increments that may be transferred for a command along with the command + public ushort FirstBurstSize; + /// Target is allowed to re-order the data transfer + public bool EMDP; + } + + public static ModePage_02? DecodeModePage_02(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x02) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length < 12) + return null; + + var decoded = new ModePage_02(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.BufferFullRatio = pageResponse[2]; + decoded.BufferEmptyRatio = pageResponse[3]; + decoded.BusInactivityLimit = (ushort)((pageResponse[4] << 8) + pageResponse[5]); + decoded.DisconnectTimeLimit = (ushort)((pageResponse[6] << 8) + pageResponse[7]); + decoded.ConnectTimeLimit = (ushort)((pageResponse[8] << 8) + pageResponse[9]); + decoded.MaxBurstSize = (ushort)((pageResponse[10] << 8) + pageResponse[11]); + + if(pageResponse.Length >= 13) + { + decoded.EMDP |= (pageResponse[12] & 0x80) == 0x80; + decoded.DIMM |= (pageResponse[12] & 0x08) == 0x08; + decoded.FairArbitration = (byte)((pageResponse[12] & 0x70) >> 4); + decoded.DTDC = (byte)(pageResponse[12] & 0x07); + } + + if(pageResponse.Length >= 16) + decoded.FirstBurstSize = (ushort)((pageResponse[14] << 8) + pageResponse[15]); + + return decoded; + } + + public static string PrettifyModePage_02(byte[] pageResponse) => + PrettifyModePage_02(DecodeModePage_02(pageResponse)); + + public static string PrettifyModePage_02(ModePage_02? modePage) + { + if(!modePage.HasValue) + return null; + + ModePage_02 page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_Disconnect_Reconnect_mode_page); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + if(page.BufferFullRatio > 0) + { + sb.AppendFormat("\t" + Localization._0_ratio_of_buffer_that_shall_be_full_prior_to_attempting_a_reselection, + page.BufferFullRatio). + AppendLine(); + } + + if(page.BufferEmptyRatio > 0) + { + sb. + AppendFormat("\t" + Localization._0_ratio_of_buffer_that_shall_be_empty_prior_to_attempting_a_reselection, + page.BufferEmptyRatio). + AppendLine(); + } + + if(page.BusInactivityLimit > 0) + { + sb.AppendFormat("\t" + Localization._0_µs_maximum_permitted_to_assert_BSY_without_a_REQ_ACK_handshake, + page.BusInactivityLimit * 100). + AppendLine(); + } + + if(page.DisconnectTimeLimit > 0) + { + sb. + AppendFormat("\t" + Localization._0_µs_maximum_permitted_wait_after_releasing_the_bus_before_attempting_reselection, + page.DisconnectTimeLimit * 100). + AppendLine(); + } + + if(page.ConnectTimeLimit > 0) + { + sb. + AppendFormat("\t" + Localization._0_µs_allowed_to_use_the_bus_before_disconnecting_if_granted_the_privilege_and_not_restricted, + page.ConnectTimeLimit * 100). + AppendLine(); + } + + if(page.MaxBurstSize > 0) + { + sb.AppendFormat("\t" + Localization._0_bytes_maximum_can_be_transferred_before_disconnecting, + page.MaxBurstSize * 512). + AppendLine(); + } + + if(page.FirstBurstSize > 0) + { + sb. + AppendFormat("\t" + Localization._0_bytes_maximum_can_be_transferred_for_a_command_along_with_the_disconnect_command, + page.FirstBurstSize * 512). + AppendLine(); + } + + if(page.DIMM) + { + sb.AppendLine("\t" + + Localization. + Target_shall_not_transfer_data_for_a_command_during_the_same_interconnect_tenancy); + } + + if(page.EMDP) + sb.AppendLine("\t" + Localization.Target_is_allowed_to_reorder_the_data_transfer); + + switch(page.DTDC) + { + case 0: + sb.AppendLine("\t" + Localization.Data_transfer_disconnect_control_is_not_used); + + break; + case 1: + sb.AppendLine("\t" + + Localization. + All_data_for_a_command_shall_be_transferred_within_a_single_interconnect_tenancy); + + break; + case 3: + sb.AppendLine("\t" + + Localization. + All_data_and_the_response_for_a_command_shall_be_transferred_within_a_single_interconnect_tenancy); + + break; + default: + sb.AppendFormat("\t" + Localization.Reserved_data_transfer_disconnect_control_value_0, page.DTDC). + AppendLine(); + + break; + } + + return sb.ToString(); + } + +#endregion Mode Page 0x02: Disconnect-reconnect page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/03.cs b/Aaru.Decoders/SCSI/Modes/03.cs new file mode 100644 index 000000000..c9cf387c1 --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/03.cs @@ -0,0 +1,181 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 03.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MODE PAGE 03h: Format device page. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ +#region Mode Page 0x03: Format device page + + /// Disconnect-reconnect page Page code 0x03 24 bytes in SCSI-2, SBC-1 + public struct ModePage_03 + { + /// Parameters can be saved + public bool PS; + /// Tracks per zone to use in dividing the capacity for the purpose of allocating alternate sectors + public ushort TracksPerZone; + /// Number of sectors per zone that shall be reserved for defect handling + public ushort AltSectorsPerZone; + /// Number of tracks per zone that shall be reserved for defect handling + public ushort AltTracksPerZone; + /// Number of tracks per LUN that shall be reserved for defect handling + public ushort AltTracksPerLun; + /// Number of physical sectors per track + public ushort SectorsPerTrack; + /// Bytes per physical sector + public ushort BytesPerSector; + /// Interleave value, target dependent + public ushort Interleave; + /// Sectors between last block of one track and first block of the next + public ushort TrackSkew; + /// Sectors between last block of a cylinder and first block of the next one + public ushort CylinderSkew; + /// Soft-sectored + public bool SSEC; + /// Hard-sectored + public bool HSEC; + /// Removable + public bool RMB; + /// + /// If set, address are allocated progressively in a surface before going to the next. Otherwise, it goes by + /// cylinders + /// + public bool SURF; + } + + public static ModePage_03? DecodeModePage_03(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x03) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length < 24) + return null; + + var decoded = new ModePage_03(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.TracksPerZone = (ushort)((pageResponse[2] << 8) + pageResponse[3]); + decoded.AltSectorsPerZone = (ushort)((pageResponse[4] << 8) + pageResponse[5]); + decoded.AltTracksPerZone = (ushort)((pageResponse[6] << 8) + pageResponse[7]); + decoded.AltTracksPerLun = (ushort)((pageResponse[8] << 8) + pageResponse[9]); + decoded.SectorsPerTrack = (ushort)((pageResponse[10] << 8) + pageResponse[11]); + decoded.BytesPerSector = (ushort)((pageResponse[12] << 8) + pageResponse[13]); + decoded.Interleave = (ushort)((pageResponse[14] << 8) + pageResponse[15]); + decoded.TrackSkew = (ushort)((pageResponse[16] << 8) + pageResponse[17]); + decoded.CylinderSkew = (ushort)((pageResponse[18] << 8) + pageResponse[19]); + decoded.SSEC |= (pageResponse[20] & 0x80) == 0x80; + decoded.HSEC |= (pageResponse[20] & 0x40) == 0x40; + decoded.RMB |= (pageResponse[20] & 0x20) == 0x20; + decoded.SURF |= (pageResponse[20] & 0x10) == 0x10; + + return decoded; + } + + public static string PrettifyModePage_03(byte[] pageResponse) => + PrettifyModePage_03(DecodeModePage_03(pageResponse)); + + public static string PrettifyModePage_03(ModePage_03? modePage) + { + if(!modePage.HasValue) + return null; + + ModePage_03 page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_Format_device_page); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + sb. + AppendFormat("\t" + Localization._0_tracks_per_zone_to_use_in_dividing_the_capacity_for_the_purpose_of_allocating_alternate_sectors, + page.TracksPerZone). + AppendLine(); + + sb.AppendFormat("\t" + Localization._0_sectors_per_zone_that_shall_be_reserved_for_defect_handling, + page.AltSectorsPerZone). + AppendLine(); + + sb.AppendFormat("\t" + Localization._0_tracks_per_zone_that_shall_be_reserved_for_defect_handling, + page.AltTracksPerZone). + AppendLine(); + + sb.AppendFormat("\t" + Localization._0_tracks_per_LUN_that_shall_be_reserved_for_defect_handling, + page.AltTracksPerLun). + AppendLine(); + + sb.AppendFormat("\t" + Localization._0_physical_sectors_per_track, page.SectorsPerTrack).AppendLine(); + sb.AppendFormat("\t" + Localization._0_Bytes_per_physical_sector, page.BytesPerSector).AppendLine(); + sb.AppendFormat("\t" + Localization.Target_dependent_interleave_value_is_0, page.Interleave).AppendLine(); + + sb.AppendFormat("\t" + Localization._0_sectors_between_last_block_of_one_track_and_first_block_of_the_next, + page.TrackSkew). + AppendLine(); + + sb.AppendFormat("\t" + Localization._0_sectors_between_last_block_of_a_cylinder_and_first_block_of_the_next_one, + page.CylinderSkew). + AppendLine(); + + if(page.SSEC) + sb.AppendLine("\t" + Localization.Drive_supports_soft_sectoring_format); + + if(page.HSEC) + sb.AppendLine("\t" + Localization.Drive_supports_hard_sectoring_format); + + if(page.RMB) + sb.AppendLine("\t" + Localization.Drive_media_is_removable); + + sb.AppendLine(page.SURF + ? "\t" + + Localization. + Sector_addressing_is_progressively_incremented_in_one_surface_before_going_to_the_next + : "\t" + + Localization. + Sector_addressing_is_progressively_incremented_in_one_cylinder_before_going_to_the_next); + + return sb.ToString(); + } + +#endregion Mode Page 0x03: Format device page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/04.cs b/Aaru.Decoders/SCSI/Modes/04.cs new file mode 100644 index 000000000..404b307b7 --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/04.cs @@ -0,0 +1,168 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 04.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MODE PAGE 04h: Rigid disk drive geometry page. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ +#region Mode Page 0x04: Rigid disk drive geometry page + + /// Disconnect-reconnect page Page code 0x04 24 bytes in SCSI-2, SBC-1 + public struct ModePage_04 + { + /// Parameters can be saved + public bool PS; + /// Cylinders used for data storage + public uint Cylinders; + /// Heads for reading and/or writing + public byte Heads; + /// Cylinder where write precompensation starts + public uint WritePrecompCylinder; + /// Cylinder where write current reduction starts + public uint WriteReduceCylinder; + /// Step rate in 100 ns units + public ushort DriveStepRate; + /// Cylinder where the heads park + public int LandingCylinder; + /// Rotational position locking + public byte RPL; + /// Rotational skew to apply when synchronized + public byte RotationalOffset; + /// Medium speed in rpm + public ushort MediumRotationRate; + } + + public static ModePage_04? DecodeModePage_04(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x04) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length < 20) + return null; + + var decoded = new ModePage_04(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.Cylinders = (uint)((pageResponse[2] << 16) + (pageResponse[3] << 8) + pageResponse[4]); + decoded.Heads = pageResponse[5]; + decoded.WritePrecompCylinder = (uint)((pageResponse[6] << 16) + (pageResponse[7] << 8) + pageResponse[8]); + + decoded.WriteReduceCylinder = (uint)((pageResponse[9] << 16) + (pageResponse[10] << 8) + pageResponse[11]); + + decoded.DriveStepRate = (ushort)((pageResponse[12] << 8) + pageResponse[13]); + + decoded.LandingCylinder = (pageResponse[14] << 16) + (pageResponse[15] << 8) + pageResponse[16]; + decoded.RPL = (byte)(pageResponse[17] & 0x03); + decoded.RotationalOffset = pageResponse[18]; + + if(pageResponse.Length >= 22) + decoded.MediumRotationRate = (ushort)((pageResponse[20] << 8) + pageResponse[21]); + + return decoded; + } + + public static string PrettifyModePage_04(byte[] pageResponse) => + PrettifyModePage_04(DecodeModePage_04(pageResponse)); + + public static string PrettifyModePage_04(ModePage_04? modePage) + { + if(!modePage.HasValue) + return null; + + ModePage_04 page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_Rigid_disk_drive_geometry_page); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + sb.AppendFormat("\t" + Localization._0_heads, page.Heads).AppendLine(); + sb.AppendFormat("\t" + Localization._0_cylinders, page.Cylinders).AppendLine(); + + if(page.WritePrecompCylinder < page.Cylinders) + { + sb.AppendFormat("\t" + Localization.Write_pre_compensation_starts_at_cylinder_0, page.WritePrecompCylinder). + AppendLine(); + } + + if(page.WriteReduceCylinder < page.Cylinders) + { + sb.AppendFormat("\t" + Localization.Write_current_reduction_starts_at_cylinder_0, page.WriteReduceCylinder). + AppendLine(); + } + + if(page.DriveStepRate > 0) + sb.AppendFormat("\t" + Localization.Drive_steps_in_0_ns, (uint)page.DriveStepRate * 100).AppendLine(); + + sb.AppendFormat("\t" + Localization.Heads_park_in_cylinder_0, page.LandingCylinder).AppendLine(); + + if(page.MediumRotationRate > 0) + sb.AppendFormat("\t" + Localization.Medium_rotates_at_0_rpm, page.MediumRotationRate).AppendLine(); + + switch(page.RPL) + { + case 0: + sb.AppendLine("\t" + Localization.Spindle_synchronization_is_disabled_or_unsupported); + + break; + case 1: + sb.AppendLine("\t" + Localization.Target_operates_as_a_synchronized_spindle_slave); + + break; + case 2: + sb.AppendLine("\t" + Localization.Target_operates_as_a_synchronized_spindle_master); + + break; + case 3: + sb.AppendLine("\t" + Localization.Target_operates_as_a_synchronized_spindle_master_control); + + break; + } + + return sb.ToString(); + } + +#endregion Mode Page 0x04: Rigid disk drive geometry page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/05.cs b/Aaru.Decoders/SCSI/Modes/05.cs new file mode 100644 index 000000000..0534a0d80 --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/05.cs @@ -0,0 +1,340 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 05.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MODE PAGE 05h: Flexible disk page. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ +#region Mode Page 0x05: Flexible disk page + + /// Disconnect-reconnect page Page code 0x05 32 bytes in SCSI-2, SBC-1 + public struct ModePage_05 + { + /// Parameters can be saved + public bool PS; + /// Data rate of peripheral device on kbit/s + public ushort TransferRate; + /// Heads for reading and/or writing + public byte Heads; + /// Sectors per revolution per head + public byte SectorsPerTrack; + /// Bytes of data per sector + public ushort BytesPerSector; + /// Cylinders used for data storage + public ushort Cylinders; + /// Cylinder where write precompensation starts + public ushort WritePrecompCylinder; + /// Cylinder where write current reduction starts + public ushort WriteReduceCylinder; + /// Step rate in 100 μs units + public ushort DriveStepRate; + /// Width of step pulse in μs + public byte DriveStepPulse; + /// Head settle time in 100 μs units + public ushort HeadSettleDelay; + /// + /// If is true, specified in 1/10s of a second the time waiting for read status before + /// aborting medium access. Otherwise, indicates time to way before medimum access after motor on signal is asserted. + /// + public byte MotorOnDelay; + /// + /// Time in 1/10s of a second to wait before releasing the motor on signal after an idle condition. 0xFF means to + /// never release the signal + /// + public byte MotorOffDelay; + /// Specifies if a signal indicates that the medium is ready to be accessed + public bool TRDY; + /// If true sectors start with one. Otherwise, they start with zero. + public bool SSN; + /// If true specifies that motor on shall remain released. + public bool MO; + /// Number of additional step pulses per cylinder. + public byte SPC; + /// Write compensation value + public byte WriteCompensation; + /// Head loading time in ms. + public byte HeadLoadDelay; + /// Head unloading time in ms. + public byte HeadUnloadDelay; + /// Description of shugart's bus pin 34 usage + public byte Pin34; + /// Description of shugart's bus pin 2 usage + public byte Pin2; + /// Description of shugart's bus pin 4 usage + public byte Pin4; + /// Description of shugart's bus pin 1 usage + public byte Pin1; + /// Medium speed in rpm + public ushort MediumRotationRate; + } + + public static ModePage_05? DecodeModePage_05(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x05) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length < 32) + return null; + + var decoded = new ModePage_05(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.TransferRate = (ushort)((pageResponse[2] << 8) + pageResponse[3]); + decoded.Heads = pageResponse[4]; + decoded.SectorsPerTrack = pageResponse[5]; + decoded.BytesPerSector = (ushort)((pageResponse[6] << 8) + pageResponse[7]); + decoded.Cylinders = (ushort)((pageResponse[8] << 8) + pageResponse[9]); + decoded.WritePrecompCylinder = (ushort)((pageResponse[10] << 8) + pageResponse[11]); + decoded.WriteReduceCylinder = (ushort)((pageResponse[12] << 8) + pageResponse[13]); + decoded.DriveStepRate = (ushort)((pageResponse[14] << 8) + pageResponse[15]); + decoded.DriveStepPulse = pageResponse[16]; + decoded.HeadSettleDelay = (ushort)((pageResponse[17] << 8) + pageResponse[18]); + decoded.MotorOnDelay = pageResponse[19]; + decoded.MotorOffDelay = pageResponse[20]; + decoded.TRDY |= (pageResponse[21] & 0x80) == 0x80; + decoded.SSN |= (pageResponse[21] & 0x40) == 0x40; + decoded.MO |= (pageResponse[21] & 0x20) == 0x20; + decoded.SPC = (byte)(pageResponse[22] & 0x0F); + decoded.WriteCompensation = pageResponse[23]; + decoded.HeadLoadDelay = pageResponse[24]; + decoded.HeadUnloadDelay = pageResponse[25]; + decoded.Pin34 = (byte)((pageResponse[26] & 0xF0) >> 4); + decoded.Pin2 = (byte)(pageResponse[26] & 0x0F); + decoded.Pin4 = (byte)((pageResponse[27] & 0xF0) >> 4); + decoded.Pin1 = (byte)(pageResponse[27] & 0x0F); + decoded.MediumRotationRate = (ushort)((pageResponse[28] << 8) + pageResponse[29]); + + return decoded; + } + + public static string PrettifyModePage_05(byte[] pageResponse) => + PrettifyModePage_05(DecodeModePage_05(pageResponse)); + + public static string PrettifyModePage_05(ModePage_05? modePage) + { + if(!modePage.HasValue) + return null; + + ModePage_05 page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_Flexible_disk_page); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + sb.AppendFormat("\t" + Localization.Transfer_rate_0_kbits, page.TransferRate).AppendLine(); + sb.AppendFormat("\t" + Localization._0_heads, page.Heads).AppendLine(); + sb.AppendFormat("\t" + Localization._0_cylinders, page.Cylinders).AppendLine(); + sb.AppendFormat("\t" + Localization._0_sectors_per_track, page.SectorsPerTrack).AppendLine(); + sb.AppendFormat("\t" + Localization._0_bytes_per_sector, page.BytesPerSector).AppendLine(); + + if(page.WritePrecompCylinder < page.Cylinders) + { + sb.AppendFormat("\t" + Localization.Write_pre_compensation_starts_at_cylinder_0, page.WritePrecompCylinder). + AppendLine(); + } + + if(page.WriteReduceCylinder < page.Cylinders) + { + sb.AppendFormat("\t" + Localization.Write_current_reduction_starts_at_cylinder_0, page.WriteReduceCylinder). + AppendLine(); + } + + if(page.DriveStepRate > 0) + sb.AppendFormat("\t" + Localization.Drive_steps_in_0_μs, (uint)page.DriveStepRate * 100).AppendLine(); + + if(page.DriveStepPulse > 0) + sb.AppendFormat("\t" + Localization.Each_step_pulse_is_0_ms, page.DriveStepPulse).AppendLine(); + + if(page.HeadSettleDelay > 0) + sb.AppendFormat("\t" + Localization.Heads_settles_in_0_μs, (uint)page.HeadSettleDelay * 100).AppendLine(); + + if(!page.TRDY) + { + sb. + AppendFormat("\t" + Localization.Target_shall_wait_0_seconds_before_attempting_to_access_the_medium_after_motor_on_is_asserted, + (double)page.MotorOnDelay * 10). + AppendLine(); + } + else + { + sb. + AppendFormat("\t" + Localization.Target_shall_wait_0_seconds_after_drive_is_ready_before_aborting_medium_access_attempts, + (double)page.MotorOnDelay * 10). + AppendLine(); + } + + if(page.MotorOffDelay != 0xFF) + { + sb. + AppendFormat("\t" + Localization.Target_shall_wait_0_seconds_before_releasing_the_motor_on_signal_after_becoming_idle, + (double)page.MotorOffDelay * 10). + AppendLine(); + } + else + sb.AppendLine("\t" + Localization.Target_shall_never_release_the_motor_on_signal); + + if(page.TRDY) + sb.AppendLine("\t" + Localization.There_is_a_drive_ready_signal); + + if(page.SSN) + sb.AppendLine("\t" + Localization.Sectors_start_at_1); + + if(page.MO) + sb.AppendLine("\t" + Localization.The_motor_on_signal_shall_remain_released); + + sb.AppendFormat("\t" + Localization.Drive_needs_to_do_0_step_pulses_per_cylinder, page.SPC + 1).AppendLine(); + + if(page.WriteCompensation > 0) + sb.AppendFormat("\t" + Localization.Write_pre_compensation_is_0, page.WriteCompensation).AppendLine(); + + if(page.HeadLoadDelay > 0) + sb.AppendFormat("\t" + Localization.Head_takes_0_ms_to_load, page.HeadLoadDelay).AppendLine(); + + if(page.HeadUnloadDelay > 0) + sb.AppendFormat("\t" + Localization.Head_takes_0_ms_to_unload, page.HeadUnloadDelay).AppendLine(); + + if(page.MediumRotationRate > 0) + sb.AppendFormat("\t" + Localization.Medium_rotates_at_0_rpm, page.MediumRotationRate).AppendLine(); + + switch(page.Pin34 & 0x07) + { + case 0: + sb.AppendLine("\t" + Localization.Pin_34_is_unconnected); + + break; + case 1: + sb.Append("\t" + + ((page.Pin34 & 0x08) == 0x08 + ? Localization.Pin_34_indicates_drive_is_ready_when_active_high + : Localization.Pin_34_indicates_drive_is_ready_when_active_low)); + + break; + case 2: + sb.Append("\t" + + ((page.Pin34 & 0x08) == 0x08 + ? Localization.Pin_34_indicates_disk_has_changed_when_active_high + : Localization.Pin_34_indicates_disk_has_changed_when_active_low)); + + break; + default: + sb.AppendFormat("\t" + ((page.Pin34 & 0x08) == 0x08 ? Localization.Pin_34_indicates_unknown_function_0_when_active_high : Localization.Pin_34_indicates_unknown_function_0_when_active_low), + page.Pin34 & 0x07); + + break; + } + + switch(page.Pin4 & 0x07) + { + case 0: + sb.AppendLine("\t" + Localization.Pin_4_is_unconnected); + + break; + case 1: + sb.Append("\t" + + ((page.Pin4 & 0x08) == 0x08 + ? Localization.Pin_4_indicates_drive_is_in_use_when_active_high + : Localization.Pin_4_indicates_drive_is_in_use_when_active_low)); + + break; + case 2: + sb.Append("\t" + + ((page.Pin4 & 0x08) == 0x08 + ? Localization.Pin_4_indicates_eject_when_active_high + : Localization.Pin_4_indicates_eject_when_active_low)); + + break; + case 3: + sb.Append("\t" + + ((page.Pin4 & 0x08) == 0x08 + ? Localization.Pin_4_indicates_head_load_when_active_high + : Localization.Pin_4_indicates_head_load_when_active_low)); + + break; + default: + sb.AppendFormat("\t" + ((page.Pin4 & 0x08) == 0x08 ? Localization.Pin_4_indicates_unknown_function_0_when_active_high : Localization.Pin_4_indicates_unknown_function_0_when_active_low), + page.Pin4 & 0x07); + + break; + } + + switch(page.Pin2 & 0x07) + { + case 0: + sb.AppendLine("\t" + Localization.Pin_2_is_unconnected); + + break; + default: + sb.AppendFormat("\t" + ((page.Pin2 & 0x08) == 0x08 ? Localization.Pin_2_indicates_unknown_function_0_when_active_high : Localization.Pin_2_indicates_unknown_function_0_when_active_low), + page.Pin2 & 0x07); + + break; + } + + switch(page.Pin1 & 0x07) + { + case 0: + sb.AppendLine("\t" + Localization.Pin_1_is_unconnected); + + break; + case 1: + sb.Append("\t" + + ((page.Pin1 & 0x08) == 0x08 + ? Localization.Pin_1_indicates_disk_change_reset_when_active_high + : Localization.Pin_1_indicates_disk_change_reset_when_active_low)); + + break; + default: + sb.AppendFormat("\t" + ((page.Pin1 & 0x08) == 0x08 ? Localization.Pin_1_indicates_unknown_function_0_when_active_high : Localization.Pin_1_indicates_unknown_function_0_when_active_low), + page.Pin1 & 0x07); + + break; + } + + return sb.ToString(); + } + +#endregion Mode Page 0x05: Flexible disk page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/06.cs b/Aaru.Decoders/SCSI/Modes/06.cs new file mode 100644 index 000000000..484db187d --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/06.cs @@ -0,0 +1,99 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 06.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MODE PAGE 06h: Optical memory page. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ +#region Mode Page 0x06: Optical memory page + + /// Optical memory page Page code 0x06 4 bytes in SCSI-2 + public struct ModePage_06 + { + /// Parameters can be saved + public bool PS; + /// Report updated block read + public bool RUBR; + } + + public static ModePage_06? DecodeModePage_06(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x06) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length < 4) + return null; + + var decoded = new ModePage_06(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.RUBR |= (pageResponse[2] & 0x01) == 0x01; + + return decoded; + } + + public static string PrettifyModePage_06(byte[] pageResponse) => + PrettifyModePage_06(DecodeModePage_06(pageResponse)); + + public static string PrettifyModePage_06(ModePage_06? modePage) + { + if(!modePage.HasValue) + return null; + + ModePage_06 page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_optical_memory); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + if(page.RUBR) + sb.AppendLine("\t" + Localization.On_reading_an_updated_block_drive_will_return_RECOVERED_ERROR); + + return sb.ToString(); + } + +#endregion Mode Page 0x06: Optical memory page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/07.cs b/Aaru.Decoders/SCSI/Modes/07.cs new file mode 100644 index 000000000..7cc13f2c8 --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/07.cs @@ -0,0 +1,141 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 07.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MODE PAGE 07h: Verify error recovery page. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +public static partial class Modes +{ +#region Mode Page 0x07: Verify error recovery page + + /// Disconnect-reconnect page Page code 0x07 12 bytes in SCSI-2, SBC-1, SBC-2 + public struct ModePage_07 + { + /// Parameters can be saved + public bool PS; + /// Enable early recovery + public bool EER; + /// Post error reporting + public bool PER; + /// Disable transfer on error + public bool DTE; + /// Disable correction + public bool DCR; + /// How many times to retry a verify operation + public byte VerifyRetryCount; + /// How many bits of largest data burst error is maximum to apply error correction on it + public byte CorrectionSpan; + /// Maximum time in ms to use in data error recovery procedures + public ushort RecoveryTimeLimit; + } + + public static ModePage_07? DecodeModePage_07(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x07) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length < 12) + return null; + + var decoded = new ModePage_07(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.EER |= (pageResponse[2] & 0x08) == 0x08; + decoded.PER |= (pageResponse[2] & 0x04) == 0x04; + decoded.DTE |= (pageResponse[2] & 0x02) == 0x02; + decoded.DCR |= (pageResponse[2] & 0x01) == 0x01; + + decoded.VerifyRetryCount = pageResponse[3]; + decoded.CorrectionSpan = pageResponse[4]; + decoded.RecoveryTimeLimit = (ushort)((pageResponse[10] << 8) + pageResponse[11]); + + return decoded; + } + + public static string PrettifyModePage_07(byte[] pageResponse) => + PrettifyModePage_07(DecodeModePage_07(pageResponse)); + + public static string PrettifyModePage_07(ModePage_07? modePage) + { + if(!modePage.HasValue) + return null; + + ModePage_07 page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_Verify_error_recovery_page); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + if(page.EER) + sb.AppendLine("\t" + Localization.Drive_will_use_the_most_expedient_form_of_error_recovery_first); + + if(page.PER) + sb.AppendLine("\t" + Localization.Drive_shall_report_recovered_errors); + + if(page.DTE) + sb.AppendLine("\t" + Localization.Transfer_will_be_terminated_upon_error_detection); + + if(page.DCR) + sb.AppendLine("\t" + Localization.Error_correction_is_disabled); + + if(page.VerifyRetryCount > 0) + { + sb.AppendFormat("\t" + Localization.Drive_will_repeat_verify_operations_0_times, page.VerifyRetryCount). + AppendLine(); + } + + if(page.RecoveryTimeLimit > 0) + { + sb.AppendFormat("\t" + Localization.Drive_will_employ_a_maximum_of_0_ms_to_recover_data, + page.RecoveryTimeLimit). + AppendLine(); + } + + return sb.ToString(); + } + +#endregion Mode Page 0x07: Verify error recovery page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/07_MMC.cs b/Aaru.Decoders/SCSI/Modes/07_MMC.cs new file mode 100644 index 000000000..037af1046 --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/07_MMC.cs @@ -0,0 +1,205 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 07_MMC.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MODE PAGE 07h: Verify error recovery page for MultiMedia Devices. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ +#region Mode Page 0x07: Verify error recovery page for MultiMedia Devices + + /// Verify error recovery page for MultiMedia Devices Page code 0x07 8 bytes in SCSI-2, MMC-1 + public struct ModePage_07_MMC + { + /// Parameters can be saved + public bool PS; + /// Error recovery parameter + public byte Parameter; + /// How many times to retry a verify operation + public byte VerifyRetryCount; + } + + public static ModePage_07_MMC? DecodeModePage_07_MMC(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x07) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length < 8) + return null; + + var decoded = new ModePage_07_MMC(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.Parameter = pageResponse[2]; + decoded.VerifyRetryCount = pageResponse[3]; + + return decoded; + } + + public static string PrettifyModePage_07_MMC(byte[] pageResponse) => + PrettifyModePage_07_MMC(DecodeModePage_07_MMC(pageResponse)); + + public static string PrettifyModePage_07_MMC(ModePage_07_MMC? modePage) + { + if(!modePage.HasValue) + return null; + + ModePage_07_MMC page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_Verify_error_recovery_page_for_MultiMedia_Devices); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + if(page.VerifyRetryCount > 0) + { + sb.AppendFormat("\t" + Localization.Drive_will_repeat_verify_operations_0_times, page.VerifyRetryCount). + AppendLine(); + } + + string AllUsed = "\t" + Localization.All_available_recovery_procedures_will_be_used + "\n"; + string CIRCRetriesUsed = "\t" + Localization.Only_retries_and_CIRC_are_used + "\n"; + string RetriesUsed = "\t" + Localization.Only_retries_are_used + "\n"; + string RecoveredNotReported = "\t" + Localization.Recovered_errors_will_not_be_reported + "\n"; + string RecoveredReported = "\t" + Localization.Recovered_errors_will_be_reported + "\n"; + + string RecoveredAbort = + "\t" + Localization.Recovered_errors_will_be_reported_and_aborted_with_CHECK_CONDITION + "\n"; + + string UnrecECCAbort = "\t" + Localization.Unrecovered_ECC_errors_will_return_CHECK_CONDITION; + string UnrecCIRCAbort = "\t" + Localization.Unrecovered_CIRC_errors_will_return_CHECK_CONDITION; + string UnrecECCNotAbort = "\t" + Localization.Unrecovered_ECC_errors_will_not_abort_the_transfer; + string UnrecCIRCNotAbort = "\t" + Localization.Unrecovered_CIRC_errors_will_not_abort_the_transfer; + + string UnrecECCAbortData = + "\t" + Localization.Unrecovered_ECC_errors_will_return_CHECK_CONDITION_and_the_uncorrected_data; + + string UnrecCIRCAbortData = + "\t" + Localization.Unrecovered_CIRC_errors_will_return_CHECK_CONDITION_and_the_uncorrected_data; + + switch(page.Parameter) + { + case 0x00: + sb.AppendLine(AllUsed + RecoveredNotReported + UnrecECCAbort); + + break; + case 0x01: + sb.AppendLine(CIRCRetriesUsed + RecoveredNotReported + UnrecCIRCAbort); + + break; + case 0x04: + sb.AppendLine(AllUsed + RecoveredReported + UnrecECCAbort); + + break; + case 0x05: + sb.AppendLine(CIRCRetriesUsed + RecoveredReported + UnrecCIRCAbort); + + break; + case 0x06: + sb.AppendLine(AllUsed + RecoveredAbort + UnrecECCAbort); + + break; + case 0x07: + sb.AppendLine(RetriesUsed + RecoveredAbort + UnrecCIRCAbort); + + break; + case 0x10: + sb.AppendLine(AllUsed + RecoveredNotReported + UnrecECCNotAbort); + + break; + case 0x11: + sb.AppendLine(CIRCRetriesUsed + RecoveredNotReported + UnrecCIRCNotAbort); + + break; + case 0x14: + sb.AppendLine(AllUsed + RecoveredReported + UnrecECCNotAbort); + + break; + case 0x15: + sb.AppendLine(CIRCRetriesUsed + RecoveredReported + UnrecCIRCNotAbort); + + break; + case 0x20: + sb.AppendLine(AllUsed + RecoveredNotReported + UnrecECCAbortData); + + break; + case 0x21: + sb.AppendLine(CIRCRetriesUsed + RecoveredNotReported + UnrecCIRCAbortData); + + break; + case 0x24: + sb.AppendLine(AllUsed + RecoveredReported + UnrecECCAbortData); + + break; + case 0x25: + sb.AppendLine(CIRCRetriesUsed + RecoveredReported + UnrecCIRCAbortData); + + break; + case 0x26: + sb.AppendLine(AllUsed + RecoveredAbort + UnrecECCAbortData); + + break; + case 0x27: + sb.AppendLine(RetriesUsed + RecoveredAbort + UnrecCIRCAbortData); + + break; + case 0x30: + goto case 0x10; + case 0x31: + goto case 0x11; + case 0x34: + goto case 0x14; + case 0x35: + goto case 0x15; + default: + sb.AppendFormat(Localization.Unknown_recovery_parameter_0, page.Parameter).AppendLine(); + + break; + } + + return sb.ToString(); + } + +#endregion Mode Page 0x07: Verify error recovery page for MultiMedia Devices +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/08.cs b/Aaru.Decoders/SCSI/Modes/08.cs new file mode 100644 index 000000000..2346c9d37 --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/08.cs @@ -0,0 +1,322 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 08.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MODE PAGE 08h: Caching page. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ +#region Mode Page 0x08: Caching page + + /// Disconnect-reconnect page Page code 0x08 12 bytes in SCSI-2 20 bytes in SBC-1, SBC-2, SBC-3 + public struct ModePage_08 + { + /// Parameters can be saved + public bool PS; + /// true if write cache is enabled + public bool WCE; + /// Multiplication factor + public bool MF; + /// true if read cache is enabled + public bool RCD; + /// Advices on reading-cache retention priority + public byte DemandReadRetentionPrio; + /// Advices on writing-cache retention priority + public byte WriteRetentionPriority; + /// If requested read blocks are more than this, no pre-fetch is done + public ushort DisablePreFetch; + /// Minimum pre-fetch + public ushort MinimumPreFetch; + /// Maximum pre-fetch + public ushort MaximumPreFetch; + /// Upper limit on maximum pre-fetch value + public ushort MaximumPreFetchCeiling; + + /// Manual cache controlling + public bool IC; + /// Abort pre-fetch + public bool ABPF; + /// Caching analysis permitted + public bool CAP; + /// Pre-fetch over discontinuities + public bool Disc; + /// is to be used to control caching segmentation + public bool Size; + /// Force sequential write + public bool FSW; + /// Logical block cache segment size + public bool LBCSS; + /// Disable read-ahead + public bool DRA; + /// How many segments should the cache be divided upon + public byte CacheSegments; + /// How many bytes should the cache be divided upon + public ushort CacheSegmentSize; + /// How many bytes should be used as a buffer when all other cached data cannot be evicted + public uint NonCacheSegmentSize; + + public bool NV_DIS; + } + + public static ModePage_08? DecodeModePage_08(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x08) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length < 12) + return null; + + var decoded = new ModePage_08(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.WCE |= (pageResponse[2] & 0x04) == 0x04; + decoded.MF |= (pageResponse[2] & 0x02) == 0x02; + decoded.RCD |= (pageResponse[2] & 0x01) == 0x01; + + decoded.DemandReadRetentionPrio = (byte)((pageResponse[3] & 0xF0) >> 4); + decoded.WriteRetentionPriority = (byte)(pageResponse[3] & 0x0F); + decoded.DisablePreFetch = (ushort)((pageResponse[4] << 8) + pageResponse[5]); + decoded.MinimumPreFetch = (ushort)((pageResponse[6] << 8) + pageResponse[7]); + decoded.MaximumPreFetch = (ushort)((pageResponse[8] << 8) + pageResponse[9]); + decoded.MaximumPreFetchCeiling = (ushort)((pageResponse[10] << 8) + pageResponse[11]); + + if(pageResponse.Length < 20) + return decoded; + + decoded.IC |= (pageResponse[2] & 0x80) == 0x80; + decoded.ABPF |= (pageResponse[2] & 0x40) == 0x40; + decoded.CAP |= (pageResponse[2] & 0x20) == 0x20; + decoded.Disc |= (pageResponse[2] & 0x10) == 0x10; + decoded.Size |= (pageResponse[2] & 0x08) == 0x08; + + decoded.FSW |= (pageResponse[12] & 0x80) == 0x80; + decoded.LBCSS |= (pageResponse[12] & 0x40) == 0x40; + decoded.DRA |= (pageResponse[12] & 0x20) == 0x20; + + decoded.CacheSegments = pageResponse[13]; + decoded.CacheSegmentSize = (ushort)((pageResponse[14] << 8) + pageResponse[15]); + decoded.NonCacheSegmentSize = (uint)((pageResponse[17] << 16) + (pageResponse[18] << 8) + pageResponse[19]); + + decoded.NV_DIS |= (pageResponse[12] & 0x01) == 0x01; + + return decoded; + } + + public static string PrettifyModePage_08(byte[] pageResponse) => + PrettifyModePage_08(DecodeModePage_08(pageResponse)); + + public static string PrettifyModePage_08(ModePage_08? modePage) + { + if(!modePage.HasValue) + return null; + + ModePage_08 page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_Caching_mode_page); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + if(page.RCD) + sb.AppendLine("\t" + Localization.Read_cache_is_enabled); + + if(page.WCE) + sb.AppendLine("\t" + Localization.Write_cache_is_enabled); + + switch(page.DemandReadRetentionPrio) + { + case 0: + sb.AppendLine("\t" + Localization.Drive_does_not_distinguish_between_cached_read_data); + + break; + case 1: + sb.AppendLine("\t" + + Localization. + Data_put_by_READ_commands_should_be_evicted_from_cache_sooner_than_data_put_in_read_cache_by_other_means); + + break; + case 0xF: + sb.AppendLine("\t" + + Localization. + Data_put_by_READ_commands_should_not_be_evicted_if_there_is_data_cached_by_other_means_that_can_be_evicted); + + break; + default: + sb.AppendFormat("\t" + Localization.Unknown_demand_read_retention_priority_value_0, + page.DemandReadRetentionPrio). + AppendLine(); + + break; + } + + switch(page.WriteRetentionPriority) + { + case 0: + sb.AppendLine("\t" + Localization.Drive_does_not_distinguish_between_cached_write_data); + + break; + case 1: + sb.AppendLine("\t" + + Localization. + Data_put_by_WRITE_commands_should_be_evicted_from_cache_sooner_than_data_put_in_write_cache_by_other_means); + + break; + case 0xF: + sb.AppendLine("\t" + + Localization. + Data_put_by_WRITE_commands_should_not_be_evicted_if_there_is_data_cached_by_other_means_that_can_be_evicted); + + break; + default: + sb.AppendFormat("\t" + Localization.Unknown_demand_write_retention_priority_value_0, + page.DemandReadRetentionPrio). + AppendLine(); + + break; + } + + if(page.DRA) + sb.AppendLine("\t" + Localization.Read_ahead_is_disabled); + else + { + if(page.MF) + sb.AppendLine("\t" + Localization.Pre_fetch_values_indicate_a_block_multiplier); + + if(page.DisablePreFetch == 0) + sb.AppendLine("\t" + Localization.No_pre_fetch_will_be_done); + else + { + sb.AppendFormat("\t" + Localization.Pre_fetch_will_be_done_for_READ_commands_of_0_blocks_or_less, + page.DisablePreFetch). + AppendLine(); + + if(page.MinimumPreFetch > 0) + { + sb.AppendFormat(Localization.At_least_0_blocks_will_be_always_pre_fetched, page.MinimumPreFetch). + AppendLine(); + } + + if(page.MaximumPreFetch > 0) + { + sb.AppendFormat("\t" + Localization.A_maximum_of_0_blocks_will_be_pre_fetched, + page.MaximumPreFetch). + AppendLine(); + } + + if(page.MaximumPreFetchCeiling > 0) + { + sb. + AppendFormat("\t" + Localization.A_maximum_of_0_blocks_will_be_pre_fetched_even_if_it_is_commanded_to_pre_fetch_more, + page.MaximumPreFetchCeiling). + AppendLine(); + } + + if(page.IC) + { + sb.AppendLine("\t" + + Localization. + Device_should_use_number_of_cache_segments_or_cache_segment_size_for_caching); + } + + if(page.ABPF) + sb.AppendLine("\t" + Localization.Pre_fetch_should_be_aborted_upon_receiving_a_new_command); + + if(page.CAP) + sb.AppendLine("\t" + Localization.Caching_analysis_is_permitted); + + if(page.Disc) + { + sb.AppendLine("\t" + + Localization. + Pre_fetch_can_continue_across_discontinuities_such_as_cylinders_or_tracks); + } + } + } + + if(page.FSW) + sb.AppendLine("\t" + Localization.Drive_should_not_reorder_the_sequence_of_write_commands_to_be_faster); + + if(page.Size) + { + if(page.CacheSegmentSize > 0) + { + if(page.LBCSS) + { + sb.AppendFormat("\t" + Localization.Drive_cache_segments_should_be_0_blocks_long, + page.CacheSegmentSize). + AppendLine(); + } + else + { + sb.AppendFormat("\t" + Localization.Drive_cache_segments_should_be_0_bytes_long, + page.CacheSegmentSize). + AppendLine(); + } + } + } + else + { + if(page.CacheSegments > 0) + { + sb.AppendFormat("\t" + Localization.Drive_should_have_0_cache_segments, page.CacheSegments). + AppendLine(); + } + } + + if(page.NonCacheSegmentSize > 0) + { + sb. + AppendFormat("\t" + Localization.Drive_shall_allocate_0_bytes_to_buffer_even_when_all_cached_data_cannot_be_evicted, + page.NonCacheSegmentSize). + AppendLine(); + } + + if(page.NV_DIS) + sb.AppendLine("\t" + Localization.Non_Volatile_cache_is_disabled); + + return sb.ToString(); + } + +#endregion Mode Page 0x08: Caching page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/0A.cs b/Aaru.Decoders/SCSI/Modes/0A.cs new file mode 100644 index 000000000..2dd71587e --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/0A.cs @@ -0,0 +1,505 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 0A.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MODE PAGE 0Ah: Control mode page. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ +#region Mode Page 0x0A: Control mode page + + /// Control mode page Page code 0x0A 8 bytes in SCSI-2 12 bytes in SPC-1, SPC-2, SPC-3, SPC-4, SPC-5 + public struct ModePage_0A + { + /// Parameters can be saved + public bool PS; + /// If set, target shall report log exception conditions + public bool RLEC; + /// Queue algorithm modifier + public byte QueueAlgorithm; + /// + /// If set all remaining suspended I/O processes shall be aborted after the contingent allegiance condition or + /// extended contingent allegiance condition + /// + public byte QErr; + /// Tagged queuing is disabled + public bool DQue; + /// Extended Contingent Allegiance is enabled + public bool EECA; + /// Target may issue an asynchronous event notification upon completing its initialization + public bool RAENP; + /// Target may issue an asynchronous event notification instead of a unit attention condition + public bool UAAENP; + /// Target may issue an asynchronous event notification instead of a deferred error + public bool EAENP; + /// Minimum time in ms after initialization before attempting asynchronous event notifications + public ushort ReadyAENHoldOffPeriod; + + /// Global logging target save disabled + public bool GLTSD; + /// CHECK CONDITION should be reported rather than a long busy condition + public bool RAC; + /// Software write protect is active + public bool SWP; + /// Maximum time in 100 ms units allowed to remain busy. 0xFFFF == unlimited. + public ushort BusyTimeoutPeriod; + + /// Task set type + public byte TST; + /// Tasks aborted by other initiator's actions should be terminated with TASK ABORTED + public bool TAS; + /// Action to be taken when a medium is inserted + public byte AutoloadMode; + /// Time in seconds to complete an extended self-test + public byte ExtendedSelfTestCompletionTime; + + /// All tasks received in nexus with ACA ACTIVE is set and an ACA condition is established shall terminate + public bool TMF_ONLY; + /// + /// Device shall return descriptor format sense data when returning sense data in the same transactions as a CHECK + /// CONDITION + /// + public bool D_SENSE; + /// Unit attention interlocks control + public byte UA_INTLCK_CTRL; + /// LOGICAL BLOCK APPLICATION TAG should not be modified + public bool ATO; + + /// Protector information checking is disabled + public bool DPICZ; + /// No unit attention on release + public bool NUAR; + /// Application Tag mode page is enabled + public bool ATMPE; + /// Abort any write command without protection information + public bool RWWP; + /// Supportes block lengths and protection information + public bool SBLP; + } + + public static ModePage_0A? DecodeModePage_0A(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x0A) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length < 8) + return null; + + var decoded = new ModePage_0A(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.RLEC |= (pageResponse[2] & 0x01) == 0x01; + + decoded.QueueAlgorithm = (byte)((pageResponse[3] & 0xF0) >> 4); + decoded.QErr = (byte)((pageResponse[3] & 0x06) >> 1); + + decoded.DQue |= (pageResponse[3] & 0x01) == 0x01; + decoded.EECA |= (pageResponse[4] & 0x80) == 0x80; + decoded.RAENP |= (pageResponse[4] & 0x04) == 0x04; + decoded.UAAENP |= (pageResponse[4] & 0x02) == 0x02; + decoded.EAENP |= (pageResponse[4] & 0x01) == 0x01; + + decoded.ReadyAENHoldOffPeriod = (ushort)((pageResponse[6] << 8) + pageResponse[7]); + + if(pageResponse.Length < 10) + return decoded; + + // SPC-1 + decoded.GLTSD |= (pageResponse[2] & 0x02) == 0x02; + decoded.RAC |= (pageResponse[4] & 0x40) == 0x40; + decoded.SWP |= (pageResponse[4] & 0x08) == 0x08; + + decoded.BusyTimeoutPeriod = (ushort)((pageResponse[8] << 8) + pageResponse[9]); + + // SPC-2 + decoded.TST = (byte)((pageResponse[2] & 0xE0) >> 5); + decoded.TAS |= (pageResponse[4] & 0x80) == 0x80; + decoded.AutoloadMode = (byte)(pageResponse[5] & 0x07); + decoded.BusyTimeoutPeriod = (ushort)((pageResponse[10] << 8) + pageResponse[11]); + + // SPC-3 + decoded.TMF_ONLY |= (pageResponse[2] & 0x10) == 0x10; + decoded.D_SENSE |= (pageResponse[2] & 0x04) == 0x04; + decoded.UA_INTLCK_CTRL = (byte)((pageResponse[4] & 0x30) >> 4); + decoded.TAS |= (pageResponse[5] & 0x40) == 0x40; + decoded.ATO |= (pageResponse[5] & 0x80) == 0x80; + + // SPC-5 + decoded.DPICZ |= (pageResponse[2] & 0x08) == 0x08; + decoded.NUAR |= (pageResponse[3] & 0x08) == 0x08; + decoded.ATMPE |= (pageResponse[5] & 0x20) == 0x20; + decoded.RWWP |= (pageResponse[5] & 0x10) == 0x10; + decoded.SBLP |= (pageResponse[5] & 0x08) == 0x08; + + return decoded; + } + + public static string PrettifyModePage_0A(byte[] pageResponse) => + PrettifyModePage_0A(DecodeModePage_0A(pageResponse)); + + public static string PrettifyModePage_0A(ModePage_0A? modePage) + { + if(!modePage.HasValue) + return null; + + ModePage_0A page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_Control_mode_page); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + if(page.RLEC) + sb.AppendLine("\t" + Localization.If_set_target_shall_report_log_exception_conditions); + + if(page.DQue) + sb.AppendLine("\t" + Localization.Tagged_queuing_is_disabled); + + if(page.EECA) + sb.AppendLine("\t" + Localization.Extended_Contingent_Allegiance_is_enabled); + + if(page.RAENP) + { + sb.AppendLine("\t" + + Localization. + Target_may_issue_an_asynchronous_event_notification_upon_completing_its_initialization); + } + + if(page.UAAENP) + { + sb.AppendLine("\t" + + Localization. + Target_may_issue_an_asynchronous_event_notification_instead_of_a_unit_attention_condition); + } + + if(page.EAENP) + { + sb.AppendLine("\t" + + Localization.Target_may_issue_an_asynchronous_event_notification_instead_of_a_deferred_error); + } + + if(page.GLTSD) + sb.AppendLine("\t" + Localization.Global_logging_target_save_disabled); + + if(page.RAC) + sb.AppendLine("\t" + Localization.CHECK_CONDITION_should_be_reported_rather_than_a_long_busy_condition); + + if(page.SWP) + sb.AppendLine("\t" + Localization.Software_write_protect_is_enabled); + + if(page.TAS) + { + sb.AppendLine("\t" + + Localization. + Tasks_aborted_by_other_initiator_s_actions_should_be_terminated_with_TASK_ABORTED); + } + + if(page.TMF_ONLY) + { + sb.AppendLine("\t" + + Localization. + All_tasks_received_in_nexus_with_ACA_ACTIVE_is_set_and_an_ACA_condition_is_established_shall_terminate); + } + + if(page.D_SENSE) + { + sb.AppendLine("\t" + + Localization. + Device_shall_return_descriptor_format_sense_data_when_returning_sense_data_in_the_same_transactions_as_a_CHECK_CONDITION); + } + + if(page.ATO) + sb.AppendLine("\t" + Localization.LOGICAL_BLOCK_APPLICATION_TAG_should_not_be_modified); + + if(page.DPICZ) + sb.AppendLine("\t" + Localization.Protector_information_checking_is_disabled); + + if(page.NUAR) + sb.AppendLine("\t" + Localization.No_unit_attention_on_release); + + if(page.ATMPE) + sb.AppendLine("\t" + Localization.Application_Tag_mode_page_is_enabled); + + if(page.RWWP) + sb.AppendLine("\t" + Localization.Abort_any_write_command_without_protection_information); + + if(page.SBLP) + sb.AppendLine("\t" + Localization.Supports_block_lengths_and_protection_information); + + switch(page.TST) + { + case 0: + sb.AppendLine("\t" + Localization.The_logical_unit_maintains_one_task_set_for_all_nexuses); + + break; + case 1: + sb.AppendLine("\t" + Localization.The_logical_unit_maintains_separate_task_sets_for_each_nexus); + + break; + default: + sb.AppendFormat("\t" + Localization.Unknown_Task_set_type_0, page.TST).AppendLine(); + + break; + } + + switch(page.QueueAlgorithm) + { + case 0: + sb.AppendLine("\t" + Localization.Commands_should_be_sent_strictly_ordered); + + break; + case 1: + sb.AppendLine("\t" + Localization.Commands_can_be_reordered_in_any_manner); + + break; + default: + sb.AppendFormat("\t" + Localization.Unknown_Queue_Algorithm_Modifier_0, page.QueueAlgorithm). + AppendLine(); + + break; + } + + switch(page.QErr) + { + case 0: + sb.AppendLine("\t" + + Localization. + If_ACA_is_established_the_task_set_commands_shall_resume_after_it_is_cleared_otherwise_they_shall_terminate_with_CHECK_CONDITION); + + break; + case 1: + sb.AppendLine("\t" + + Localization. + All_the_affected_commands_in_the_task_set_shall_be_aborted_when_CHECK_CONDITION_is_returned); + + break; + case 3: + sb.AppendLine("\t" + + Localization. + Affected_commands_in_the_task_set_belonging_with_the_CHECK_CONDITION_nexus_shall_be_aborted); + + break; + default: + sb.AppendLine("\t" + Localization.Reserved_QErr_value_2_is_set); + + break; + } + + switch(page.UA_INTLCK_CTRL) + { + case 0: + sb.AppendLine("\t" + Localization.LUN_shall_clear_unit_attention_condition_reported_in_the_same_nexus); + + break; + case 2: + sb.AppendLine("\t" + + Localization.LUN_shall_not_clear_unit_attention_condition_reported_in_the_same_nexus); + + break; + case 3: + sb.AppendLine("\t" + + Localization. + LUN_shall_not_clear_unit_attention_condition_reported_in_the_same_nexus_and_shall_establish_a_unit_attention_condition_for_the_initiator); + + break; + default: + sb.AppendLine("\t" + Localization.Reserved_UA_INTLCK_CTRL_value_1_is_set); + + break; + } + + switch(page.AutoloadMode) + { + case 0: + sb.AppendLine("\t" + Localization.On_medium_insertion_it_shall_be_loaded_for_full_access); + + break; + case 1: + sb.AppendLine("\t" + + Localization.On_medium_insertion_it_shall_be_loaded_for_auxiliary_memory_access_only); + + break; + case 2: + sb.AppendLine("\t" + Localization.On_medium_insertion_it_shall_not_be_loaded); + + break; + default: + sb.AppendFormat("\t" + Localization.Reserved_autoload_mode_0_set, page.AutoloadMode).AppendLine(); + + break; + } + + if(page.ReadyAENHoldOffPeriod > 0) + { + sb. + AppendFormat("\t" + Localization._0_ms_before_attempting_asynchronous_event_notifications_after_initialization, + page.ReadyAENHoldOffPeriod). + AppendLine(); + } + + if(page.BusyTimeoutPeriod > 0) + { + if(page.BusyTimeoutPeriod == 0xFFFF) + sb.AppendLine("\t" + Localization.There_is_no_limit_on_the_maximum_time_that_is_allowed_to_remain_busy); + else + { + sb.AppendFormat("\t" + Localization.A_maximum_of_0_ms_are_allowed_to_remain_busy, + page.BusyTimeoutPeriod * 100). + AppendLine(); + } + } + + if(page.ExtendedSelfTestCompletionTime > 0) + { + sb.AppendFormat("\t" + Localization._0_seconds_to_complete_extended_self_test, + page.ExtendedSelfTestCompletionTime); + } + + return sb.ToString(); + } + +#endregion Mode Page 0x0A: Control mode page + +#region Mode Page 0x0A subpage 0x01: Control Extension mode page + + /// Control Extension mode page Page code 0x0A Subpage code 0x01 32 bytes in SPC-3, SPC-4, SPC-5 + public struct ModePage_0A_S01 + { + /// Parameters can be saved + public bool PS; + /// Timestamp outside this standard + public bool TCMOS; + /// SCSI precedence + public bool SCSIP; + /// Implicit Asymmetric Logical Unit Access Enabled + public bool IALUAE; + /// Initial task priority + public byte InitialPriority; + + /// Device life control disabled + public bool DLC; + /// Maximum size of SENSE data in bytes + public byte MaximumSenseLength; + } + + public static ModePage_0A_S01? DecodeModePage_0A_S01(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) != 0x40) + return null; + + if((pageResponse[0] & 0x3F) != 0x0A) + return null; + + if(pageResponse[1] != 0x01) + return null; + + if((pageResponse[2] << 8) + pageResponse[3] + 4 != pageResponse.Length) + return null; + + if(pageResponse.Length < 32) + return null; + + var decoded = new ModePage_0A_S01(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + + decoded.IALUAE |= (pageResponse[4] & 0x01) == 0x01; + decoded.SCSIP |= (pageResponse[4] & 0x02) == 0x02; + decoded.TCMOS |= (pageResponse[4] & 0x04) == 0x04; + + decoded.InitialPriority = (byte)(pageResponse[5] & 0x0F); + + return decoded; + } + + public static string PrettifyModePage_0A_S01(byte[] pageResponse) => + PrettifyModePage_0A_S01(DecodeModePage_0A_S01(pageResponse)); + + public static string PrettifyModePage_0A_S01(ModePage_0A_S01? modePage) + { + if(!modePage.HasValue) + return null; + + ModePage_0A_S01 page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_Control_extension_page); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + if(page.TCMOS) + { + if(page.SCSIP) + { + sb.AppendLine("\t" + + Localization. + S01_Timestamp_can_be_initialized_by_methods_outside_of_the_SCSI_standards_but_SCSI_SET_TIMESTAMP_shall_take_precedence_over_them); + } + else + { + sb.AppendLine("\t" + + Localization.Timestamp_can_be_initialized_by_methods_outside_of_the_SCSI_standards); + } + } + + if(page.IALUAE) + sb.AppendLine("\t" + Localization.Implicit_Asymmetric_Logical_Unit_Access_is_enabled); + + sb.AppendFormat("\t" + Localization.Initial_priority_is_0, page.InitialPriority).AppendLine(); + + if(page.DLC) + sb.AppendLine("\t" + Localization.Device_will_not_degrade_performance_to_extend_its_life); + + if(page.MaximumSenseLength > 0) + { + sb.AppendFormat("\t" + Localization.Maximum_sense_data_would_be_0_bytes, page.MaximumSenseLength). + AppendLine(); + } + + return sb.ToString(); + } + +#endregion Mode Page 0x0A subpage 0x01: Control Extension mode page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/0B.cs b/Aaru.Decoders/SCSI/Modes/0B.cs new file mode 100644 index 000000000..7ede70217 --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/0B.cs @@ -0,0 +1,125 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 0B.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MODE PAGE 0Bh: Medium types supported page. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ +#region Mode Page 0x0B: Medium types supported page + + /// Disconnect-reconnect page Page code 0x0B 8 bytes in SCSI-2 + public struct ModePage_0B + { + /// Parameters can be saved + public bool PS; + public MediumTypes MediumType1; + public MediumTypes MediumType2; + public MediumTypes MediumType3; + public MediumTypes MediumType4; + } + + public static ModePage_0B? DecodeModePage_0B(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x0B) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length < 8) + return null; + + var decoded = new ModePage_0B(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.MediumType1 = (MediumTypes)pageResponse[4]; + decoded.MediumType2 = (MediumTypes)pageResponse[5]; + decoded.MediumType3 = (MediumTypes)pageResponse[6]; + decoded.MediumType4 = (MediumTypes)pageResponse[7]; + + return decoded; + } + + public static string PrettifyModePage_0B(byte[] pageResponse) => + PrettifyModePage_0B(DecodeModePage_0B(pageResponse)); + + public static string PrettifyModePage_0B(ModePage_0B? modePage) + { + if(!modePage.HasValue) + return null; + + ModePage_0B page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_Medium_types_supported_page); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + if(page.MediumType1 != MediumTypes.Default) + { + sb.AppendFormat(Localization.Supported_medium_type_one_0, GetMediumTypeDescription(page.MediumType1)). + AppendLine(); + } + + if(page.MediumType2 != MediumTypes.Default) + { + sb.AppendFormat(Localization.Supported_medium_type_two_0, GetMediumTypeDescription(page.MediumType2)). + AppendLine(); + } + + if(page.MediumType3 != MediumTypes.Default) + { + sb.AppendFormat(Localization.Supported_medium_type_three_0, GetMediumTypeDescription(page.MediumType3)). + AppendLine(); + } + + if(page.MediumType4 != MediumTypes.Default) + { + sb.AppendFormat(Localization.Supported_medium_type_four_0, GetMediumTypeDescription(page.MediumType4)). + AppendLine(); + } + + return sb.ToString(); + } + +#endregion Mode Page 0x0B: Medium types supported page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/0C.cs b/Aaru.Decoders/SCSI/Modes/0C.cs new file mode 100644 index 000000000..2c02a882e --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/0C.cs @@ -0,0 +1,42 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 0C.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MODE PAGE 0Ch: Notch page. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +namespace Aaru.Decoders.SCSI; + +public static partial class Modes +{ +#region Mode Page 0x0C: Notch page + + // TODO: Implement this page + +#endregion Mode Page 0x0C: Notch page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/0D.cs b/Aaru.Decoders/SCSI/Modes/0D.cs new file mode 100644 index 000000000..e1dd5b0bf --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/0D.cs @@ -0,0 +1,182 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 0D.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MODE PAGE 0Dh: CD-ROM parameteres page. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ +#region Mode Page 0x0D: CD-ROM parameteres page + + /// CD-ROM parameteres page Page code 0x0D 8 bytes in SCSI-2, MMC-1, MMC-2, MMC-3 + public struct ModePage_0D + { + /// Parameters can be saved + public bool PS; + /// Time the drive shall remain in hold track state after seek or read + public byte InactivityTimerMultiplier; + /// Seconds per Minute + public ushort SecondsPerMinute; + /// Frames per Second + public ushort FramesPerSecond; + } + + public static ModePage_0D? DecodeModePage_0D(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x0D) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length < 8) + return null; + + var decoded = new ModePage_0D(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.InactivityTimerMultiplier = (byte)(pageResponse[3] & 0xF); + decoded.SecondsPerMinute = (ushort)((pageResponse[4] << 8) + pageResponse[5]); + decoded.FramesPerSecond = (ushort)((pageResponse[6] << 8) + pageResponse[7]); + + return decoded; + } + + public static string PrettifyModePage_0D(byte[] pageResponse) => + PrettifyModePage_0D(DecodeModePage_0D(pageResponse)); + + public static string PrettifyModePage_0D(ModePage_0D? modePage) + { + if(!modePage.HasValue) + return null; + + ModePage_0D page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_CD_ROM_parameters_page); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + switch(page.InactivityTimerMultiplier) + { + case 0: + sb.AppendLine("\t" + + Localization. + Drive_will_remain_in_track_hold_state_a_vendor_specified_time_after_a_seek_or_read); + + break; + case 1: + sb.AppendLine("\t" + Localization.Drive_will_remain_in_track_hold_state_125_ms_after_a_seek_or_read); + + break; + case 2: + sb.AppendLine("\t" + Localization.Drive_will_remain_in_track_hold_state_250_ms_after_a_seek_or_read); + + break; + case 3: + sb.AppendLine("\t" + Localization.Drive_will_remain_in_track_hold_state_500_ms_after_a_seek_or_read); + + break; + case 4: + sb.AppendLine("\t" + Localization.Drive_will_remain_in_track_hold_state_1_second_after_a_seek_or_read); + + break; + case 5: + sb.AppendLine("\t" + Localization.Drive_will_remain_in_track_hold_state_2_seconds_after_a_seek_or_read); + + break; + case 6: + sb.AppendLine("\t" + Localization.Drive_will_remain_in_track_hold_state_4_seconds_after_a_seek_or_read); + + break; + case 7: + sb.AppendLine("\t" + Localization.Drive_will_remain_in_track_hold_state_8_seconds_after_a_seek_or_read); + + break; + case 8: + sb.AppendLine("\t" + + Localization.Drive_will_remain_in_track_hold_state_16_seconds_after_a_seek_or_read); + + break; + case 9: + sb.AppendLine("\t" + + Localization.Drive_will_remain_in_track_hold_state_32_seconds_after_a_seek_or_read); + + break; + case 10: + sb.AppendLine("\t" + Localization.Drive_will_remain_in_track_hold_state_1_minute_after_a_seek_or_read); + + break; + case 11: + sb.AppendLine("\t" + Localization.Drive_will_remain_in_track_hold_state_2_minutes_after_a_seek_or_read); + + break; + case 12: + sb.AppendLine("\t" + Localization.Drive_will_remain_in_track_hold_state_4_minutes_after_a_seek_or_read); + + break; + case 13: + sb.AppendLine("\t" + Localization.Drive_will_remain_in_track_hold_state_8_minutes_after_a_seek_or_read); + + break; + case 14: + sb.AppendLine("\t" + + Localization.Drive_will_remain_in_track_hold_state_16_minutes_after_a_seek_or_read); + + break; + case 15: + sb.AppendLine("\t" + + Localization.Drive_will_remain_in_track_hold_state_32_minutes_after_a_seek_or_read); + + break; + } + + if(page.SecondsPerMinute > 0) + sb.AppendFormat("\t" + Localization.Each_minute_has_0_seconds, page.SecondsPerMinute).AppendLine(); + + if(page.FramesPerSecond > 0) + sb.AppendFormat("\t" + Localization.Each_second_has_0_frames, page.FramesPerSecond).AppendLine(); + + return sb.ToString(); + } + +#endregion Mode Page 0x0D: CD-ROM parameteres page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/0E.cs b/Aaru.Decoders/SCSI/Modes/0E.cs new file mode 100644 index 000000000..4fcd0835e --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/0E.cs @@ -0,0 +1,283 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 0E.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MODE PAGE 0Eh: CD-ROM audio control parameters page. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ +#region Mode Page 0x0E: CD-ROM audio control parameters page + + /// CD-ROM audio control parameters Page code 0x0E 16 bytes in SCSI-2, MMC-1, MMC-2, MMC-3 + public struct ModePage_0E + { + /// Parameters can be saved + public bool PS; + /// Return status as soon as playback operation starts + public bool Immed; + /// Stop on track crossing + public bool SOTC; + /// Indicates is valid + public bool APRVal; + /// Multiplier for + public byte LBAFormat; + /// LBAs per second of audio + public ushort BlocksPerSecondOfAudio; + /// Channels output on this port + public byte OutputPort0ChannelSelection; + /// Volume level for this port + public byte OutputPort0Volume; + /// Channels output on this port + public byte OutputPort1ChannelSelection; + /// Volume level for this port + public byte OutputPort1Volume; + /// Channels output on this port + public byte OutputPort2ChannelSelection; + /// Volume level for this port + public byte OutputPort2Volume; + /// Channels output on this port + public byte OutputPort3ChannelSelection; + /// Volume level for this port + public byte OutputPort3Volume; + } + + public static ModePage_0E? DecodeModePage_0E(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x0E) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length < 16) + return null; + + var decoded = new ModePage_0E(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.Immed |= (pageResponse[2] & 0x04) == 0x04; + decoded.SOTC |= (pageResponse[2] & 0x02) == 0x02; + decoded.APRVal |= (pageResponse[5] & 0x80) == 0x80; + decoded.LBAFormat = (byte)(pageResponse[5] & 0x0F); + decoded.BlocksPerSecondOfAudio = (ushort)((pageResponse[6] << 8) + pageResponse[7]); + decoded.OutputPort0ChannelSelection = (byte)(pageResponse[8] & 0x0F); + decoded.OutputPort0Volume = pageResponse[9]; + decoded.OutputPort1ChannelSelection = (byte)(pageResponse[10] & 0x0F); + decoded.OutputPort1Volume = pageResponse[11]; + decoded.OutputPort2ChannelSelection = (byte)(pageResponse[12] & 0x0F); + decoded.OutputPort2Volume = pageResponse[13]; + decoded.OutputPort3ChannelSelection = (byte)(pageResponse[14] & 0x0F); + decoded.OutputPort3Volume = pageResponse[15]; + + return decoded; + } + + public static string PrettifyModePage_0E(byte[] pageResponse) => + PrettifyModePage_0E(DecodeModePage_0E(pageResponse)); + + public static string PrettifyModePage_0E(ModePage_0E? modePage) + { + if(!modePage.HasValue) + return null; + + ModePage_0E page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_CD_ROM_audio_control_parameters_page); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + sb.AppendLine(page.Immed + ? "\t" + Localization.Drive_will_return_from_playback_command_immediately + : "\t" + Localization.Drive_will_return_from_playback_command_when_playback_ends); + + if(page.SOTC) + sb.AppendLine("\t" + Localization.Drive_will_stop_playback_on_track_end); + + if(page.APRVal) + { + double blocks; + + if(page.LBAFormat == 8) + blocks = page.BlocksPerSecondOfAudio * (1 / 256); + else + blocks = page.BlocksPerSecondOfAudio; + + sb.AppendFormat("\t" + Localization.There_are_0_blocks_per_each_second_of_audio, blocks).AppendLine(); + } + + if(page.OutputPort0ChannelSelection > 0) + { + sb.Append("\t" + Localization.Output_port_0_has_channels); + + if((page.OutputPort0ChannelSelection & 0x01) == 0x01) + sb.Append("0 "); + + if((page.OutputPort0ChannelSelection & 0x02) == 0x02) + sb.Append("1 "); + + if((page.OutputPort0ChannelSelection & 0x04) == 0x04) + sb.Append("2 "); + + if((page.OutputPort0ChannelSelection & 0x08) == 0x08) + sb.Append("3 "); + + switch(page.OutputPort0Volume) + { + case 0: + sb.AppendLine(Localization.muted); + + break; + case 0xFF: + sb.AppendLine(Localization.at_maximum_volume); + + break; + default: + sb.AppendFormat(Localization.at_volume_0, page.OutputPort0Volume).AppendLine(); + + break; + } + } + + if(page.OutputPort1ChannelSelection > 0) + { + sb.Append("\t" + Localization.Output_port_1_has_channels); + + if((page.OutputPort1ChannelSelection & 0x01) == 0x01) + sb.Append("0 "); + + if((page.OutputPort1ChannelSelection & 0x02) == 0x02) + sb.Append("1 "); + + if((page.OutputPort1ChannelSelection & 0x04) == 0x04) + sb.Append("2 "); + + if((page.OutputPort1ChannelSelection & 0x08) == 0x08) + sb.Append("3 "); + + switch(page.OutputPort1Volume) + { + case 0: + sb.AppendLine(Localization.muted); + + break; + case 0xFF: + sb.AppendLine(Localization.at_maximum_volume); + + break; + default: + sb.AppendFormat(Localization.at_volume_0, page.OutputPort1Volume).AppendLine(); + + break; + } + } + + if(page.OutputPort2ChannelSelection > 0) + { + sb.Append("\t" + Localization.Output_port_2_has_channels); + + if((page.OutputPort2ChannelSelection & 0x01) == 0x01) + sb.Append("0 "); + + if((page.OutputPort2ChannelSelection & 0x02) == 0x02) + sb.Append("1 "); + + if((page.OutputPort2ChannelSelection & 0x04) == 0x04) + sb.Append("2 "); + + if((page.OutputPort2ChannelSelection & 0x08) == 0x08) + sb.Append("3 "); + + switch(page.OutputPort2Volume) + { + case 0: + sb.AppendLine(Localization.muted); + + break; + case 0xFF: + sb.AppendLine(Localization.at_maximum_volume); + + break; + default: + sb.AppendFormat(Localization.at_volume_0, page.OutputPort2Volume).AppendLine(); + + break; + } + } + + if(page.OutputPort3ChannelSelection <= 0) + return sb.ToString(); + + sb.Append("\t" + Localization.Output_port_3_has_channels); + + if((page.OutputPort3ChannelSelection & 0x01) == 0x01) + sb.Append("0 "); + + if((page.OutputPort3ChannelSelection & 0x02) == 0x02) + sb.Append("1 "); + + if((page.OutputPort3ChannelSelection & 0x04) == 0x04) + sb.Append("2 "); + + if((page.OutputPort3ChannelSelection & 0x08) == 0x08) + sb.Append("3 "); + + switch(page.OutputPort3Volume) + { + case 0: + sb.AppendLine(Localization.muted); + + break; + case 0xFF: + sb.AppendLine(Localization.at_maximum_volume); + + break; + default: + sb.AppendFormat(Localization.at_volume_0, page.OutputPort3Volume).AppendLine(); + + break; + } + + return sb.ToString(); + } + +#endregion Mode Page 0x0E: CD-ROM audio control parameters page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/0F.cs b/Aaru.Decoders/SCSI/Modes/0F.cs new file mode 100644 index 000000000..20d8cabe9 --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/0F.cs @@ -0,0 +1,209 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 0F.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MODE PAGE 0Fh: Data compression page. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ +#region Mode Page 0x0F: Data compression page + + /// Data compression page Page code 0x0F 16 bytes in SSC-1, SSC-2, SSC-3 + public struct ModePage_0F + { + /// Parameters can be saved + public bool PS; + /// Data compression enabled + public bool DCE; + /// Data compression capable + public bool DCC; + /// Data decompression enabled + public bool DDE; + /// Report exception on decompression + public byte RED; + /// Compression algorithm + public uint CompressionAlgo; + /// Decompression algorithm + public uint DecompressionAlgo; + } + + public static ModePage_0F? DecodeModePage_0F(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x0F) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length < 16) + return null; + + var decoded = new ModePage_0F(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + + decoded.DCE |= (pageResponse[2] & 0x80) == 0x80; + decoded.DCC |= (pageResponse[2] & 0x40) == 0x40; + decoded.DDE |= (pageResponse[3] & 0x80) == 0x80; + decoded.RED = (byte)((pageResponse[3] & 0x60) >> 5); + + decoded.CompressionAlgo = + (uint)((pageResponse[4] << 24) + (pageResponse[5] << 16) + (pageResponse[6] << 8) + pageResponse[7]); + + decoded.DecompressionAlgo = (uint)((pageResponse[8] << 24) + + (pageResponse[9] << 16) + + (pageResponse[10] << 8) + + pageResponse[11]); + + return decoded; + } + + public static string PrettifyModePage_0F(byte[] pageResponse) => + PrettifyModePage_0F(DecodeModePage_0F(pageResponse)); + + public static string PrettifyModePage_0F(ModePage_0F? modePage) + { + if(!modePage.HasValue) + return null; + + ModePage_0F page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_Data_compression_page); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + if(page.DCC) + { + sb.AppendLine("\t" + Localization.Drive_supports_data_compression); + + if(page.DCE) + { + sb.Append("\t" + Localization.Data_compression_is_enabled_with); + + switch(page.CompressionAlgo) + { + case 3: + sb.AppendLine(Localization.IBM_ALDC_with_512_byte_buffer); + + break; + case 4: + sb.AppendLine(Localization.IBM_ALDC_with_1024_byte_buffer); + + break; + case 5: + sb.AppendLine(Localization.IBM_ALDC_with_2048_byte_buffer); + + break; + case 0x10: + sb.AppendLine(Localization.IBM_IDRC); + + break; + case 0x20: + sb.AppendLine(Localization.DCLZ); + + break; + case 0xFF: + sb.AppendLine(Localization.an_unregistered_compression_algorithm); + + break; + default: + sb.AppendFormat(Localization.an_unknown_algorithm_coded_0, page.CompressionAlgo).AppendLine(); + + break; + } + } + + if(page.DDE) + { + sb.AppendLine("\t" + Localization.Data_decompression_is_enabled); + + if(page.DecompressionAlgo == 0) + sb.AppendLine("\t" + Localization.Last_data_read_was_uncompressed); + else + { + sb.Append("\t" + Localization.Last_data_read_was_compressed_with_); + + switch(page.CompressionAlgo) + { + case 3: + sb.AppendLine(Localization.IBM_ALDC_with_512_byte_buffer); + + break; + case 4: + sb.AppendLine(Localization.IBM_ALDC_with_1024_byte_buffer); + + break; + case 5: + sb.AppendLine(Localization.IBM_ALDC_with_2048_byte_buffer); + + break; + case 0x10: + sb.AppendLine(Localization.IBM_IDRC); + + break; + case 0x20: + sb.AppendLine(Localization.DCLZ); + + break; + case 0xFF: + sb.AppendLine(Localization.an_unregistered_compression_algorithm); + + break; + default: + sb.AppendFormat(Localization.an_unknown_algorithm_coded_0, page.CompressionAlgo). + AppendLine(); + + break; + } + } + } + + sb.AppendFormat("\t" + Localization.Report_exception_on_compression_is_set_to_0, page.RED).AppendLine(); + } + else + sb.AppendLine("\t" + Localization.Drive_does_not_support_data_compression); + + return sb.ToString(); + } + +#endregion Mode Page 0x0F: Data compression page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/10.cs b/Aaru.Decoders/SCSI/Modes/10.cs new file mode 100644 index 000000000..64f1a1268 --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/10.cs @@ -0,0 +1,154 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 10.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MODE PAGE 10h: XOR control mode page. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ +#region Mode Page 0x10: XOR control mode page + + /// XOR control mode page Page code 0x10 24 bytes in SBC-1, SBC-2 + public struct ModePage_10 + { + /// Parameters can be saved + public bool PS; + /// Disables XOR operations + public bool XORDIS; + /// Maximum transfer length in blocks for a XOR command + public uint MaxXorWrite; + /// Maximum regenerate length in blocks + public uint MaxRegenSize; + /// Maximum transfer length in blocks for READ during a rebuild + public uint MaxRebuildRead; + /// Minimum time in ms between READs during a rebuild + public ushort RebuildDelay; + } + + public static ModePage_10? DecodeModePage_10(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x10) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length < 24) + return null; + + var decoded = new ModePage_10(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + + decoded.XORDIS |= (pageResponse[2] & 0x02) == 0x02; + + decoded.MaxXorWrite = + (uint)((pageResponse[4] << 24) + (pageResponse[5] << 16) + (pageResponse[6] << 8) + pageResponse[7]); + + decoded.MaxRegenSize = (uint)((pageResponse[12] << 24) + + (pageResponse[13] << 16) + + (pageResponse[14] << 8) + + pageResponse[15]); + + decoded.MaxRebuildRead = (uint)((pageResponse[16] << 24) + + (pageResponse[17] << 16) + + (pageResponse[18] << 8) + + pageResponse[19]); + + decoded.RebuildDelay = (ushort)((pageResponse[22] << 8) + pageResponse[23]); + + return decoded; + } + + public static string PrettifyModePage_10(byte[] pageResponse) => + PrettifyModePage_10(DecodeModePage_10(pageResponse)); + + public static string PrettifyModePage_10(ModePage_10? modePage) + { + if(!modePage.HasValue) + return null; + + ModePage_10 page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_XOR_control_mode_page); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + if(page.XORDIS) + sb.AppendLine("\t" + Localization.XOR_operations_are_disabled); + else + { + if(page.MaxXorWrite > 0) + { + sb.AppendFormat("\t" + Localization.Drive_accepts_a_maximum_of_0_blocks_in_a_single_XOR_WRITE_command, + page.MaxXorWrite). + AppendLine(); + } + + if(page.MaxRegenSize > 0) + { + sb.AppendFormat("\t" + Localization.Drive_accepts_a_maximum_of_0_blocks_in_a_REGENERATE_command, + page.MaxRegenSize). + AppendLine(); + } + + if(page.MaxRebuildRead > 0) + { + sb. + AppendFormat("\t" + Localization.Drive_accepts_a_maximum_of_0_blocks_in_a_READ_command_during_rebuild, + page.MaxRebuildRead). + AppendLine(); + } + + if(page.RebuildDelay > 0) + { + sb.AppendFormat("\t" + Localization.Drive_needs_a_minimum_of_0_ms_between_READ_commands_during_rebuild, + page.RebuildDelay). + AppendLine(); + } + } + + return sb.ToString(); + } + +#endregion Mode Page 0x10: XOR control mode page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/10_SSC.cs b/Aaru.Decoders/SCSI/Modes/10_SSC.cs new file mode 100644 index 000000000..8e6c60877 --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/10_SSC.cs @@ -0,0 +1,344 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 10_SSC.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MODE PAGE 10h: Device configuration page. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ +#region Mode Page 0x10: Device configuration page + + /// Device configuration page Page code 0x10 16 bytes in SCSI-2, SSC-1, SSC-2, SSC-3 + [SuppressMessage("ReSharper", "UnusedMember.Global")] + public struct ModePage_10_SSC + { + /// Parameters can be saved + public bool PS; + /// Used in mode select to change partition to one specified in + public bool CAP; + /// Used in mode select to change format to one specified in + public bool CAF; + /// Active format, vendor-specific + public byte ActiveFormat; + /// Current logical partition + public byte ActivePartition; + /// How full the buffer shall be before writing to medium + public byte WriteBufferFullRatio; + /// How empty the buffer shall be before reading more data from the medium + public byte ReadBufferEmptyRatio; + /// Delay in 100 ms before buffered data is forcefully written to the medium even before buffer is full + public ushort WriteDelayTime; + /// Drive supports recovering data from buffer + public bool DBR; + /// Medium has block IDs + public bool BIS; + /// Drive recognizes and reports setmarks + public bool RSmk; + /// Drive selects best speed + public bool AVC; + /// If drive should stop pre-reading on filemarks + public byte SOCF; + /// If set, recovered buffer data is LIFO, otherwise, FIFO + public bool RBO; + /// Report early warnings + public bool REW; + /// Inter-block gap + public byte GapSize; + /// End-of-Data format + public byte EODDefined; + /// EOD generation enabled + public bool EEG; + /// Synchronize data to medium on early warning + public bool SEW; + /// Bytes to reduce buffer size on early warning + public uint BufferSizeEarlyWarning; + /// Selected data compression algorithm + public byte SelectedCompression; + + /// Soft write protect + public bool SWP; + /// Associated write protect + public bool ASOCWP; + /// Persistent write protect + public bool PERSWP; + /// Permanent write protect + public bool PRMWP; + + public bool BAML; + public bool BAM; + public byte RewindOnReset; + + /// How drive shall respond to detection of compromised WORM medium integrity + public byte WTRE; + /// Respond to commands only if a reservation exists + public bool OIR; + } + + public static ModePage_10_SSC? DecodeModePage_10_SSC(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x10) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length < 16) + return null; + + var decoded = new ModePage_10_SSC(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.CAP |= (pageResponse[2] & 0x40) == 0x40; + decoded.CAF |= (pageResponse[2] & 0x20) == 0x20; + decoded.ActiveFormat = (byte)(pageResponse[2] & 0x1F); + decoded.ActivePartition = pageResponse[3]; + decoded.WriteBufferFullRatio = pageResponse[4]; + decoded.ReadBufferEmptyRatio = pageResponse[5]; + decoded.WriteDelayTime = (ushort)((pageResponse[6] << 8) + pageResponse[7]); + decoded.DBR |= (pageResponse[8] & 0x80) == 0x80; + decoded.BIS |= (pageResponse[8] & 0x40) == 0x40; + decoded.RSmk |= (pageResponse[8] & 0x20) == 0x20; + decoded.AVC |= (pageResponse[8] & 0x10) == 0x10; + decoded.RBO |= (pageResponse[8] & 0x02) == 0x02; + decoded.REW |= (pageResponse[8] & 0x01) == 0x01; + decoded.EEG |= (pageResponse[10] & 0x10) == 0x10; + decoded.SEW |= (pageResponse[10] & 0x08) == 0x08; + decoded.SOCF = (byte)((pageResponse[8] & 0x0C) >> 2); + + decoded.BufferSizeEarlyWarning = (uint)((pageResponse[11] << 16) + (pageResponse[12] << 8) + pageResponse[13]); + + decoded.SelectedCompression = pageResponse[14]; + + decoded.SWP |= (pageResponse[10] & 0x04) == 0x04; + decoded.ASOCWP |= (pageResponse[15] & 0x04) == 0x04; + decoded.PERSWP |= (pageResponse[15] & 0x02) == 0x02; + decoded.PRMWP |= (pageResponse[15] & 0x01) == 0x01; + + decoded.BAML |= (pageResponse[10] & 0x02) == 0x02; + decoded.BAM |= (pageResponse[10] & 0x01) == 0x01; + + decoded.RewindOnReset = (byte)((pageResponse[15] & 0x18) >> 3); + + decoded.OIR |= (pageResponse[15] & 0x20) == 0x20; + decoded.WTRE = (byte)((pageResponse[15] & 0xC0) >> 6); + + return decoded; + } + + public static string PrettifyModePage_10_SSC(byte[] pageResponse) => + PrettifyModePage_10_SSC(DecodeModePage_10_SSC(pageResponse)); + + public static string PrettifyModePage_10_SSC(ModePage_10_SSC? modePage) + { + if(!modePage.HasValue) + return null; + + ModePage_10_SSC page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_Device_configuration_page); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + sb.AppendFormat("\t" + Localization.Active_format_0, page.ActiveFormat).AppendLine(); + sb.AppendFormat("\t" + Localization.Active_partition_0, page.ActivePartition).AppendLine(); + + sb.AppendFormat("\t" + Localization.Write_buffer_shall_have_a_full_ratio_of_0_before_being_flushed_to_medium, + page.WriteBufferFullRatio). + AppendLine(); + + sb. + AppendFormat("\t" + Localization.Read_buffer_shall_have_an_empty_ratio_of_0_before_more_data_is_read_from_medium, + page.ReadBufferEmptyRatio). + AppendLine(); + + sb. + AppendFormat("\t" + Localization.Drive_will_delay_0_ms_before_buffered_data_is_forcefully_written_to_the_medium_even_before_buffer_is_full, + page.WriteDelayTime * 100). + AppendLine(); + + if(page.DBR) + { + sb.AppendLine("\t" + Localization.Drive_supports_recovering_data_from_buffer); + + sb.AppendLine(page.RBO + ? "\t" + Localization.Recovered_buffer_data_comes_in_LIFO_order + : "\t" + Localization.Recovered_buffer_data_comes_in_FIFO_order); + } + + if(page.BIS) + sb.AppendLine("\t" + Localization.Medium_supports_block_IDs); + + if(page.RSmk) + sb.AppendLine("\t" + Localization.Drive_reports_setmarks); + + switch(page.SOCF) + { + case 0: + sb.AppendLine("\t" + Localization.Drive_will_pre_read_until_buffer_is_full); + + break; + case 1: + sb.AppendLine("\t" + Localization.Drive_will_pre_read_until_one_filemark_is_detected); + + break; + case 2: + sb.AppendLine("\t" + Localization.Drive_will_pre_read_until_two_filemark_is_detected); + + break; + case 3: + sb.AppendLine("\t" + Localization.Drive_will_pre_read_until_three_filemark_is_detected); + + break; + } + + if(page.REW) + { + sb.AppendLine("\t" + Localization.Drive_reports_early_warnings); + + if(page.SEW) + sb.AppendLine("\t" + Localization.Drive_will_synchronize_buffer_to_medium_on_early_warnings); + } + + switch(page.GapSize) + { + case 0: + break; + case 1: + sb.AppendLine("\t" + Localization.Inter_block_gap_is_long_enough_to_support_update_in_place); + + break; + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + sb.AppendFormat("\t" + Localization.Inter_block_gap_is_0_times_the_device_defined_gap_size, + page.GapSize). + AppendLine(); + + break; + default: + sb.AppendFormat("\t" + Localization.Inter_block_gap_is_unknown_value_0, page.GapSize).AppendLine(); + + break; + } + + if(page.EEG) + sb.AppendLine("\t" + Localization.Drive_generates_end_of_data); + + switch(page.SelectedCompression) + { + case 0: + sb.AppendLine("\t" + Localization.Drive_does_not_use_compression); + + break; + case 1: + sb.AppendLine("\t" + Localization.Drive_uses_default_compression); + + break; + default: + sb.AppendFormat("\t" + Localization.Drive_uses_unknown_compression_0, page.SelectedCompression). + AppendLine(); + + break; + } + + if(page.SWP) + sb.AppendLine("\t" + Localization.Software_write_protect_is_enabled); + + if(page.ASOCWP) + sb.AppendLine("\t" + Localization.Associated_write_protect_is_enabled); + + if(page.PERSWP) + sb.AppendLine("\t" + Localization.Persistent_write_protect_is_enabled); + + if(page.PRMWP) + sb.AppendLine("\t" + Localization.Permanent_write_protect_is_enabled); + + if(page.BAML) + { + sb.AppendLine(page.BAM + ? "\t" + Localization.Drive_operates_using_explicit_address_mode + : "\t" + Localization.Drive_operates_using_implicit_address_mode); + } + + switch(page.RewindOnReset) + { + case 1: + sb.AppendLine("\t" + Localization.Drive_shall_position_to_beginning_of_default_data_partition_on_reset); + + break; + case 2: + sb.AppendLine("\t" + Localization.Drive_shall_maintain_its_position_on_reset); + + break; + } + + switch(page.WTRE) + { + case 1: + sb.AppendLine("\t" + Localization.Drive_will_do_nothing_on_WORM_tampered_medium); + + break; + case 2: + sb.AppendLine("\t" + Localization.Drive_will_return_CHECK_CONDITION_on_WORM_tampered_medium); + + break; + } + + if(page.OIR) + sb.AppendLine("\t" + Localization.Drive_will_only_respond_to_commands_if_it_has_received_a_reservation); + + return sb.ToString(); + } + +#endregion Mode Page 0x10: Device configuration page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/11.cs b/Aaru.Decoders/SCSI/Modes/11.cs new file mode 100644 index 000000000..7d1e73a2c --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/11.cs @@ -0,0 +1,284 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 11.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MODE PAGE 11h: Medium partition page (1). +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ +#region Mode Page 0x11: Medium partition page (1) + + public enum PartitionSizeUnitOfMeasures : byte + { + /// Partition size is measures in bytes + Bytes = 0, + /// Partition size is measures in Kilobytes + Kilobytes = 1, + /// Partition size is measures in Megabytes + Megabytes = 2, + /// Partition size is 10eUNITS bytes + Exponential = 3 + } + + public enum MediumFormatRecognitionValues : byte + { + /// Logical unit is incapable of format or partition recognition + Incapable = 0, + /// Logical unit is capable of format recognition only + FormatCapable = 1, + /// Logical unit is capable of partition recognition only + PartitionCapable = 2, + /// Logical unit is capable of both format and partition recognition + Capable = 3 + } + + /// Medium partition page(1) Page code 0x11 + public struct ModePage_11 + { + /// Parameters can be saved + public bool PS; + /// Maximum number of additional partitions supported + public byte MaxAdditionalPartitions; + /// Number of additional partitions to be defined for a volume + public byte AdditionalPartitionsDefined; + /// Device defines partitions based on its fixed definition + public bool FDP; + /// Device should divide medium according to the additional partitions defined field using sizes defined by device + public bool SDP; + /// Initiator defines number and size of partitions + public bool IDP; + /// Defines the unit on which the partition sizes are defined + public PartitionSizeUnitOfMeasures PSUM; + public bool POFM; + public bool CLEAR; + public bool ADDP; + /// Defines the capabilities for the unit to recognize media partitions and format + public MediumFormatRecognitionValues MediumFormatRecognition; + public byte PartitionUnits; + /// Array of partition sizes in units defined above + public ushort[] PartitionSizes; + } + + public static ModePage_11? DecodeModePage_11(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x11) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length < 8) + return null; + + var decoded = new ModePage_11(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + + decoded.MaxAdditionalPartitions = pageResponse[2]; + decoded.AdditionalPartitionsDefined = pageResponse[3]; + decoded.FDP |= (pageResponse[4] & 0x80) == 0x80; + decoded.SDP |= (pageResponse[4] & 0x40) == 0x40; + decoded.IDP |= (pageResponse[4] & 0x20) == 0x20; + decoded.PSUM = (PartitionSizeUnitOfMeasures)((pageResponse[4] & 0x18) >> 3); + decoded.POFM |= (pageResponse[4] & 0x04) == 0x04; + decoded.CLEAR |= (pageResponse[4] & 0x02) == 0x02; + decoded.ADDP |= (pageResponse[4] & 0x01) == 0x01; + decoded.PartitionUnits = (byte)(pageResponse[6] & 0x0F); + decoded.MediumFormatRecognition = (MediumFormatRecognitionValues)pageResponse[5]; + decoded.PartitionSizes = new ushort[(pageResponse.Length - 8) / 2]; + + for(var i = 8; i < pageResponse.Length; i += 2) + { + decoded.PartitionSizes[(i - 8) / 2] = (ushort)(pageResponse[i] << 8); + decoded.PartitionSizes[(i - 8) / 2] += pageResponse[i + 1]; + } + + return decoded; + } + + public static string PrettifyModePage_11(byte[] pageResponse) => + PrettifyModePage_11(DecodeModePage_11(pageResponse)); + + public static string PrettifyModePage_11(ModePage_11? modePage) + { + if(!modePage.HasValue) + return null; + + ModePage_11 page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_medium_partition_page); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + sb.AppendFormat("\t" + Localization._0_maximum_additional_partitions, page.MaxAdditionalPartitions). + AppendLine(); + + sb.AppendFormat("\t" + Localization._0_additional_partitions_defined, page.AdditionalPartitionsDefined). + AppendLine(); + + if(page.FDP) + sb.AppendLine("\t" + Localization.Partitions_are_fixed_under_device_definitions); + + if(page.SDP) + { + sb.AppendLine("\t" + + Localization.Number_of_partitions_can_be_defined_but_their_size_is_defined_by_the_device); + } + + if(page.IDP) + sb.AppendLine("\t" + Localization.Number_and_size_of_partitions_can_be_manually_defined); + + if(page.POFM) + { + sb.AppendLine("\t" + + Localization. + Partition_parameters_will_not_be_applied_until_a_FORMAT_MEDIUM_command_is_received); + } + + switch(page.CLEAR) + { + case false when !page.ADDP: + sb.AppendLine("\t" + + Localization.Device_may_erase_any_or_all_partitions_on_MODE_SELECT_for_partitioning); + + break; + case true when !page.ADDP: + sb.AppendLine("\t" + Localization.Device_shall_erase_all_partitions_on_MODE_SELECT_for_partitioning); + + break; + case false: + sb.AppendLine("\t" + Localization.Device_shall_not_erase_any_partition_on_MODE_SELECT_for_partitioning); + + break; + default: + sb.AppendLine("\t" + + Localization. + Device_shall_erase_all_partitions_differing_on_size_on_MODE_SELECT_for_partitioning); + + break; + } + + string measure; + + switch(page.PSUM) + { + case PartitionSizeUnitOfMeasures.Bytes: + sb.AppendLine("\t" + Localization.Partitions_are_defined_in_bytes); + measure = Localization.bytes; + + break; + case PartitionSizeUnitOfMeasures.Kilobytes: + sb.AppendLine("\t" + Localization.Partitions_are_defined_in_kilobytes); + measure = Localization.kilobytes; + + break; + case PartitionSizeUnitOfMeasures.Megabytes: + sb.AppendLine("\t" + Localization.Partitions_are_defined_in_megabytes); + measure = Localization.megabytes; + + break; + case PartitionSizeUnitOfMeasures.Exponential: + sb.AppendFormat("\t" + Localization.Partitions_are_defined_in_units_of_0_bytes, + Math.Pow(10, page.PartitionUnits)). + AppendLine(); + + measure = string.Format(Localization.units_of_0_bytes, Math.Pow(10, page.PartitionUnits)); + + break; + default: + sb.AppendFormat("\t" + Localization.Unknown_partition_size_unit_code_0, (byte)page.PSUM).AppendLine(); + measure = Localization.units; + + break; + } + + switch(page.MediumFormatRecognition) + { + case MediumFormatRecognitionValues.Capable: + sb.AppendLine("\t" + Localization.Device_is_capable_of_recognizing_both_medium_partitions_and_format); + + break; + case MediumFormatRecognitionValues.FormatCapable: + sb.AppendLine("\t" + Localization.Device_is_capable_of_recognizing_medium_format); + + break; + case MediumFormatRecognitionValues.PartitionCapable: + sb.AppendLine("\t" + Localization.Device_is_capable_of_recognizing_medium_partitions); + + break; + case MediumFormatRecognitionValues.Incapable: + sb.AppendLine("\t" + + Localization.Device_is_not_capable_of_recognizing_neither_medium_partitions_nor_format); + + break; + default: + sb.AppendFormat("\t" + Localization.Unknown_medium_recognition_code_0, + (byte)page.MediumFormatRecognition). + AppendLine(); + + break; + } + + sb.AppendFormat("\t" + Localization.Medium_has_defined_0_partitions, page.PartitionSizes.Length).AppendLine(); + + for(var i = 0; i < page.PartitionSizes.Length; i++) + { + if(page.PartitionSizes[i] == 0) + { + if(page.PartitionSizes.Length == 1) + sb.AppendLine("\t" + Localization.Device_recognizes_one_single_partition_spanning_whole_medium); + else + sb.AppendFormat("\t" + Localization.Partition_0_runs_for_rest_of_medium, i).AppendLine(); + } + else + { + sb.AppendFormat("\t" + Localization.Partition_0_is_1_2_long, i, page.PartitionSizes[i], measure). + AppendLine(); + } + } + + return sb.ToString(); + } + +#endregion Mode Page 0x11: Medium partition page (1) +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/12_13_14.cs b/Aaru.Decoders/SCSI/Modes/12_13_14.cs new file mode 100644 index 000000000..b982121e2 --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/12_13_14.cs @@ -0,0 +1,111 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 12_13_14.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MODE PAGEs 12h, 13h, 14h: Medium partition page (2-4). +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ +#region Mode Pages 0x12, 0x13, 0x14: Medium partition page (2-4) + + /// Medium partition page (2-4) Page codes 0x12, 0x13 and 0x14 + public struct ModePage_12_13_14 + { + /// Parameters can be saved + public bool PS; + /// Array of partition sizes in units defined in mode page 11 + public ushort[] PartitionSizes; + } + + public static ModePage_12_13_14? DecodeModePage_12_13_14(byte[] pageResponse) + { + if(pageResponse == null) + return null; + + if((pageResponse[0] & 0x40) == 0x40) + return null; + + if((pageResponse[0] & 0x3F) != 0x12 && (pageResponse[0] & 0x3F) != 0x13 && (pageResponse[0] & 0x3F) != 0x14) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length < 2) + return null; + + var decoded = new ModePage_12_13_14(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + + decoded.PartitionSizes = new ushort[(pageResponse.Length - 2) / 2]; + + for(var i = 2; i < pageResponse.Length; i += 2) + { + decoded.PartitionSizes[(i - 2) / 2] = (ushort)(pageResponse[i] << 8); + decoded.PartitionSizes[(i - 2) / 2] += pageResponse[i + 1]; + } + + return decoded; + } + + public static string PrettifyModePage_12_13_14(byte[] pageResponse) => + PrettifyModePage_12_13_14(DecodeModePage_12_13_14(pageResponse)); + + public static string PrettifyModePage_12_13_14(ModePage_12_13_14? modePage) + { + if(!modePage.HasValue) + return null; + + ModePage_12_13_14 page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_medium_partition_page_extra); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + sb.AppendFormat("\t" + Localization.Medium_has_defined_0_partitions, page.PartitionSizes.Length).AppendLine(); + + for(var i = 0; i < page.PartitionSizes.Length; i++) + sb.AppendFormat("\t" + Localization.Partition_0_is_1_units_long, i, page.PartitionSizes[i]).AppendLine(); + + return sb.ToString(); + } + +#endregion Mode Pages 0x12, 0x13, 0x14: Medium partition page (2-4) +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/1A.cs b/Aaru.Decoders/SCSI/Modes/1A.cs new file mode 100644 index 000000000..6f636b320 --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/1A.cs @@ -0,0 +1,283 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 1A.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MODE PAGE 1Ah: Power condition page. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ +#region Mode Page 0x1A: Power condition page + + /// Power condition page Page code 0x1A 12 bytes in SPC-1, SPC-2, SPC-3, SPC-4 40 bytes in SPC-5 + public struct ModePage_1A + { + /// Parameters can be saved + public bool PS; + /// Idle timer activated + public bool Idle; + /// Standby timer activated + public bool Standby; + /// Idle timer + public uint IdleTimer; + /// Standby timer + public uint StandbyTimer; + + /// Interactions between background functions and power management + public byte PM_BG_Precedence; + /// Standby timer Y activated + public bool Standby_Y; + /// Idle timer B activated + public bool Idle_B; + /// Idle timer C activated + public bool Idle_C; + /// Idle timer B + public uint IdleTimer_B; + /// Idle timer C + public uint IdleTimer_C; + /// Standby timer Y + public uint StandbyTimer_Y; + public byte CCF_Idle; + public byte CCF_Standby; + public byte CCF_Stopped; + } + + public static ModePage_1A? DecodeModePage_1A(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x1A) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length < 12) + return null; + + var decoded = new ModePage_1A(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + + decoded.Standby |= (pageResponse[3] & 0x01) == 0x01; + decoded.Idle |= (pageResponse[3] & 0x02) == 0x02; + + decoded.IdleTimer = (uint)((pageResponse[4] << 24) + + (pageResponse[5] << 16) + + (pageResponse[6] << 8) + + pageResponse[7]); + + decoded.StandbyTimer = (uint)((pageResponse[8] << 24) + + (pageResponse[9] << 16) + + (pageResponse[10] << 8) + + pageResponse[11]); + + if(pageResponse.Length < 40) + return decoded; + + decoded.PM_BG_Precedence = (byte)((pageResponse[2] & 0xC0) >> 6); + decoded.Standby_Y |= (pageResponse[2] & 0x01) == 0x01; + decoded.Idle_B |= (pageResponse[3] & 0x04) == 0x04; + decoded.Idle_C |= (pageResponse[3] & 0x08) == 0x08; + + decoded.IdleTimer_B = (uint)((pageResponse[12] << 24) + + (pageResponse[13] << 16) + + (pageResponse[14] << 8) + + pageResponse[15]); + + decoded.IdleTimer_C = (uint)((pageResponse[16] << 24) + + (pageResponse[17] << 16) + + (pageResponse[18] << 8) + + pageResponse[19]); + + decoded.StandbyTimer_Y = (uint)((pageResponse[20] << 24) + + (pageResponse[21] << 16) + + (pageResponse[22] << 8) + + pageResponse[23]); + + decoded.CCF_Idle = (byte)((pageResponse[39] & 0xC0) >> 6); + decoded.CCF_Standby = (byte)((pageResponse[39] & 0x30) >> 4); + decoded.CCF_Stopped = (byte)((pageResponse[39] & 0x0C) >> 2); + + return decoded; + } + + public static string PrettifyModePage_1A(byte[] pageResponse) => + PrettifyModePage_1A(DecodeModePage_1A(pageResponse)); + + public static string PrettifyModePage_1A(ModePage_1A? modePage) + { + if(!modePage.HasValue) + return null; + + ModePage_1A page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine("SCSI Power condition page:"); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + if(page is { Standby: true, StandbyTimer: > 0 } or { Standby_Y: true, StandbyTimer_Y: > 0 }) + { + if(page is { Standby: true, StandbyTimer: > 0 }) + sb.AppendFormat("\t" + "Standby timer Z is set to {0} ms", page.StandbyTimer * 100).AppendLine(); + + if(page is { Standby_Y: true, StandbyTimer_Y: > 0 }) + sb.AppendFormat("\t" + "Standby timer Y is set to {0} ms", page.StandbyTimer_Y * 100).AppendLine(); + } + else + sb.AppendLine("\t" + "Drive will not enter standby mode"); + + if(page is { Idle: true, IdleTimer: > 0 } or { Idle_B: true, IdleTimer_B: > 0 } or { Idle_C: true, IdleTimer_C: > 0 }) + { + if(page is { Idle: true, IdleTimer: > 0 }) + sb.AppendFormat("\t" + "Idle timer A is set to {0} ms", page.IdleTimer * 100).AppendLine(); + + if(page is { Idle_B: true, IdleTimer_B: > 0 }) + sb.AppendFormat("\t" + "Idle timer B is set to {0} ms", page.IdleTimer_B * 100).AppendLine(); + + if(page is { Idle_C: true, IdleTimer_C: > 0 }) + sb.AppendFormat("\t" + "Idle timer C is set to {0} ms", page.IdleTimer_C * 100).AppendLine(); + } + else + sb.AppendLine("\t" + "Drive will not enter idle mode"); + + switch(page.PM_BG_Precedence) + { + case 0: + break; + case 1: + sb.AppendLine("\t" + + "Performing background functions take precedence over maintaining low power conditions"); + + break; + case 2: + sb.AppendLine("\t" + + "Maintaining low power conditions take precedence over performing background functions"); + + break; + } + + return sb.ToString(); + } + +#endregion Mode Page 0x1A: Power condition page + +#region Mode Page 0x1A subpage 0x01: Power Consumption mode page + + /// Power Consumption mode page Page code 0x1A Subpage code 0x01 16 bytes in SPC-5 + public struct ModePage_1A_S01 + { + /// Parameters can be saved + public bool PS; + /// Active power level + public byte ActiveLevel; + /// Power Consumption VPD identifier in use + public byte PowerConsumptionIdentifier; + } + + public static ModePage_1A_S01? DecodeModePage_1A_S01(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) != 0x40) + return null; + + if((pageResponse[0] & 0x3F) != 0x1A) + return null; + + if(pageResponse[1] != 0x01) + return null; + + if((pageResponse[2] << 8) + pageResponse[3] + 4 != pageResponse.Length) + return null; + + if(pageResponse.Length < 16) + return null; + + var decoded = new ModePage_1A_S01(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.ActiveLevel = (byte)(pageResponse[6] & 0x03); + decoded.PowerConsumptionIdentifier = pageResponse[7]; + + return decoded; + } + + public static string PrettifyModePage_1A_S01(byte[] pageResponse) => + PrettifyModePage_1A_S01(DecodeModePage_1A_S01(pageResponse)); + + public static string PrettifyModePage_1A_S01(ModePage_1A_S01? modePage) + { + if(!modePage.HasValue) + return null; + + ModePage_1A_S01 page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_Power_Consumption_page); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + switch(page.ActiveLevel) + { + case 0: + sb. + AppendFormat("\t" + Localization.Device_power_consumption_is_dictated_by_identifier_0_of_Power_Consumption_VPD, + page.PowerConsumptionIdentifier). + AppendLine(); + + break; + case 1: + sb.AppendLine("\t" + Localization.Device_is_in_highest_relative_power_consumption_level); + + break; + case 2: + sb.AppendLine("\t" + Localization.Device_is_in_intermediate_relative_power_consumption_level); + + break; + case 3: + sb.AppendLine("\t" + Localization.Device_is_in_lowest_relative_power_consumption_level); + + break; + } + + return sb.ToString(); + } + +#endregion Mode Page 0x1A subpage 0x01: Power Consumption mode page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/1B.cs b/Aaru.Decoders/SCSI/Modes/1B.cs new file mode 100644 index 000000000..439249a6a --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/1B.cs @@ -0,0 +1,124 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 1B.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MODE PAGE 1Bh: Removable Block Access Capabilities page. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ +#region Mode Page 0x1B: Removable Block Access Capabilities page + + /// Removable Block Access Capabilities page Page code 0x1B 12 bytes in INF-8070 + public struct ModePage_1B + { + /// Parameters can be saved + public bool PS; + /// Supports reporting progress of format + public bool SRFP; + /// Non-CD Optical Device + public bool NCD; + /// Phase change dual device supporting a CD and a Non-CD Optical devices + public bool SML; + /// Total number of LUNs + public byte TLUN; + /// System Floppy Type device + public bool SFLP; + } + + public static ModePage_1B? DecodeModePage_1B(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x1B) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length < 12) + return null; + + var decoded = new ModePage_1B(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.SFLP |= (pageResponse[2] & 0x80) == 0x80; + decoded.SRFP |= (pageResponse[2] & 0x40) == 0x40; + decoded.NCD |= (pageResponse[3] & 0x80) == 0x80; + decoded.SML |= (pageResponse[3] & 0x40) == 0x40; + + decoded.TLUN = (byte)(pageResponse[3] & 0x07); + + return decoded; + } + + public static string PrettifyModePage_1B(byte[] pageResponse) => + PrettifyModePage_1B(DecodeModePage_1B(pageResponse)); + + public static string PrettifyModePage_1B(ModePage_1B? modePage) + { + if(!modePage.HasValue) + return null; + + ModePage_1B page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_Removable_Block_Access_Capabilities_page); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + if(page.SFLP) + sb.AppendLine("\t" + Localization.Drive_can_be_used_as_a_system_floppy_device); + + if(page.SRFP) + sb.AppendLine("\t" + Localization.Drive_supports_reporting_progress_of_format); + + if(page.NCD) + sb.AppendLine("\t" + Localization.Drive_is_a_Non_CD_Optical_Device); + + if(page.SML) + sb.AppendLine("\t" + Localization.Device_is_a_dual_device_supporting_CD_and_Non_CD_Optical); + + if(page.TLUN > 0) + sb.AppendFormat("\t" + Localization.Drive_supports_0_LUNs, page.TLUN).AppendLine(); + + return sb.ToString(); + } + +#endregion Mode Page 0x1B: Removable Block Access Capabilities page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/1C.cs b/Aaru.Decoders/SCSI/Modes/1C.cs new file mode 100644 index 000000000..c60ea35e7 --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/1C.cs @@ -0,0 +1,341 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 1C.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MODE PAGE 1Ch: Informational exceptions control page. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ +#region Mode Page 0x1C: Informational exceptions control page + + /// Informational exceptions control page Page code 0x1C 12 bytes in SPC-1, SPC-2, SPC-3, SPC-4 + public struct ModePage_1C + { + /// Parameters can be saved + public bool PS; + /// Informational exception operations should not affect performance + public bool Perf; + /// Disable informational exception operations + public bool DExcpt; + /// Create a test device failure at next interval time + public bool Test; + /// Log informational exception conditions + public bool LogErr; + /// Method of reporting informational exceptions + public byte MRIE; + /// 100 ms period to report an informational exception condition + public uint IntervalTimer; + /// How many times to report informational exceptions + public uint ReportCount; + + /// Enable background functions + public bool EBF; + /// Warning reporting enabled + public bool EWasc; + + /// Enable reporting of background self-test errors + public bool EBACKERR; + } + + public static ModePage_1C? DecodeModePage_1C(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x1C) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length < 8) + return null; + + var decoded = new ModePage_1C(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + + decoded.Perf |= (pageResponse[2] & 0x80) == 0x80; + decoded.DExcpt |= (pageResponse[2] & 0x08) == 0x08; + decoded.Test |= (pageResponse[2] & 0x04) == 0x04; + decoded.LogErr |= (pageResponse[2] & 0x01) == 0x01; + + decoded.MRIE = (byte)(pageResponse[3] & 0x0F); + + decoded.IntervalTimer = + (uint)((pageResponse[4] << 24) + (pageResponse[5] << 16) + (pageResponse[6] << 8) + pageResponse[7]); + + decoded.EBF |= (pageResponse[2] & 0x20) == 0x20; + decoded.EWasc |= (pageResponse[2] & 0x10) == 0x10; + + decoded.EBACKERR |= (pageResponse[2] & 0x02) == 0x02; + + if(pageResponse.Length >= 12) + { + decoded.ReportCount = (uint)((pageResponse[8] << 24) + + (pageResponse[9] << 16) + + (pageResponse[10] << 8) + + pageResponse[11]); + } + + return decoded; + } + + public static string PrettifyModePage_1C(byte[] pageResponse) => + PrettifyModePage_1C(DecodeModePage_1C(pageResponse)); + + public static string PrettifyModePage_1C(ModePage_1C? modePage) + { + if(!modePage.HasValue) + return null; + + ModePage_1C page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_Informational_exceptions_control_page); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + if(page.DExcpt) + sb.AppendLine("\t" + Localization.Informational_exceptions_are_disabled); + else + { + sb.AppendLine("\t" + Localization.Informational_exceptions_are_enabled); + + switch(page.MRIE) + { + case 0: + sb.AppendLine("\t" + Localization.No_reporting_of_informational_exception_condition); + + break; + case 1: + sb.AppendLine("\t" + Localization.Asynchronous_event_reporting_of_informational_exceptions); + + break; + case 2: + sb.AppendLine("\t" + Localization.Generate_unit_attention_on_informational_exceptions); + + break; + case 3: + sb.AppendLine("\t" + + Localization.Conditionally_generate_recovered_error_on_informational_exceptions); + + break; + case 4: + sb.AppendLine("\t" + + Localization.Unconditionally_generate_recovered_error_on_informational_exceptions); + + break; + case 5: + sb.AppendLine("\t" + Localization.Generate_no_sense_on_informational_exceptions); + + break; + case 6: + sb.AppendLine("\t" + Localization.Only_report_informational_exception_condition_on_request); + + break; + default: + sb.AppendFormat("\t" + Localization.Unknown_method_of_reporting_0, page.MRIE).AppendLine(); + + break; + } + + if(page.Perf) + { + sb.AppendLine("\t" + + Localization.Informational_exceptions_reporting_should_not_affect_drive_performance); + } + + if(page.Test) + sb.AppendLine("\t" + Localization.A_test_informational_exception_will_raise_on_next_timer); + + if(page.LogErr) + sb.AppendLine("\t" + Localization.Drive_shall_log_informational_exception_conditions); + + if(page.IntervalTimer > 0) + { + if(page.IntervalTimer == 0xFFFFFFFF) + sb.AppendLine("\t" + Localization.Timer_interval_is_vendor_specific); + else + sb.AppendFormat("\t" + Localization.Timer_interval_is_0_ms, page.IntervalTimer * 100).AppendLine(); + } + + if(page.ReportCount > 0) + { + sb.AppendFormat("\t" + Localization.Informational_exception_conditions_will_be_reported_a_maximum_of_0_times, + page.ReportCount); + } + } + + if(page.EWasc) + sb.AppendLine("\t" + Localization.Warning_reporting_is_enabled); + + if(page.EBF) + sb.AppendLine("\t" + Localization.Background_functions_are_enabled); + + if(page.EBACKERR) + sb.AppendLine("\t" + Localization.Drive_will_report_background_self_test_errors); + + return sb.ToString(); + } + +#endregion Mode Page 0x1C: Informational exceptions control page + +#region Mode Page 0x1C subpage 0x01: Background Control mode page + + /// Background Control mode page Page code 0x1A Subpage code 0x01 16 bytes in SPC-5 + public struct ModePage_1C_S01 + { + /// Parameters can be saved + public bool PS; + /// Suspend on log full + public bool S_L_Full; + /// Log only when intervention required + public bool LOWIR; + /// Enable background medium scan + public bool En_Bms; + /// Enable background pre-scan + public bool En_Ps; + /// Time in hours between background medium scans + public ushort BackgroundScanInterval; + /// Maximum time in hours for a background pre-scan to complete + public ushort BackgroundPrescanTimeLimit; + /// Minimum time in ms being idle before resuming a background scan + public ushort MinIdleBeforeBgScan; + /// Maximum time in ms to start processing commands while performing a background scan + public ushort MaxTimeSuspendBgScan; + } + + public static ModePage_1C_S01? DecodeModePage_1C_S01(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) != 0x40) + return null; + + if((pageResponse[0] & 0x3F) != 0x1C) + return null; + + if(pageResponse[1] != 0x01) + return null; + + if((pageResponse[2] << 8) + pageResponse[3] + 4 != pageResponse.Length) + return null; + + if(pageResponse.Length < 16) + return null; + + var decoded = new ModePage_1C_S01(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + + decoded.S_L_Full |= (pageResponse[4] & 0x04) == 0x04; + decoded.LOWIR |= (pageResponse[4] & 0x02) == 0x02; + decoded.En_Bms |= (pageResponse[4] & 0x01) == 0x01; + decoded.En_Ps |= (pageResponse[5] & 0x01) == 0x01; + + decoded.BackgroundScanInterval = (ushort)((pageResponse[6] << 8) + pageResponse[7]); + decoded.BackgroundPrescanTimeLimit = (ushort)((pageResponse[8] << 8) + pageResponse[9]); + decoded.MinIdleBeforeBgScan = (ushort)((pageResponse[10] << 8) + pageResponse[11]); + decoded.MaxTimeSuspendBgScan = (ushort)((pageResponse[12] << 8) + pageResponse[13]); + + return decoded; + } + + public static string PrettifyModePage_1C_S01(byte[] pageResponse) => + PrettifyModePage_1C_S01(DecodeModePage_1C_S01(pageResponse)); + + public static string PrettifyModePage_1C_S01(ModePage_1C_S01? modePage) + { + if(!modePage.HasValue) + return null; + + ModePage_1C_S01 page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_Background_Control_page); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + if(page.S_L_Full) + sb.AppendLine("\t" + Localization.Background_scans_will_be_halted_if_log_is_full); + + if(page.LOWIR) + sb.AppendLine("\t" + Localization.Background_scans_will_only_be_logged_if_they_require_intervention); + + if(page.En_Bms) + sb.AppendLine("\t" + Localization.Background_medium_scans_are_enabled); + + if(page.En_Ps) + sb.AppendLine("\t" + Localization.Background_pre_scans_are_enabled); + + if(page.BackgroundScanInterval > 0) + { + sb. + AppendFormat("\t" + Localization._0__hours_shall_be_between_the_start_of_a_background_scan_operation_and_the_next, + page.BackgroundScanInterval). + AppendLine(); + } + + if(page.BackgroundPrescanTimeLimit > 0) + { + sb.AppendFormat("\t" + Localization.Background_pre_scan_operations_can_take_a_maximum_of_0_hours, + page.BackgroundPrescanTimeLimit). + AppendLine(); + } + + if(page.MinIdleBeforeBgScan > 0) + { + sb. + AppendFormat("\t" + Localization.At_least_0_ms_must_be_idle_before_resuming_a_suspended_background_scan_operation, + page.MinIdleBeforeBgScan). + AppendLine(); + } + + if(page.MaxTimeSuspendBgScan > 0) + { + sb. + AppendFormat("\t" + Localization.At_most_0_ms_must_be_before_suspending_a_background_scan_operation_and_processing_received_commands, + page.MaxTimeSuspendBgScan). + AppendLine(); + } + + return sb.ToString(); + } + +#endregion Mode Page 0x1C subpage 0x01: Background Control mode page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/1C_SFF.cs b/Aaru.Decoders/SCSI/Modes/1C_SFF.cs new file mode 100644 index 000000000..71b202850 --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/1C_SFF.cs @@ -0,0 +1,209 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 1C_SFF.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MODE PAGE 1Ch: Timer & Protect page. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ +#region Mode Page 0x1C: Timer & Protect page + + /// Timer & Protect page Page code 0x1C 8 bytes in INF-8070 + public struct ModePage_1C_SFF + { + /// Parameters can be saved + public bool PS; + /// Time the device shall remain in the current state after seek, read or write operation + public byte InactivityTimeMultiplier; + /// Disabled until power cycle + public bool DISP; + /// Software Write Protect until Power-down + public bool SWPP; + } + + public static ModePage_1C_SFF? DecodeModePage_1C_SFF(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x1C) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length < 8) + return null; + + var decoded = new ModePage_1C_SFF(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.DISP |= (pageResponse[2] & 0x02) == 0x02; + decoded.SWPP |= (pageResponse[3] & 0x01) == 0x01; + + decoded.InactivityTimeMultiplier = (byte)(pageResponse[3] & 0x0F); + + return decoded; + } + + public static string PrettifyModePage_1C_SFF(byte[] pageResponse) => + PrettifyModePage_1C_SFF(DecodeModePage_1C_SFF(pageResponse)); + + public static string PrettifyModePage_1C_SFF(ModePage_1C_SFF? modePage) + { + if(!modePage.HasValue) + return null; + + ModePage_1C_SFF page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_Timer_Protect_page); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + if(page.DISP) + sb.AppendLine("\t" + Localization.Drive_is_disabled_until_power_is_cycled); + + if(page.SWPP) + sb.AppendLine("\t" + Localization.Drive_is_software_write_protected_until_powered_down); + + switch(page.InactivityTimeMultiplier) + { + case 0: + sb.AppendLine("\t" + + Localization. + Drive_will_remain_in_same_status_a_vendor_specified_time_after_a_seek_read_or_write_operation); + + break; + case 1: + sb.AppendLine("\t" + + Localization. + Drive_will_remain_in_same_status_125_ms_after_a_seek_read_or_write_operation); + + break; + case 2: + sb.AppendLine("\t" + + Localization. + Drive_will_remain_in_same_status_250_ms_after_a_seek_read_or_write_operation); + + break; + case 3: + sb.AppendLine("\t" + + Localization. + Drive_will_remain_in_same_status_500_ms_after_a_seek_read_or_write_operation); + + break; + case 4: + sb.AppendLine("\t" + + Localization. + Drive_will_remain_in_same_status_1_second_after_a_seek_read_or_write_operation); + + break; + case 5: + sb.AppendLine("\t" + + Localization. + Drive_will_remain_in_same_status_2_seconds_after_a_seek_read_or_write_operation); + + break; + case 6: + sb.AppendLine("\t" + + Localization. + Drive_will_remain_in_same_status_4_seconds_after_a_seek_read_or_write_operation); + + break; + case 7: + sb.AppendLine("\t" + + Localization. + Drive_will_remain_in_same_status_8_seconds_after_a_seek_read_or_write_operation); + + break; + case 8: + sb.AppendLine("\t" + + Localization. + Drive_will_remain_in_same_status_16_seconds_after_a_seek_read_or_write_operation); + + break; + case 9: + sb.AppendLine("\t" + + Localization. + Drive_will_remain_in_same_status_32_seconds_after_a_seek_read_or_write_operation); + + break; + case 10: + sb.AppendLine("\t" + + Localization. + Drive_will_remain_in_same_status_1_minute_after_a_seek_read_or_write_operation); + + break; + case 11: + sb.AppendLine("\t" + + Localization. + Drive_will_remain_in_same_status_2_minutes_after_a_seek_read_or_write_operation); + + break; + case 12: + sb.AppendLine("\t" + + Localization. + Drive_will_remain_in_same_status_4_minutes_after_a_seek_read_or_write_operation); + + break; + case 13: + sb.AppendLine("\t" + + Localization. + Drive_will_remain_in_same_status_8_minutes_after_a_seek_read_or_write_operation); + + break; + case 14: + sb.AppendLine("\t" + + Localization. + Drive_will_remain_in_same_status_16_minutes_after_a_seek_read_or_write_operation); + + break; + case 15: + sb.AppendLine("\t" + + Localization. + Drive_will_remain_in_same_status_32_minutes_after_a_seek_read_or_write_operation); + + break; + } + + return sb.ToString(); + } + +#endregion Mode Page 0x1C: Timer & Protect page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/1D.cs b/Aaru.Decoders/SCSI/Modes/1D.cs new file mode 100644 index 000000000..a66c1be32 --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/1D.cs @@ -0,0 +1,143 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 1D.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MODE PAGE 1Dh: Medium Configuration Mode Page. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ +#region Mode Page 0x1D: Medium Configuration Mode Page + + public struct ModePage_1D + { + /// Parameters can be saved + public bool PS; + public bool WORMM; + public byte WormModeLabelRestrictions; + public byte WormModeFilemarkRestrictions; + } + + public static ModePage_1D? DecodeModePage_1D(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x1D) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length < 32) + return null; + + var decoded = new ModePage_1D(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.WORMM |= (pageResponse[2] & 0x01) == 0x01; + decoded.WormModeLabelRestrictions = pageResponse[4]; + decoded.WormModeFilemarkRestrictions = pageResponse[5]; + + return decoded; + } + + public static string PrettifyModePage_1D(byte[] pageResponse) => + PrettifyModePage_1D(DecodeModePage_1D(pageResponse)); + + public static string PrettifyModePage_1D(ModePage_1D? modePage) + { + if(!modePage.HasValue) + return null; + + ModePage_1D page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_Medium_Configuration_Mode_Page); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + if(page.WORMM) + sb.AppendLine("\t" + Localization.Drive_is_operating_in_WORM_mode); + + switch(page.WormModeLabelRestrictions) + { + case 0: + sb.AppendLine("\t" + Localization.Drive_does_not_allow_any_logical_blocks_to_be_overwritten); + + break; + case 1: + sb.AppendLine("\t" + Localization.Drive_allows_a_tape_header_to_be_overwritten); + + break; + case 2: + sb.AppendLine("\t" + Localization.Drive_allows_all_format_labels_to_be_overwritten); + + break; + default: + sb.AppendFormat("\t" + Localization.Unknown_WORM_mode_label_restrictions_code_0, + page.WormModeLabelRestrictions). + AppendLine(); + + break; + } + + switch(page.WormModeFilemarkRestrictions) + { + case 2: + sb.AppendLine("\t" + + "Drive allows any number of filemarks immediately preceding EOD to be overwritten except filemark closes to BOP"); + + break; + case 3: + sb.AppendLine("\t" + + "Drive allows any number of filemarks immediately preceding EOD to be overwritten"); + + break; + default: + sb.AppendFormat("\t" + "Unknown WORM mode filemark restrictions code {0}", + page.WormModeLabelRestrictions). + AppendLine(); + + break; + } + + return sb.ToString(); + } + +#endregion Mode Page 0x1D: Medium Configuration Mode Page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/21_Certance.cs b/Aaru.Decoders/SCSI/Modes/21_Certance.cs new file mode 100644 index 000000000..36a689ba6 --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/21_Certance.cs @@ -0,0 +1,215 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 21_Certance.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes Certance MODE PAGE 21h: Drive Capabilities Control Mode page. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ +#region Certance Mode Page 0x21: Drive Capabilities Control Mode page + + public struct Certance_ModePage_21 + { + /// Parameters can be saved + public bool PS; + public byte OperatingSystemsSupport; + public byte FirmwareTestControl2; + public byte ExtendedPOSTMode; + public byte InquiryStringControl; + public byte FirmwareTestControl; + public byte DataCompressionControl; + public bool HostUnloadOverride; + public byte AutoUnloadMode; + } + + public static Certance_ModePage_21? DecodeCertanceModePage_21(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x21) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length != 9) + return null; + + var decoded = new Certance_ModePage_21(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.OperatingSystemsSupport = pageResponse[2]; + decoded.FirmwareTestControl2 = pageResponse[3]; + decoded.ExtendedPOSTMode = pageResponse[4]; + decoded.InquiryStringControl = pageResponse[5]; + decoded.FirmwareTestControl = pageResponse[6]; + decoded.DataCompressionControl = pageResponse[7]; + decoded.HostUnloadOverride |= (pageResponse[8] & 0x80) == 0x80; + decoded.AutoUnloadMode = (byte)(pageResponse[8] & 0x7F); + + return decoded; + } + + public static string PrettifyCertanceModePage_21(byte[] pageResponse) => + PrettifyCertanceModePage_21(DecodeCertanceModePage_21(pageResponse)); + + public static string PrettifyCertanceModePage_21(Certance_ModePage_21? modePage) + { + if(!modePage.HasValue) + return null; + + Certance_ModePage_21 page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.Certance_Drive_Capabilities_Control_Mode_Page); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + switch(page.OperatingSystemsSupport) + { + case 0: + sb.AppendLine("\t" + Localization.Operating_systems_support_is_standard_LTO); + + break; + default: + sb.AppendFormat("\t" + Localization.Operating_systems_support_is_unknown_code_0, + page.OperatingSystemsSupport). + AppendLine(); + + break; + } + + if(page.FirmwareTestControl == page.FirmwareTestControl2) + { + switch(page.FirmwareTestControl) + { + case 0: + sb.AppendLine("\t" + Localization.Factory_test_code_is_disabled); + + break; + case 1: + sb.AppendLine("\t" + Localization.Factory_test_code_1_is_disabled); + + break; + case 2: + sb.AppendLine("\t" + Localization.Factory_test_code_2_is_disabled); + + break; + default: + sb.AppendFormat("\t" + Localization.Unknown_factory_test_code_0, page.FirmwareTestControl). + AppendLine(); + + break; + } + } + + switch(page.ExtendedPOSTMode) + { + case 0: + sb.AppendLine("\t" + Localization.Power_On_Self_Test_is_enabled); + + break; + case 1: + sb.AppendLine("\t" + Localization.Power_On_Self_Test_is_disabled); + + break; + default: + sb.AppendFormat("\t" + Localization.Unknown_Power_On_Self_Test_code_0, page.ExtendedPOSTMode). + AppendLine(); + + break; + } + + switch(page.DataCompressionControl) + { + case 0: + sb.AppendLine("\t" + Localization.Compression_is_controlled_using_mode_pages_0Fh_and_10h); + + break; + case 1: + sb.AppendLine("\t" + Localization.Compression_is_enabled_and_not_controllable); + + break; + case 2: + sb.AppendLine("\t" + Localization.Compression_is_disabled_and_not_controllable); + + break; + default: + sb.AppendFormat("\t" + Localization.Unknown_compression_control_code_0, page.DataCompressionControl). + AppendLine(); + + break; + } + + if(page.HostUnloadOverride) + sb.AppendLine("\t" + Localization.SCSI_UNLOAD_command_will_not_eject_the_cartridge); + + sb.Append("\t" + + Localization. + How_should_tapes_be_unloaded_in_a_power_cycle_tape_incompatibility_firmware_download_or_cleaning_end); + + switch(page.AutoUnloadMode) + { + case 0: + sb.AppendLine("\t" + Localization.Tape_will_stay_threaded_at_beginning); + + break; + case 1: + sb.AppendLine("\t" + Localization.Tape_will_be_unthreaded); + + break; + case 2: + sb.AppendLine("\t" + Localization.Tape_will_be_unthreaded_and_unloaded); + + break; + case 3: + sb.AppendLine("\t" + Localization.Data_tapes_will_be_threaded_at_beginning_rest_will_be_unloaded); + + break; + default: + sb.AppendFormat("\t" + Localization.Unknown_auto_unload_code_0, page.AutoUnloadMode).AppendLine(); + + break; + } + + return sb.ToString(); + } + +#endregion Certance Mode Page 0x21: Drive Capabilities Control Mode page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/22_Certance.cs b/Aaru.Decoders/SCSI/Modes/22_Certance.cs new file mode 100644 index 000000000..23c01fad6 --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/22_Certance.cs @@ -0,0 +1,200 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 22_Certance.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes Certance MODE PAGE 22h: Interface Control Mode Page. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +public static partial class Modes +{ +#region Certance Mode Page 0x22: Interface Control Mode Page + + [SuppressMessage("ReSharper", "UnusedMember.Global")] + public struct Certance_ModePage_22 + { + /// Parameters can be saved + public bool PS; + public byte BaudRate; + public byte CmdFwd; + public bool StopBits; + public byte Alerts; + public byte PortATransportType; + public byte PortAPresentSelectionID; + public byte NextSelectionID; + public byte JumperedSelectionID; + public byte TargetInitiatedBusControl; + public bool PortAEnabled; + public bool PortAEnabledOnPower; + } + + public static Certance_ModePage_22? DecodeCertanceModePage_22(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x22) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length != 16) + return null; + + var decoded = new Certance_ModePage_22(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.BaudRate = pageResponse[2]; + decoded.CmdFwd = (byte)((pageResponse[3] & 0x18) >> 3); + decoded.StopBits |= (pageResponse[3] & 0x04) == 0x04; + decoded.CmdFwd = (byte)(pageResponse[3] & 0x03); + decoded.PortATransportType = pageResponse[4]; + decoded.PortAPresentSelectionID = pageResponse[7]; + decoded.NextSelectionID = pageResponse[12]; + decoded.JumperedSelectionID = pageResponse[13]; + decoded.TargetInitiatedBusControl = pageResponse[14]; + decoded.PortAEnabled |= (pageResponse[15] & 0x10) == 0x10; + decoded.PortAEnabledOnPower |= (pageResponse[15] & 0x04) == 0x04; + + return decoded; + } + + public static string PrettifyCertanceModePage_22(byte[] pageResponse) => + PrettifyCertanceModePage_22(DecodeCertanceModePage_22(pageResponse)); + + public static string PrettifyCertanceModePage_22(Certance_ModePage_22? modePage) + { + if(!modePage.HasValue) + return null; + + Certance_ModePage_22 page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.Certance_Interface_Control_Mode_Page); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + switch(page.BaudRate) + { + case 0: + case 1: + case 2: + sb.AppendLine("\t" + Localization.Library_interface_will_operate_at_9600_baud_on_next_reset); + + break; + case 3: + sb.AppendLine("\t" + Localization.Library_interface_will_operate_at_19200_baud_on_next_reset); + + break; + case 4: + sb.AppendLine("\t" + Localization.Library_interface_will_operate_at_38400_baud_on_next_reset); + + break; + case 5: + sb.AppendLine("\t" + Localization.Library_interface_will_operate_at_57600_baud_on_next_reset); + + break; + case 6: + sb.AppendLine("\t" + Localization.Library_interface_will_operate_at_115200_baud_on_next_reset); + + break; + default: + sb.AppendFormat("\t" + Localization.Unknown_library_interface_baud_rate_code_0, page.BaudRate). + AppendLine(); + + break; + } + + sb.AppendLine(page.StopBits + ? Localization.Library_interface_transmits_2_stop_bits_per_byte + : Localization.Library_interface_transmits_1_stop_bits_per_byte); + + switch(page.CmdFwd) + { + case 0: + sb.AppendLine("\t" + Localization.Command_forwarding_is_disabled); + + break; + case 1: + sb.AppendLine("\t" + Localization.Command_forwarding_is_enabled); + + break; + default: + sb.AppendFormat("\t" + Localization.Unknown_command_forwarding_code_0, page.CmdFwd).AppendLine(); + + break; + } + + switch(page.PortATransportType) + { + case 0: + sb.AppendLine("\t" + Localization.Port_A_link_is_down); + + break; + case 3: + sb.AppendLine("\t" + Localization.Port_A_uses_Parallel_SCSI_Ultra_160_interface); + + break; + default: + sb.AppendFormat("\t" + Localization.Unknown_port_A_transport_type_code_0, page.PortATransportType). + AppendLine(); + + break; + } + + if(page.PortATransportType > 0) + sb.AppendFormat("\t" + Localization.Drive_responds_to_SCSI_ID_0, page.PortAPresentSelectionID).AppendLine(); + + sb.AppendFormat("\t" + Localization.Drive_will_respond_to_SCSI_ID_0_on_Port_A_enabling, page.NextSelectionID). + AppendLine(); + + sb.AppendFormat("\t" + Localization.Drive_jumpers_choose_SCSI_ID_0, page.JumperedSelectionID).AppendLine(); + + sb.AppendLine(page.PortAEnabled + ? "\t" + Localization.SCSI_port_is_enabled + : "\t" + Localization.SCSI_port_is_disabled); + + sb.AppendLine(page.PortAEnabledOnPower + ? "\t" + Localization.SCSI_port_will_be_enabled_on_next_power_up + : "\t" + Localization.SCSI_port_will_be_disabled_on_next_power_up); + + return sb.ToString(); + } + +#endregion Certance Mode Page 0x22: Interface Control Mode Page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/24_IBM.cs b/Aaru.Decoders/SCSI/Modes/24_IBM.cs new file mode 100644 index 000000000..dbd03f777 --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/24_IBM.cs @@ -0,0 +1,111 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 24_IBM.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes IBM MODE PAGE 24h: Drive Capabilities Control Mode page. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ +#region IBM Mode Page 0x24: Drive Capabilities Control Mode page + + public struct IBM_ModePage_24 + { + /// Parameters can be saved + public bool PS; + public byte ModeControl; + public byte VelocitySetting; + public bool EncryptionEnabled; + public bool EncryptionCapable; + } + + public static IBM_ModePage_24? DecodeIBMModePage_24(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x24) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length != 8) + return null; + + var decoded = new IBM_ModePage_24(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.ModeControl = pageResponse[2]; + decoded.VelocitySetting = pageResponse[3]; + decoded.EncryptionEnabled |= (pageResponse[7] & 0x08) == 0x08; + decoded.EncryptionCapable |= (pageResponse[7] & 0x01) == 0x01; + + return decoded; + } + + public static string PrettifyIBMModePage_24(byte[] pageResponse) => + PrettifyIBMModePage_24(DecodeIBMModePage_24(pageResponse)); + + public static string PrettifyIBMModePage_24(IBM_ModePage_24? modePage) + { + if(!modePage.HasValue) + return null; + + IBM_ModePage_24 page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.IBM_Vendor_Specific_Control_Mode_Page); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + sb.AppendFormat("\t" + Localization.Vendor_specific_mode_control_0, page.ModeControl); + sb.AppendFormat("\t" + Localization.Vendor_specific_velocity_setting_0, page.VelocitySetting); + + if(!page.EncryptionCapable) + return sb.ToString(); + + sb.AppendLine("\t" + Localization.Drive_supports_encryption); + + if(page.EncryptionEnabled) + sb.AppendLine("\t" + Localization.Drive_has_encryption_enabled); + + return sb.ToString(); + } + +#endregion IBM Mode Page 0x24: Drive Capabilities Control Mode page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/2A.cs b/Aaru.Decoders/SCSI/Modes/2A.cs new file mode 100644 index 000000000..90612a17e --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/2A.cs @@ -0,0 +1,300 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 2A.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MODE PAGE 2Ah: CD-ROM capabilities page. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using System.Text; +using Aaru.CommonTypes.Structs.Devices.SCSI.Modes; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +public static partial class Modes +{ +#region Mode Page 0x2A: CD-ROM capabilities page + + public static string PrettifyModePage_2A(byte[] pageResponse) => + PrettifyModePage_2A(ModePage_2A.Decode(pageResponse)); + + public static string PrettifyModePage_2A(ModePage_2A modePage) + { + if(modePage is null) + return null; + + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_CD_ROM_capabilities_page); + + if(modePage.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + if(modePage.AudioPlay) + sb.AppendLine("\t" + Localization.Drive_can_play_audio); + + if(modePage.Mode2Form1) + sb.AppendLine("\t" + Localization.Drive_can_read_sectors_in_Mode_2_Form_1_format); + + if(modePage.Mode2Form2) + sb.AppendLine("\t" + Localization.Drive_can_read_sectors_in_Mode_2_Form_2_format); + + if(modePage.MultiSession) + sb.AppendLine("\t" + Localization.Drive_supports_multi_session_discs_and_or_Photo_CD); + + if(modePage.CDDACommand) + sb.AppendLine("\t" + Localization.Drive_can_read_digital_audio); + + if(modePage.AccurateCDDA) + sb.AppendLine("\t" + Localization.Drive_can_continue_from_streaming_loss); + + if(modePage.Subchannel) + sb.AppendLine("\t" + Localization.Drive_can_read_uncorrected_and_interleaved_R_W_subchannels); + + if(modePage.DeinterlaveSubchannel) + sb.AppendLine("\t" + Localization.Drive_can_read__deinterleave_and_correct_R_W_subchannels); + + if(modePage.C2Pointer) + sb.AppendLine("\t" + Localization.Drive_supports_C2_pointers); + + if(modePage.UPC) + sb.AppendLine("\t" + Localization.Drive_can_read_Media_Catalogue_Number); + + if(modePage.ISRC) + sb.AppendLine("\t" + Localization.Drive_can_read_ISRC); + + switch(modePage.LoadingMechanism) + { + case 0: + sb.AppendLine("\t" + Localization.Drive_uses_media_caddy); + + break; + case 1: + sb.AppendLine("\t" + Localization.Drive_uses_a_tray); + + break; + case 2: + sb.AppendLine("\t" + Localization.Drive_is_pop_up); + + break; + case 4: + sb.AppendLine("\t" + Localization.Drive_is_a_changer_with_individually_changeable_discs); + + break; + case 5: + sb.AppendLine("\t" + Localization.Drive_is_a_changer_using_cartridges); + + break; + default: + sb.AppendFormat("\t" + Localization.Drive_uses_unknown_loading_mechanism_type__0_, + modePage.LoadingMechanism). + AppendLine(); + + break; + } + + if(modePage.Lock) + sb.AppendLine("\t" + Localization.Drive_can_lock_media); + + if(modePage.PreventJumper) + { + sb.AppendLine("\t" + Localization.Drive_power_ups_locked); + + sb.AppendLine(modePage.LockState + ? "\t" + Localization.Drive_is_locked__media_cannot_be_ejected_or_inserted + : "\t" + Localization.Drive_is_not_locked__media_can_be_ejected_and_inserted); + } + else + { + sb.AppendLine(modePage.LockState + ? "\t" + + Localization.Drive_is_locked__media_cannot_be_ejected__but_if_empty__can_be_inserted + : "\t" + Localization.Drive_is_not_locked__media_can_be_ejected_and_inserted); + } + + if(modePage.Eject) + sb.AppendLine("\t" + Localization.Drive_can_eject_media); + + if(modePage.SeparateChannelMute) + sb.AppendLine("\t" + Localization.Each_channel_can_be_muted_independently); + + if(modePage.SeparateChannelVolume) + sb.AppendLine("\t" + Localization.Each_channel_s_volume_can_be_controlled_independently); + + if(modePage.SupportedVolumeLevels > 0) + { + sb.AppendFormat("\t" + Localization.Drive_supports_0_volume_levels, modePage.SupportedVolumeLevels). + AppendLine(); + } + + if(modePage.BufferSize > 0) + sb.AppendFormat("\t" + Localization.Drive_has_0_Kbyte_of_buffer, modePage.BufferSize).AppendLine(); + + if(modePage.MaximumSpeed > 0) + { + sb.AppendFormat("\t" + Localization.Drive_maximum_reading_speed_is_0_Kbyte_sec, modePage.MaximumSpeed). + AppendLine(); + } + + if(modePage.CurrentSpeed > 0) + { + sb.AppendFormat("\t" + Localization.Drive_current_reading_speed_is_0_Kbyte_sec, modePage.CurrentSpeed). + AppendLine(); + } + + if(modePage.ReadCDR) + { + sb.AppendLine(modePage.WriteCDR + ? "\t" + Localization.Drive_can_read_and_write_CD_R + : "\t" + Localization.Drive_can_read_CD_R); + + if(modePage.Method2) + sb.AppendLine("\t" + Localization.Drive_supports_reading_CD_R_packet_media); + } + + if(modePage.ReadCDRW) + { + sb.AppendLine(modePage.WriteCDRW + ? "\t" + Localization.Drive_can_read_and_write_CD_RW + : "\t" + Localization.Drive_can_read_CD_RW); + } + + if(modePage.ReadDVDROM) + sb.AppendLine("\t" + Localization.Drive_can_read_DVD_ROM); + + if(modePage.ReadDVDR) + { + sb.AppendLine(modePage.WriteDVDR + ? "\t" + Localization.Drive_can_read_and_write_DVD_R + : "\t" + Localization.Drive_can_read_DVD_R); + } + + if(modePage.ReadDVDRAM) + { + sb.AppendLine(modePage.WriteDVDRAM + ? "\t" + Localization.Drive_can_read_and_write_DVD_RAM + : "\t" + Localization.Drive_can_read_DVD_RAM); + } + + if(modePage.Composite) + sb.AppendLine("\t" + Localization.Drive_can_deliver_a_composite_audio_and_video_data_stream); + + if(modePage.DigitalPort1) + sb.AppendLine("\t" + Localization.Drive_supports_IEC_958_digital_output_on_port_1); + + if(modePage.DigitalPort2) + sb.AppendLine("\t" + Localization.Drive_supports_IEC_958_digital_output_on_port_2); + + if(modePage.SDP) + sb.AppendLine("\t" + Localization.Drive_contains_a_changer_that_can_report_the_exact_contents_of_the_slots); + + if(modePage.CurrentWriteSpeedSelected > 0) + { + switch(modePage.RotationControlSelected) + { + case 0: + sb.AppendFormat("\t" + Localization.Drive_current_writing_speed_is_0_Kbyte_sec_in_CLV_mode, + modePage.CurrentWriteSpeedSelected). + AppendLine(); + + break; + case 1: + sb.AppendFormat("\t" + Localization.Drive_current_writing_speed_is_0_Kbyte_sec_in_pure_CAV_mode, + modePage.CurrentWriteSpeedSelected). + AppendLine(); + + break; + } + } + else + { + if(modePage.MaxWriteSpeed > 0) + { + sb.AppendFormat("\t" + Localization.Drive_maximum_writing_speed_is_0_Kbyte_sec, modePage.MaxWriteSpeed). + AppendLine(); + } + + if(modePage.CurrentWriteSpeed > 0) + { + sb.AppendFormat("\t" + Localization.Drive_current_writing_speed_is_0_Kbyte_sec, + modePage.CurrentWriteSpeed). + AppendLine(); + } + } + + if(modePage.WriteSpeedPerformanceDescriptors != null) + { + foreach(ModePage_2A_WriteDescriptor descriptor in + modePage.WriteSpeedPerformanceDescriptors.Where(descriptor => descriptor.WriteSpeed > 0)) + { + switch(descriptor.RotationControl) + { + case 0: + sb.AppendFormat("\t" + Localization.Drive_supports_writing_at_0_Kbyte_sec_in_CLV_mode, + descriptor.WriteSpeed). + AppendLine(); + + break; + case 1: + sb.AppendFormat("\t" + Localization.Drive_supports_writing_at_is_0_Kbyte_sec_in_pure_CAV_mode, + descriptor.WriteSpeed). + AppendLine(); + + break; + } + } + } + + if(modePage.TestWrite) + sb.AppendLine("\t" + Localization.Drive_supports_test_writing); + + if(modePage.ReadBarcode) + sb.AppendLine("\t" + Localization.Drive_can_read_barcode); + + if(modePage.SCC) + sb.AppendLine("\t" + Localization.Drive_can_read_both_sides_of_a_disc); + + if(modePage.LeadInPW) + sb.AppendLine("\t" + Localization.Drive_an_read_raw_R_W_subchannel_from_the_Lead_In); + + if(modePage.CMRSupported == 1) + sb.AppendLine("\t" + Localization.Drive_supports_DVD_CSS_and_or_DVD_CPPM); + + if(modePage.BUF) + sb.AppendLine("\t" + Localization.Drive_supports_buffer_under_run_free_recording); + + return sb.ToString(); + } + +#endregion Mode Page 0x2A: CD-ROM capabilities page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/2F_IBM.cs b/Aaru.Decoders/SCSI/Modes/2F_IBM.cs new file mode 100644 index 000000000..5e5762159 --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/2F_IBM.cs @@ -0,0 +1,200 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 2F_IBM.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes IBM MODE PAGE 2Fh: Behaviour Configuration Mode page. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "UnassignedField.Global")] +public static partial class Modes +{ +#region IBM Mode Page 0x2F: Behaviour Configuration Mode page + + public struct IBM_ModePage_2F + { + /// Parameters can be saved + public bool PS; + public byte FenceBehaviour; + public byte CleanBehaviour; + public byte WORMEmulation; + public byte SenseDataBehaviour; + public bool CCDM; + public bool DDEOR; + public bool CLNCHK; + public byte FirmwareUpdateBehaviour; + public byte UOE_D; + public byte UOE_F; + public byte UOE_C; + } + + public static IBM_ModePage_2F? DecodeIBMModePage_2F(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x2F) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length < 8) + return null; + + return new IBM_ModePage_2F + { + PS = (pageResponse[0] & 0x80) == 0x80, + FenceBehaviour = pageResponse[2], + CleanBehaviour = pageResponse[3], + WORMEmulation = pageResponse[4], + SenseDataBehaviour = pageResponse[5], + CCDM = (pageResponse[6] & 0x04) == 0x04, + DDEOR = (pageResponse[6] & 0x02) == 0x02, + CLNCHK = (pageResponse[6] & 0x01) == 0x01, + FirmwareUpdateBehaviour = pageResponse[7], + UOE_C = (byte)((pageResponse[8] & 0x30) >> 4), + UOE_F = (byte)((pageResponse[8] & 0x0C) >> 2) + }; + } + + public static string PrettifyIBMModePage_2F(byte[] pageResponse) => + PrettifyIBMModePage_2F(DecodeIBMModePage_2F(pageResponse)); + + public static string PrettifyIBMModePage_2F(IBM_ModePage_2F? modePage) + { + if(!modePage.HasValue) + return null; + + IBM_ModePage_2F page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.IBM_Behaviour_Configuration_Mode_Page); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + switch(page.FenceBehaviour) + { + case 0: + sb.AppendLine("\t" + Localization.Fence_behaviour_is_normal); + + break; + case 1: + sb.AppendLine("\t" + Localization.Panic_fence_behaviour_is_enabled); + + break; + default: + sb.AppendFormat("\t" + Localization.Unknown_fence_behaviour_code_0, page.FenceBehaviour).AppendLine(); + + break; + } + + switch(page.CleanBehaviour) + { + case 0: + sb.AppendLine("\t" + Localization.Cleaning_behaviour_is_normal); + + break; + case 1: + sb.AppendLine("\t" + Localization.Drive_will_periodically_request_cleaning); + + break; + default: + sb.AppendFormat("\t" + Localization.Unknown_cleaning_behaviour_code_0, page.CleanBehaviour). + AppendLine(); + + break; + } + + switch(page.WORMEmulation) + { + case 0: + sb.AppendLine("\t" + Localization.WORM_emulation_is_disabled); + + break; + case 1: + sb.AppendLine("\t" + Localization.WORM_emulation_is_enabled); + + break; + default: + sb.AppendFormat("\t" + Localization.Unknown_WORM_emulation_code_0, page.WORMEmulation).AppendLine(); + + break; + } + + switch(page.SenseDataBehaviour) + { + case 0: + sb.AppendLine("\t" + Localization.Uses_35_bytes_sense_data); + + break; + case 1: + sb.AppendLine("\t" + Localization.Uses_96_bytes_sense_data); + + break; + default: + sb.AppendFormat("\t" + Localization.Unknown_sense_data_behaviour_code_0, page.WORMEmulation). + AppendLine(); + + break; + } + + if(page.CLNCHK) + sb.AppendLine("\t" + Localization.Drive_will_set_Check_Condition_when_cleaning_is_needed); + + if(page.DDEOR) + sb.AppendLine("\t" + Localization.No_deferred_error_will_be_reported_to_a_rewind_command); + + if(page.CCDM) + sb.AppendLine("\t" + Localization.Drive_will_set_Check_Condition_when_the_criteria_for_Dead_Media_is_met); + + if(page.FirmwareUpdateBehaviour > 0) + sb.AppendLine("\t" + Localization.Drive_will_not_accept_downlevel_firmware_via_an_FMR_tape); + + if(page.UOE_C == 1) + sb.AppendLine("\t" + Localization.Drive_will_eject_cleaning_cartridges_on_error); + + if(page.UOE_F == 1) + sb.AppendLine("\t" + Localization.Drive_will_eject_firmware_cartridges_on_error); + + if(page.UOE_D == 1) + sb.AppendLine("\t" + Localization.Drive_will_eject_data_cartridges_on_error); + + return sb.ToString(); + } + +#endregion IBM Mode Page 0x2F: Behaviour Configuration Mode page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/30_Apple.cs b/Aaru.Decoders/SCSI/Modes/30_Apple.cs new file mode 100644 index 000000000..5e2fd786c --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/30_Apple.cs @@ -0,0 +1,69 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 30_Apple.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes Apple MODE PAGE 30h: Apple OEM String. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Linq; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ +#region Apple Mode Page 0x30: Apple OEM String + + static readonly byte[] AppleOEMString = "APPLE COMPUTER, INC."u8.ToArray(); + + public static bool IsAppleModePage_30(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return false; + + if((pageResponse?[0] & 0x3F) != 0x30) + return false; + + if(pageResponse[1] + 2 != pageResponse.Length) + return false; + + if(pageResponse.Length != 30) + return false; + + var str = new byte[20]; + Array.Copy(pageResponse, 10, str, 0, 20); + + return AppleOEMString.SequenceEqual(str); + } + +#endregion Apple Mode Page 0x30: Apple OEM String +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/3B_HP.cs b/Aaru.Decoders/SCSI/Modes/3B_HP.cs new file mode 100644 index 000000000..4e4bee5b9 --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/3B_HP.cs @@ -0,0 +1,113 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 3B_HP.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes HP MODE PAGE 3Bh: Serial Number Override Mode page. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Text; +using Aaru.Helpers; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ +#region HP Mode Page 0x3B: Serial Number Override Mode page + + public struct HP_ModePage_3B + { + /// Parameters can be saved + public bool PS; + public byte MSN; + public byte[] SerialNumber; + } + + public static HP_ModePage_3B? DecodeHPModePage_3B(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x3B) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length != 16) + return null; + + var decoded = new HP_ModePage_3B(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.MSN = (byte)(pageResponse[2] & 0x03); + decoded.SerialNumber = new byte[10]; + Array.Copy(pageResponse, 6, decoded.SerialNumber, 0, 10); + + return decoded; + } + + public static string PrettifyHPModePage_3B(byte[] pageResponse) => + PrettifyHPModePage_3B(DecodeHPModePage_3B(pageResponse)); + + public static string PrettifyHPModePage_3B(HP_ModePage_3B? modePage) + { + if(!modePage.HasValue) + return null; + + HP_ModePage_3B page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.HP_Serial_Number_Override_Mode_Page); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + switch(page.MSN) + { + case 1: + sb.AppendLine("\t" + Localization.Serial_number_is_the_manufacturer_default_value); + + break; + case 3: + sb.AppendLine("\t" + Localization.Serial_number_is_not_the_manufacturer_default_value); + + break; + } + + sb.AppendFormat("\t" + Localization.Serial_number_0, StringHandlers.CToString(page.SerialNumber)).AppendLine(); + + return sb.ToString(); + } + +#endregion HP Mode Page 0x3B: Serial Number Override Mode page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/3C_HP.cs b/Aaru.Decoders/SCSI/Modes/3C_HP.cs new file mode 100644 index 000000000..58a0f3097 --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/3C_HP.cs @@ -0,0 +1,166 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 3C_HP.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes HP MODE PAGE 3Ch: Device Time Mode page. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Text; +using Aaru.Helpers; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ +#region HP Mode Page 0x3C: Device Time Mode page + + public struct HP_ModePage_3C + { + /// Parameters can be saved + public bool PS; + public bool LT; + public bool WT; + public bool PT; + public ushort CurrentPowerOn; + public uint PowerOnTime; + public bool UTC; + public bool NTP; + public uint WorldTime; + public byte LibraryHours; + public byte LibraryMinutes; + public byte LibrarySeconds; + public uint CumulativePowerOn; + } + + public static HP_ModePage_3C? DecodeHPModePage_3C(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x3C) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length != 36) + return null; + + var decoded = new HP_ModePage_3C(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.LT |= (pageResponse[2] & 0x04) == 0x04; + decoded.WT |= (pageResponse[2] & 0x02) == 0x02; + decoded.PT |= (pageResponse[2] & 0x01) == 0x01; + decoded.CurrentPowerOn = (ushort)((pageResponse[6] << 8) + pageResponse[7]); + + decoded.PowerOnTime = (uint)((pageResponse[8] << 24) + + (pageResponse[9] << 16) + + (pageResponse[10] << 8) + + pageResponse[11]); + + decoded.UTC |= (pageResponse[14] & 0x02) == 0x02; + decoded.NTP |= (pageResponse[14] & 0x01) == 0x01; + + decoded.WorldTime = (uint)((pageResponse[16] << 24) + + (pageResponse[17] << 16) + + (pageResponse[18] << 8) + + pageResponse[19]); + + decoded.LibraryHours = pageResponse[23]; + decoded.LibraryMinutes = pageResponse[24]; + decoded.LibrarySeconds = pageResponse[25]; + + decoded.CumulativePowerOn = (uint)((pageResponse[32] << 24) + + (pageResponse[33] << 16) + + (pageResponse[34] << 8) + + pageResponse[35]); + + return decoded; + } + + public static string PrettifyHPModePage_3C(byte[] pageResponse) => + PrettifyHPModePage_3C(DecodeHPModePage_3C(pageResponse)); + + public static string PrettifyHPModePage_3C(HP_ModePage_3C? modePage) + { + if(!modePage.HasValue) + return null; + + HP_ModePage_3C page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.HP_Device_Time_Mode_Page); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + if(page.PT) + { + sb.AppendFormat("\t" + Localization.Drive_has_been_powered_up_0_times, page.CurrentPowerOn); + + sb.AppendFormat("\t" + Localization.Drive_has_been_powered_up_since_0_seconds_ago_this_time, + TimeSpan.FromSeconds(page.PowerOnTime)). + AppendLine(); + + sb.AppendFormat("\t" + Localization.Drive_has_been_powered_up_a_total_of_0_seconds, + TimeSpan.FromSeconds(page.CumulativePowerOn)). + AppendLine(); + } + + if(page.WT) + { + sb.AppendFormat("\t" + Localization.Drive_date_time_is_0, + DateHandlers.UnixUnsignedToDateTime(page.WorldTime)). + AppendLine(); + + if(page.UTC) + sb.AppendLine("\t" + Localization.Drive_time_is_UTC); + + if(page.NTP) + sb.AppendLine("\t" + Localization.Drive_time_is_synchronized_with_a_NTP_source); + } + + if(page.LT) + { + sb.AppendFormat("\t" + Localization.Library_time_is_0, + new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, page.LibraryHours, + page.LibraryMinutes, page.LibrarySeconds)). + AppendLine(); + } + + return sb.ToString(); + } + +#endregion HP Mode Page 0x3C: Device Time Mode page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/3D_HP.cs b/Aaru.Decoders/SCSI/Modes/3D_HP.cs new file mode 100644 index 000000000..c76eca088 --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/3D_HP.cs @@ -0,0 +1,110 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 3D_HP.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes HP MODE PAGE 3Dh: Extended Reset Mode page. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ +#region HP Mode Page 0x3D: Extended Reset Mode page + + public struct HP_ModePage_3D + { + /// Parameters can be saved + public bool PS; + public byte ResetBehaviour; + } + + public static HP_ModePage_3D? DecodeHPModePage_3D(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x3D) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length != 4) + return null; + + var decoded = new HP_ModePage_3D(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.ResetBehaviour = (byte)(pageResponse[2] & 0x03); + + return decoded; + } + + public static string PrettifyHPModePage_3D(byte[] pageResponse) => + PrettifyHPModePage_3D(DecodeHPModePage_3D(pageResponse)); + + public static string PrettifyHPModePage_3D(HP_ModePage_3D? modePage) + { + if(!modePage.HasValue) + return null; + + HP_ModePage_3D page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.HP_Extended_Reset_Mode_Page); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + switch(page.ResetBehaviour) + { + case 0: + sb.AppendLine("\t" + Localization.Normal_reset_behaviour); + + break; + case 1: + sb.AppendLine("\t" + Localization.Drive_will_flush_and_position_itself_on_a_LUN_or_target_reset); + + break; + case 2: + sb.AppendLine("\t" + Localization.Drive_will_maintain_position_on_a_LUN_or_target_reset); + + break; + } + + return sb.ToString(); + } + +#endregion HP Mode Page 0x3D: Extended Reset Mode page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/3D_IBM.cs b/Aaru.Decoders/SCSI/Modes/3D_IBM.cs new file mode 100644 index 000000000..ee25c8d1d --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/3D_IBM.cs @@ -0,0 +1,96 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 3D_IBM.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes IBM MODE PAGE 3D: Behaviour Configuration Mode page. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ +#region IBM Mode Page 0x3D: Behaviour Configuration Mode page + + public struct IBM_ModePage_3D + { + /// Parameters can be saved + public bool PS; + public ushort NumberOfWraps; + } + + public static IBM_ModePage_3D? DecodeIBMModePage_3D(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x3D) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length != 5) + return null; + + var decoded = new IBM_ModePage_3D(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.NumberOfWraps = (ushort)((pageResponse[3] << 8) + pageResponse[4]); + + return decoded; + } + + public static string PrettifyIBMModePage_3D(byte[] pageResponse) => + PrettifyIBMModePage_3D(DecodeIBMModePage_3D(pageResponse)); + + public static string PrettifyIBMModePage_3D(IBM_ModePage_3D? modePage) + { + if(!modePage.HasValue) + return null; + + IBM_ModePage_3D page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.IBM_LEOT_Mode_Page); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + sb.AppendFormat("\t" + Localization._0_wraps, page.NumberOfWraps).AppendLine(); + + return sb.ToString(); + } + +#endregion IBM Mode Page 0x3D: Behaviour Configuration Mode page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/3E_Fujitsu.cs b/Aaru.Decoders/SCSI/Modes/3E_Fujitsu.cs new file mode 100644 index 000000000..f9f9f02c0 --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/3E_Fujitsu.cs @@ -0,0 +1,155 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 3E_Fujitsu.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes Fujitsu MODE PAGE 3Eh: Verify Control page. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Text; +using Aaru.CommonTypes.Structs.Devices.SCSI; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +public static partial class Modes +{ +#region Fujitsu Mode Page 0x3E: Verify Control page + + [SuppressMessage("ReSharper", "UnusedMember.Global")] + public enum Fujitsu_VerifyModes : byte + { + /// Always verify after writing + Always = 0, + /// Never verify after writing + Never = 1, + /// Verify after writing depending on condition + Depends = 2, + Reserved = 4 + } + + public struct Fujitsu_ModePage_3E + { + /// Parameters can be saved + public bool PS; + /// If set, AV data support mode is applied + public bool audioVisualMode; + /// If set the test write operation is restricted + public bool streamingMode; + public byte Reserved1; + /// Verify mode for WRITE commands + public Fujitsu_VerifyModes verifyMode; + public byte Reserved2; + /// Device type provided in response to INQUIRY + public PeripheralDeviceTypes devType; + public byte[] Reserved3; + } + + public static Fujitsu_ModePage_3E? DecodeFujitsuModePage_3E(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x3E) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length != 8) + return null; + + var decoded = new Fujitsu_ModePage_3E(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + + decoded.audioVisualMode |= (pageResponse[2] & 0x80) == 0x80; + decoded.streamingMode |= (pageResponse[2] & 0x40) == 0x40; + decoded.Reserved1 = (byte)((pageResponse[2] & 0x3C) >> 2); + decoded.verifyMode = (Fujitsu_VerifyModes)(pageResponse[2] & 0x03); + + decoded.Reserved2 = (byte)((pageResponse[3] & 0xE0) >> 5); + decoded.devType = (PeripheralDeviceTypes)(pageResponse[3] & 0x1F); + + decoded.Reserved3 = new byte[4]; + Array.Copy(pageResponse, 4, decoded.Reserved3, 0, 4); + + return decoded; + } + + public static string PrettifyFujitsuModePage_3E(byte[] pageResponse) => + PrettifyFujitsuModePage_3E(DecodeFujitsuModePage_3E(pageResponse)); + + public static string PrettifyFujitsuModePage_3E(Fujitsu_ModePage_3E? modePage) + { + if(!modePage.HasValue) + return null; + + Fujitsu_ModePage_3E page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.Fujitsu_Verify_Control_Page); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + if(page.audioVisualMode) + sb.AppendLine("\t" + Localization.Audio_Visual_data_support_mode_is_applied); + + if(page.streamingMode) + sb.AppendLine("\t" + Localization.Test_write_operation_is_restricted_during_read_or_write_operations); + + switch(page.verifyMode) + { + case Fujitsu_VerifyModes.Always: + sb.AppendLine("\t" + Localization.Always_apply_the_verify_operation); + + break; + case Fujitsu_VerifyModes.Never: + sb.AppendLine("\t" + Localization.Never_apply_the_verify_operation); + + break; + case Fujitsu_VerifyModes.Depends: + sb.AppendLine("\t" + Localization.Apply_the_verify_operation_depending_on_the_condition); + + break; + } + + sb.AppendFormat("\t" + Localization.The_device_type_that_would_be_provided_in_the_INQUIRY_response_is_0, + page.devType). + AppendLine(); + + return sb.ToString(); + } + +#endregion Fujitsu Mode Page 0x3E: Verify Control page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/3E_HP.cs b/Aaru.Decoders/SCSI/Modes/3E_HP.cs new file mode 100644 index 000000000..9797c9c0c --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/3E_HP.cs @@ -0,0 +1,103 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : 3E_HP.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes HP MODE PAGE 3Eh: CD-ROM Emulation/Disaster Recovery Mode page. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ +#region HP Mode Page 0x3E: CD-ROM Emulation/Disaster Recovery Mode page + + public struct HP_ModePage_3E + { + /// Parameters can be saved + public bool PS; + public bool NonAuto; + public bool CDmode; + } + + public static HP_ModePage_3E? DecodeHPModePage_3E(byte[] pageResponse) + { + if((pageResponse?[0] & 0x40) == 0x40) + return null; + + if((pageResponse?[0] & 0x3F) != 0x3E) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length != 4) + return null; + + var decoded = new HP_ModePage_3E(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.NonAuto |= (pageResponse[2] & 0x02) == 0x02; + decoded.CDmode |= (pageResponse[2] & 0x01) == 0x01; + + return decoded; + } + + public static string PrettifyHPModePage_3E(byte[] pageResponse) => + PrettifyHPModePage_3E(DecodeHPModePage_3E(pageResponse)); + + public static string PrettifyHPModePage_3E(HP_ModePage_3E? modePage) + { + if(!modePage.HasValue) + return null; + + HP_ModePage_3E page = modePage.Value; + var sb = new StringBuilder(); + + sb.AppendLine(Localization.HP_CD_ROM_Emulation_Disaster_Recovery_Mode_Page); + + if(page.PS) + sb.AppendLine("\t" + Localization.Parameters_can_be_saved); + + sb.AppendLine(page.CDmode + ? "\t" + Localization.Drive_is_emulating_a_CD_ROM_drive + : "\t" + Localization.Drive_is_not_emulating_a_CD_ROM_drive); + + if(page.NonAuto) + sb.AppendLine("\t" + Localization.Drive_will_not_exit_emulation_automatically); + + return sb.ToString(); + } + +#endregion HP Mode Page 0x3E: CD-ROM Emulation/Disaster Recovery Mode page +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/Headers.cs b/Aaru.Decoders/SCSI/Modes/Headers.cs new file mode 100644 index 000000000..090a5abcb --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/Headers.cs @@ -0,0 +1,1734 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : Headers.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Prettifies SCSI MODE headers. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; +using System.Text; +using Aaru.CommonTypes.Structs.Devices.SCSI; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ + public static string GetMediumTypeDescription(MediumTypes type) => type switch + { + MediumTypes.ECMA54 => Localization. + GetMediumTypeDescription_ECMA_54, + MediumTypes.ECMA59 => Localization. + GetMediumTypeDescription_ECMA_59, + MediumTypes.ECMA69 => Localization. + GetMediumTypeDescription_ECMA_69, + MediumTypes.ECMA66 => Localization. + GetMediumTypeDescription_ECMA_66, + MediumTypes.ECMA70 => Localization. + GetMediumTypeDescription_ECMA_70, + MediumTypes.ECMA78 => Localization. + GetMediumTypeDescription_ECMA_78, + MediumTypes.ECMA99 => Localization. + GetMediumTypeDescription_ECMA_99, + MediumTypes.ECMA100 => Localization. + GetMediumTypeDescription_ECMA_100, + + // Most probably they will never appear, but magneto-opticals use these codes + /* + case MediumTypes.Unspecified_SS: + return "Unspecified single sided flexible disk"; + case MediumTypes.Unspecified_DS: + return "Unspecified double sided flexible disk"; + */ + MediumTypes.X3_73 => Localization. + GetMediumTypeDescription_X3_73, + MediumTypes.X3_73_DS => Localization. + GetMediumTypeDescription_X3_73_DS, + MediumTypes.X3_82 => Localization. + GetMediumTypeDescription_X3_82, + MediumTypes.Type3Floppy => Localization. + GetMediumTypeDescription_Type3Floppy, + MediumTypes.HDFloppy => Localization. + GetMediumTypeDescription_HDFloppy, + MediumTypes.ReadOnly => Localization. + GetMediumTypeDescription_ReadOnly, + MediumTypes.WORM => Localization. + GetMediumTypeDescription_WORM, + MediumTypes.Erasable => Localization. + GetMediumTypeDescription_Erasable, + MediumTypes.RO_WORM => Localization. + GetMediumTypeDescription_RO_WORM, + + // These magneto-opticals were never manufactured + /* + case MediumTypes.RO_RW: + return "a combination of read-only and erasable optical"; + break; + case MediumTypes.WORM_RW: + return "a combination of write-once and erasable optical"; + */ + MediumTypes.DOW => Localization. + GetMediumTypeDescription_DOW, + MediumTypes.HiMD => Localization. + GetMediumTypeDescription_HiMD, + _ => string. + Format(Localization.Unknown_medium_type_0, + (byte)type) + }; + + public static string PrettifyModeHeader(ModeHeader? header, PeripheralDeviceTypes deviceType) + { + if(!header.HasValue) + return null; + + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SCSI_Mode_Sense_Header); + + switch(deviceType) + { + #region Direct access device mode header + + case PeripheralDeviceTypes.DirectAccess: + { + if(header.Value.MediumType != MediumTypes.Default) + { + sb.AppendFormat("\t" + Localization.Medium_is_0, GetMediumTypeDescription(header.Value.MediumType)). + AppendLine(); + } + + if(header.Value.WriteProtected) + sb.AppendLine("\t" + Localization.Medium_is_write_protected); + + if(header.Value.DPOFUA) + sb.AppendLine("\t" + Localization.Drive_supports_DPO_and_FUA_bits); + + if(header.Value.BlockDescriptors != null) + { + foreach(BlockDescriptor descriptor in header.Value.BlockDescriptors) + { + var density = ""; + + switch(descriptor.Density) + { + case DensityType.Default: + break; + case DensityType.Flux7958: + density = Localization._7958_ftprad; + + break; + case DensityType.Flux13262: + density = Localization._13262_ftprad; + + break; + case DensityType.Flux15916: + density = Localization._15916_ftprad; + + break; + default: + density = string.Format(Localization.with_unknown_density_code_0, + (byte)descriptor.Density); + + break; + } + + if(density != "") + { + if(descriptor.Blocks == 0) + { + sb.AppendFormat("\t" + Localization.All_remaining_blocks_have_0_and_are_1_bytes_each, + density, descriptor.BlockLength). + AppendLine(); + } + else + { + sb.AppendFormat("\t" + Localization._0_blocks_have_1_and_are_2_bytes_each, + descriptor.Blocks, density, descriptor.BlockLength). + AppendLine(); + } + } + else if(descriptor.Blocks == 0) + { + sb.AppendFormat("\t" + Localization.All_remaining_blocks_are_0_bytes_each, + descriptor.BlockLength). + AppendLine(); + } + else + { + sb.AppendFormat("\t" + Localization._0_blocks_are_1_bytes_each, descriptor.Blocks, + descriptor.BlockLength). + AppendLine(); + } + } + } + + break; + } + + #endregion Direct access device mode header + + #region Sequential access device mode header + + case PeripheralDeviceTypes.SequentialAccess: + { + switch(header.Value.BufferedMode) + { + case 0: + sb.AppendLine("\t" + Localization.Device_writes_directly_to_media); + + break; + case 1: + sb.AppendLine("\t" + Localization.Device_uses_a_write_cache); + + break; + case 2: + sb.AppendLine("\t" + + Localization.Device_uses_a_write_cache_but_doesn_t_return_until_cache_is_flushed); + + break; + default: + sb.AppendFormat("\t" + Localization.Unknown_buffered_mode_code_0, header.Value.BufferedMode). + AppendLine(); + + break; + } + + if(header.Value.Speed == 0) + sb.AppendLine("\t" + Localization.Device_uses_default_speed); + else + sb.AppendFormat("\t" + Localization.Device_uses_speed_0, header.Value.Speed).AppendLine(); + + if(header.Value.WriteProtected) + sb.AppendLine("\t" + Localization.Medium_is_write_protected); + + string medium = header.Value.MediumType switch + { + MediumTypes.Default => Localization.MediumType_undefined, + MediumTypes.Tape12 => Localization.MediumType_Tape12, + MediumTypes.Tape24 => Localization.MediumType_Tape24, + MediumTypes.LTOWORM => Localization.MediumType_LTOWORM, + MediumTypes.LTO => Localization.MediumType_LTO, + MediumTypes.LTO2 => Localization.MediumType_LTO2, + MediumTypes.DC2900SL => Localization.MediumType_DC2900SL, + MediumTypes.MLR1 => Localization.MediumType_MLR1, + MediumTypes.DC9200 => Localization.MediumType_DC9200, + MediumTypes.DAT72 => Localization.MediumType_DAT72, + MediumTypes.LTO3 => Localization.MediumType_LTO3, + MediumTypes.LTO3WORM => Localization.MediumType_LTO3WORM, + MediumTypes.DDSCleaning => Localization.MediumType_DDSCleaning, + MediumTypes.SLR32 => Localization.MediumType_SLR32, + MediumTypes.SLRtape50 => Localization.MediumType_SLRtape50, + MediumTypes.LTO4 => Localization.MediumType_LTO4, + MediumTypes.LTO4WORM => Localization.MediumType_LTO4WORM, + MediumTypes.SLRtape50SL => Localization.MediumType_SLRtape50SL, + MediumTypes.SLR32SL => Localization.MediumType_SLR32SL, + MediumTypes.SLR5 => Localization.MediumType_SLR5, + MediumTypes.SLR5SL => Localization.MediumType_SLR5SL, + MediumTypes.LTO5 => Localization.MediumType_LTO5, + MediumTypes.LTO5WORM => Localization.MediumType_LTO5WORM, + MediumTypes.SLRtape7 => Localization.MediumType_SLRtape7, + MediumTypes.SLRtape7SL => Localization.MediumType_SLRtape7SL, + MediumTypes.SLRtape24 => Localization.MediumType_SLRtape24, + MediumTypes.SLRtape24SL => Localization.MediumType_SLRtape24SL, + MediumTypes.LTO6 => Localization.MediumType_LTO6, + MediumTypes.LTO6WORM => Localization.MediumType_LTO6WORM, + MediumTypes.SLRtape140 => Localization.MediumType_SLRtape140, + MediumTypes.SLRtape40 => Localization.MediumType_SLRtape40, + MediumTypes.SLRtape60 => Localization.MediumType_SLRtape60, + MediumTypes.SLRtape100 => Localization.MediumType_SLRtape100, + MediumTypes.SLR40_60_100 => Localization.MediumType_SLR40_60_100, + MediumTypes.LTO7 => Localization.MediumType_LTO7, + MediumTypes.LTO7WORM => Localization.MediumType_LTO7WORM, + MediumTypes.LTOCD => Localization.MediumType_LTO, + MediumTypes.Exatape15m => Localization.MediumType_Exatape15m, + MediumTypes.CT1 => Localization.MediumType_CT1, + MediumTypes.Exatape54m => Localization.MediumType_Exatape54m, + MediumTypes.Exatape80m => Localization.MediumType_Exatape80m, + MediumTypes.Exatape106m => Localization.MediumType_Exatape106m, + MediumTypes.Exatape106mXL => Localization.MediumType_Exatape106mXL, + MediumTypes.SDLT2 => Localization.MediumType_SDLT2, + MediumTypes.VStapeI => Localization.MediumType_VStapeI, + MediumTypes.DLTtapeS4 => Localization.MediumType_DLTtapeS4, + MediumTypes.Travan7 => Localization.MediumType_Travan7, + MediumTypes.Exatape22m => Localization.MediumType_Exatape22m, + MediumTypes.Exatape40m => Localization.MediumType_Exatape40m, + MediumTypes.Exatape76m => Localization.MediumType_Exatape76m, + MediumTypes.Exatape112m => Localization.MediumType_Exatape112m, + MediumTypes.Exatape22mAME => Localization.MediumType_Exatape22mAME, + MediumTypes.Exatape170m => Localization.MediumType_Exatape170m, + MediumTypes.Exatape125m => Localization.MediumType_Exatape125m, + MediumTypes.Exatape45m => Localization.MediumType_Exatape45m, + MediumTypes.Exatape225m => Localization.MediumType_Exatape225m, + MediumTypes.Exatape150m => Localization.MediumType_Exatape150m, + MediumTypes.Exatape75m => Localization.MediumType_Exatape75m, + _ => string.Format(Localization.Unknown_medium_type_0, + (byte)header.Value.MediumType) + }; + + sb.AppendFormat("\t" + Localization.Medium_is_0, medium).AppendLine(); + + if(header.Value.BlockDescriptors != null) + { + foreach(BlockDescriptor descriptor in header.Value.BlockDescriptors) + { + var density = ""; + + switch(header.Value.MediumType) + { + case MediumTypes.Default: + { + switch(descriptor.Density) + { + case DensityType.Default: + break; + case DensityType.ECMA62: + density = Localization.ECMA62; + + break; + case DensityType.ECMA62_Phase: + density = Localization.ECMA62_Phase; + + break; + case DensityType.ECMA62_GCR: + density = Localization.ECMA62_GCR; + + break; + case DensityType.ECMA79: + density = Localization.ECMA79; + + break; + case DensityType.IBM3480: + density = Localization.IBM3480; + + break; + case DensityType.ECMA46: + density = Localization.ECMA46; + + break; + case DensityType.ECMA98: + density = Localization.ECMA98; + + break; + case DensityType.X3_136: + density = Localization.X3_136; + + break; + case DensityType.X3_157: + density = Localization.X3_157; + + break; + case DensityType.X3_158: + density = Localization.X3_158; + + break; + case DensityType.X3B5_86: + density = Localization.X3B5_86; + + break; + case DensityType.HiTC1: + density = Localization.HiTC1; + + break; + case DensityType.HiTC2: + density = Localization.HiTC2; + + break; + case DensityType.QIC120: + density = Localization.QIC120; + + break; + case DensityType.QIC150: + density = Localization.QIC150; + + break; + case DensityType.QIC320: + density = Localization.QIC320; + + break; + case DensityType.QIC1350: + density = Localization.QIC1350; + + break; + case DensityType.X3B5_88: + density = Localization.X3B5_88; + + break; + case DensityType.X3_202: + density = Localization.X3_202; + + break; + case DensityType.ECMA_TC17: + density = Localization.ECMA_TC17; + + break; + case DensityType.X3_193: + density = Localization.X3_193; + + break; + case DensityType.X3B5_91: + density = Localization.X3B5_91; + + break; + case DensityType.QIC11: + density = Localization.QIC11; + + break; + case DensityType.IBM3490E: + density = Localization.IBM3490E; + + break; + case DensityType.LTO1: + //case DensityType.SAIT1: + density = Localization.LTO_or_SAIT1; + + break; + case DensityType.LTO2Old: + density = Localization.MediumType_LTO2; + + break; + case DensityType.LTO2: + //case DensityType.T9840: + density = Localization.LTO2_or_T9840; + + break; + case DensityType.T9940: + density = Localization.T9940; + + break; + case DensityType.LTO3: + //case DensityType.T9940: + density = Localization.LTO3_or_T9940; + + break; + case DensityType.T9840C: + density = Localization.T9840C; + + break; + case DensityType.LTO4: + //case DensityType.T9840D: + density = Localization.LTO4_or_T9840D; + + break; + case DensityType.T10000A: + density = Localization.T10000A; + + break; + case DensityType.T10000B: + density = Localization.T10000B; + + break; + case DensityType.T10000C: + density = Localization.T10000C; + + break; + case DensityType.T10000D: + density = Localization.T10000D; + + break; + case DensityType.AIT1: + density = Localization.AIT1; + + break; + case DensityType.AIT2: + density = Localization.AIT2; + + break; + case DensityType.AIT3: + density = Localization.AIT3; + + break; + case DensityType.DDS2: + density = Localization.DDS2; + + break; + case DensityType.DDS3: + density = Localization.DDS3; + + break; + case DensityType.DDS4: + density = Localization.DDS4; + + break; + default: + density = string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density); + + break; + } + } + + break; + case MediumTypes.LTOWORM: + { + density = descriptor.Density switch + { + DensityType.Default => Localization.LTO_Ultrium_cleaning_cartridge, + DensityType.LTO3 => Localization.MediumType_LTO3WORM, + DensityType.LTO4 => Localization.MediumType_LTO4WORM, + DensityType.LTO5 => Localization.MediumType_LTO5WORM, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.LTO: + { + density = descriptor.Density switch + { + DensityType.LTO1 => Localization.MediumType_LTO, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.LTO2: + { + density = descriptor.Density switch + { + DensityType.LTO2 => Localization.MediumType_LTO2, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.DDS3: + { + density = descriptor.Density switch + { + DensityType.Default => Localization.MLR1_26GB, + DensityType.DDS3 => Localization.DDS3, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.DDS4: + { + density = descriptor.Density switch + { + DensityType.Default => Localization.DC9200, + DensityType.DDS4 => Localization.DDS4, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.DAT72: + { + density = descriptor.Density switch + { + DensityType.DAT72 => Localization.MediumType_DAT72, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.LTO3: + case MediumTypes.LTO3WORM: + { + density = descriptor.Density switch + { + DensityType.LTO3 => Localization.MediumType_LTO3, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.DDSCleaning: + { + density = descriptor.Density switch + { + DensityType.Default => Localization.MediumType_DDSCleaning, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.LTO4: + case MediumTypes.LTO4WORM: + { + density = descriptor.Density switch + { + DensityType.LTO4 => Localization.MediumType_LTO4, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.LTO5: + case MediumTypes.LTO5WORM: + { + density = descriptor.Density switch + { + DensityType.LTO5 => Localization.MediumType_LTO5, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.LTO6: + case MediumTypes.LTO6WORM: + { + density = descriptor.Density switch + { + DensityType.LTO6 => Localization.MediumType_LTO6, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.LTO7: + case MediumTypes.LTO7WORM: + { + density = descriptor.Density switch + { + DensityType.LTO7 => Localization.MediumType_LTO7, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.LTOCD: + { + density = descriptor.Density switch + { + DensityType.LTO2 => Localization.LTO2_CDemu, + DensityType.LTO3 => Localization.LTO3_CDemu, + DensityType.LTO4 => Localization.LTO4_CDemu, + DensityType.LTO5 => Localization.LTO5_CDemu, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.Exatape15m: + { + density = descriptor.Density switch + { + DensityType.Ex8200 => Localization.EXB8200, + DensityType.Ex8200c => Localization.EXB8200_compressed, + DensityType.Ex8500 => Localization.EXB8500, + DensityType.Ex8500c => Localization.EXB8500_compressed, + DensityType.Mammoth => Localization.TapeName_Mammoth, + DensityType.IBM3590 => Localization.IBM3590, + DensityType.IBM3590E => Localization.IBM3590E, + DensityType.VXA1 => Localization.VXA1, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.Exatape28m: + { + density = descriptor.Density switch + { + DensityType.Ex8200 => Localization.EXB8200, + DensityType.Ex8200c => Localization.EXB8200_compressed, + DensityType.Ex8500 => Localization.EXB8500, + DensityType.Ex8500c => Localization.EXB8500_compressed, + DensityType.Mammoth => Localization.TapeName_Mammoth, + DensityType.CT1 => Localization.CT1, + DensityType.CT2 => Localization.CT2, + DensityType.IBM3590 => Localization.IBM3590_extended, + DensityType.IBM3590E => Localization.IBM3590E_extended, + DensityType.VXA2 => Localization.VXA2, + DensityType.VXA3 => Localization.VXA3, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.Exatape54m: + { + switch(descriptor.Density) + { + case DensityType.Ex8200: + density = Localization.EXB8200; + + break; + case DensityType.Ex8200c: + density = Localization.EXB8200_compressed; + + break; + case DensityType.Ex8500: + density = Localization.EXB8500; + + break; + case DensityType.Ex8500c: + density = Localization.EXB8500_compressed; + + break; + case DensityType.Mammoth: + density = Localization.TapeName_Mammoth; + + break; + case DensityType.DLT3_42k: + density = Localization.DLT3_42k; + + break; + case DensityType.DLT3_56t: + density = Localization.DLT3_56t; + + break; + case DensityType.DLT3_62k: + case DensityType.DLT3_62kAlt: + density = Localization.DLT3_62k; + + break; + case DensityType.DLT3c: + density = Localization.DLT3c; + + break; + default: + density = string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density); + + break; + } + } + + break; + case MediumTypes.Exatape80m: + { + switch(descriptor.Density) + { + case DensityType.Ex8200: + density = Localization.EXB8200; + + break; + case DensityType.Ex8200c: + density = Localization.EXB8200_compressed; + + break; + case DensityType.Ex8500: + density = Localization.EXB8500; + + break; + case DensityType.Ex8500c: + density = Localization.EXB8500_compressed; + + break; + case DensityType.Mammoth: + density = Localization.TapeName_Mammoth; + + break; + case DensityType.DLT3_62k: + case DensityType.DLT3_62kAlt: + density = Localization.DLT3_XT; + + break; + case DensityType.DLT3c: + density = Localization.DLT3_XT_compressed; + + break; + default: + density = string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density); + + break; + } + } + + break; + case MediumTypes.Exatape106m: + { + switch(descriptor.Density) + { + case DensityType.Ex8200: + density = Localization.EXB8200; + + break; + case DensityType.Ex8200c: + density = Localization.EXB8200_compressed; + + break; + case DensityType.Ex8500: + density = Localization.EXB8500; + + break; + case DensityType.Ex8500c: + density = Localization.EXB8500_compressed; + + break; + case DensityType.Mammoth: + density = Localization.TapeName_Mammoth; + + break; + case DensityType.DLT4: + case DensityType.DLT4Alt: + density = Localization.DLT4; + + break; + case DensityType.DLT4_123k: + case DensityType.DLT4_123kAlt: + density = Localization.DLT4_123k; + + break; + case DensityType.DLT4_98k: + density = Localization.DLT4_98k; + + break; + case DensityType.Travan5: + density = Localization.Travan5; + + break; + case DensityType.DLT4c: + density = Localization.DLT4c; + + break; + case DensityType.DLT4_85k: + density = Localization.DLT4_85k; + + break; + case DensityType.DLT4c_85k: + density = Localization.DLT4c_85k; + + break; + case DensityType.DLT4c_123k: + density = Localization.DLT4c_123k; + + break; + case DensityType.DLT4c_98k: + density = Localization.DLT4c_98k; + + break; + default: + density = string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density); + + break; + } + } + + break; + case MediumTypes.Exatape106mXL: + { + switch(descriptor.Density) + { + case DensityType.Ex8200: + density = Localization.EXB8200; + + break; + case DensityType.Ex8200c: + density = Localization.EXB8200_compressed; + + break; + case DensityType.Ex8500: + density = Localization.EXB8500; + + break; + case DensityType.Ex8500c: + density = Localization.EXB8500_compressed; + + break; + case DensityType.Mammoth: + density = Localization.TapeName_Mammoth; + + break; + case DensityType.SDLT1_133k: + case DensityType.SDLT1_133kAlt: + density = Localization.SDLT1_133k; + + break; + case DensityType.SDLT1: + //case DensityType.SDLT1Alt: + density = Localization.SDLT1; + + break; + case DensityType.SDLT1c: + density = Localization.SDLT1c; + + break; + /*case DensityType.SDLT1_133kAlt: + density = "Super DLTtape I at 133000 bpi compressed"; + break;*/ + default: + density = string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density); + + break; + } + } + + break; + case MediumTypes.SDLT2: + { + density = descriptor.Density switch + { + DensityType.SDLT2 => Localization.MediumType_SDLT2, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.VStapeI: + { + switch(descriptor.Density) + { + case DensityType.VStape1: + case DensityType.VStape1Alt: + density = Localization.MediumType_VStapeI; + + break; + case DensityType.VStape1c: + density = Localization.VStape1c; + + break; + default: + density = string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density); + + break; + } + } + + break; + case MediumTypes.DLTtapeS4: + { + density = descriptor.Density switch + { + DensityType.DLTS4 => Localization.MediumType_DLTtapeS4, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.Exatape22m: + { + density = descriptor.Density switch + { + DensityType.Ex8200 => Localization.EXB8200, + DensityType.Ex8200c => Localization.EXB8200_compressed, + DensityType.Ex8500 => Localization.EXB8500, + DensityType.Ex8500c => Localization.EXB8500_compressed, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.Exatape40m: + { + density = descriptor.Density switch + { + DensityType.Ex8200 => Localization.EXB8200, + DensityType.Ex8200c => Localization.EXB8200_compressed, + DensityType.Ex8500 => Localization.EXB8500, + DensityType.Ex8500c => Localization.EXB8500_compressed, + DensityType.Mammoth => Localization.TapeName_Mammoth, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.Exatape76m: + { + density = descriptor.Density switch + { + DensityType.Ex8200 => Localization.EXB8200, + DensityType.Ex8200c => Localization.EXB8200_compressed, + DensityType.Ex8500 => Localization.EXB8500, + DensityType.Ex8500c => Localization.EXB8500_compressed, + DensityType.Mammoth => Localization.TapeName_Mammoth, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.Exatape112m: + { + density = descriptor.Density switch + { + DensityType.Ex8200 => Localization.EXB8200, + DensityType.Ex8200c => Localization.EXB8200_compressed, + DensityType.Ex8500 => Localization.EXB8500, + DensityType.Ex8500c => Localization.EXB8500_compressed, + DensityType.Mammoth => Localization.TapeName_Mammoth, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.Exatape22mAME: + case MediumTypes.Exatape170m: + case MediumTypes.Exatape125m: + case MediumTypes.Exatape45m: + case MediumTypes.Exatape225m: + case MediumTypes.Exatape150m: + case MediumTypes.Exatape75m: + { + density = descriptor.Density switch + { + DensityType.Mammoth => Localization.TapeName_Mammoth, + DensityType.Mammoth2 => Localization.Mammoth2, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.DC2900SL: + { + density = descriptor.Density switch + { + DensityType.Default => Localization.MediumType_DC2900SL, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.DC9250: + { + density = descriptor.Density switch + { + DensityType.Default => Localization.DC9250, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.SLR32: + { + density = descriptor.Density switch + { + DensityType.Default => Localization.MediumType_SLR32, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.MLR1SL: + { + density = descriptor.Density switch + { + DensityType.Default => Localization.MLR1_26GBSL, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.SLRtape50: + { + density = descriptor.Density switch + { + DensityType.Default => Localization.MediumType_SLRtape50, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.SLRtape50SL: + { + density = descriptor.Density switch + { + DensityType.Default => Localization.MediumType_SLRtape50SL, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.SLR32SL: + { + density = descriptor.Density switch + { + DensityType.Default => Localization.SLR32SL, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.SLR5: + { + density = descriptor.Density switch + { + DensityType.Default => Localization.MediumType_SLR5, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.SLR5SL: + { + density = descriptor.Density switch + { + DensityType.Default => Localization.SLR5SL, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.SLRtape7: + { + density = descriptor.Density switch + { + DensityType.Default => Localization.MediumType_SLRtape7, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.SLRtape7SL: + { + density = descriptor.Density switch + { + DensityType.Default => Localization.MediumType_SLRtape7SL, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.SLRtape24: + { + density = descriptor.Density switch + { + DensityType.Default => Localization.MediumType_SLRtape24, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.SLRtape24SL: + { + density = descriptor.Density switch + { + DensityType.Default => Localization.MediumType_SLRtape24SL, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.SLRtape140: + { + density = descriptor.Density switch + { + DensityType.Default => Localization.MediumType_SLRtape140, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.SLRtape40: + { + density = descriptor.Density switch + { + DensityType.Default => Localization.MediumType_SLRtape40, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.SLRtape60: + { + density = descriptor.Density switch + { + DensityType.Default => Localization.MediumType_SLRtape60, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.SLRtape100: + { + density = descriptor.Density switch + { + DensityType.Default => Localization.MediumType_SLRtape100, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + case MediumTypes.SLR40_60_100: + { + density = descriptor.Density switch + { + DensityType.Default => Localization.SLR40_60_100, + _ => string.Format(Localization.unknown_density_code_0, + (byte)descriptor.Density) + }; + } + + break; + default: + density = string.Format(Localization.unknown_density_code_0, (byte)descriptor.Density); + + break; + } + + if(density != "") + { + if(descriptor.Blocks == 0) + { + if(descriptor.BlockLength == 0) + { + sb. + AppendFormat("\t" + Localization.All_remaining_blocks_conform_to_0_and_have_a_variable_length, + density). + AppendLine(); + } + else + { + sb. + AppendFormat("\t" + Localization.All_remaining_blocks_conform_to_0_and_are_1_bytes_each, + density, descriptor.BlockLength). + AppendLine(); + } + } + else if(descriptor.BlockLength == 0) + { + sb.AppendFormat("\t" + Localization._0_blocks_conform_to_1_and_have_a_variable_length, + descriptor.Blocks, density). + AppendLine(); + } + else + { + sb.AppendFormat("\t" + Localization._0_blocks_conform_to_1_and_are_2_bytes_each, + descriptor.Blocks, density, descriptor.BlockLength). + AppendLine(); + } + } + else if(descriptor.Blocks == 0) + { + if(descriptor.BlockLength == 0) + { + sb.AppendFormat("\t" + Localization.All_remaining_blocks_have_a_variable_length). + AppendLine(); + } + else + { + sb.AppendFormat("\t" + Localization.All_remaining_blocks_are_0_bytes_each, + descriptor.BlockLength). + AppendLine(); + } + } + else if(descriptor.BlockLength == 0) + { + sb.AppendFormat("\t" + Localization._0_blocks_have_a_variable_length, descriptor.Blocks). + AppendLine(); + } + else + { + sb.AppendFormat("\t" + Localization._0_blocks_are_1_bytes_each, descriptor.Blocks, + descriptor.BlockLength). + AppendLine(); + } + } + } + + break; + } + + #endregion Sequential access device mode header + + #region Printer device mode header + + case PeripheralDeviceTypes.PrinterDevice: + { + switch(header.Value.BufferedMode) + { + case 0: + sb.AppendLine("\t" + Localization.Device_prints_directly); + + break; + case 1: + sb.AppendLine("\t" + Localization.Device_uses_a_print_cache); + + break; + default: + sb.AppendFormat("\t" + Localization.Unknown_buffered_mode_code_0, header.Value.BufferedMode). + AppendLine(); + + break; + } + + break; + } + + #endregion Printer device mode header + + #region Optical device mode header + + case PeripheralDeviceTypes.OpticalDevice: + { + if(header.Value.MediumType != MediumTypes.Default) + { + sb.Append("\t" + Localization.Medium_is_); + + switch(header.Value.MediumType) + { + case MediumTypes.ReadOnly: + sb.AppendLine(Localization.GetMediumTypeDescription_ReadOnly); + + break; + case MediumTypes.WORM: + sb.AppendLine(Localization.GetMediumTypeDescription_WORM); + + break; + case MediumTypes.Erasable: + sb.AppendLine(Localization.GetMediumTypeDescription_Erasable); + + break; + case MediumTypes.RO_WORM: + sb.AppendLine(Localization.GetMediumTypeDescription_RO_WORM); + + break; + case MediumTypes.RO_RW: + sb.AppendLine(Localization.a_combination_of_read_only_and_erasable_optical); + + break; + case MediumTypes.WORM_RW: + sb.AppendLine(Localization.a_combination_of_write_once_and_erasable_optical); + + break; + case MediumTypes.DOW: + sb.AppendLine(Localization.GetMediumTypeDescription_DOW); + + break; + default: + sb.AppendFormat(Localization.an_unknown_medium_type_0, (byte)header.Value.MediumType). + AppendLine(); + + break; + } + } + + if(header.Value.WriteProtected) + sb.AppendLine("\t" + Localization.Medium_is_write_protected); + + if(header.Value.EBC) + sb.AppendLine("\t" + Localization.Blank_checking_during_write_is_enabled); + + if(header.Value.DPOFUA) + sb.AppendLine("\t" + Localization.Drive_supports_DPO_and_FUA_bits); + + if(header.Value.BlockDescriptors != null) + { + foreach(BlockDescriptor descriptor in header.Value.BlockDescriptors) + { + var density = ""; + + switch(descriptor.Density) + { + case DensityType.Default: + break; + case DensityType.ISO10090: + density = Localization.ISO10090; + + break; + case DensityType.D581: + density = Localization.D581; + + break; + case DensityType.X3_212: + density = Localization.X3_212; + + break; + case DensityType.X3_191: + density = Localization.X3_191; + + break; + case DensityType.X3_214: + density = Localization.X3_214; + + break; + case DensityType.X3_211: + density = Localization.X3_211; + + break; + case DensityType.D407: + density = Localization.D407; + + break; + case DensityType.ISO13614: + density = Localization.ISO13614; + + break; + case DensityType.X3_200: + density = Localization.X3_200; + + break; + default: + density = string.Format(Localization.unknown_density_code_0, (byte)descriptor.Density); + + break; + } + + if(density != "") + { + if(descriptor.Blocks == 0) + { + if(descriptor.BlockLength == 0) + { + sb. + AppendFormat("\t" + Localization.All_remaining_blocks_are_0_and_have_a_variable_length, + density). + AppendLine(); + } + else + { + sb.AppendFormat("\t" + Localization.All_remaining_blocks_are_0_and_are_1_bytes_each, + density, descriptor.BlockLength). + AppendLine(); + } + } + else if(descriptor.BlockLength == 0) + { + sb.AppendFormat("\t" + Localization._0_blocks_are_1_and_have_a_variable_length, + descriptor.Blocks, density). + AppendLine(); + } + else + { + sb.AppendFormat("\t" + Localization._0_blocks_are_1_and_are_2_bytes_each, + descriptor.Blocks, density, descriptor.BlockLength). + AppendLine(); + } + } + else if(descriptor.Blocks == 0) + { + if(descriptor.BlockLength == 0) + { + sb.AppendFormat("\t" + Localization.All_remaining_blocks_have_a_variable_length). + AppendLine(); + } + else + { + sb.AppendFormat("\t" + Localization.All_remaining_blocks_are_0_bytes_each, + descriptor.BlockLength). + AppendLine(); + } + } + else if(descriptor.BlockLength == 0) + { + sb.AppendFormat("\t" + Localization._0_blocks_have_a_variable_length, descriptor.Blocks). + AppendLine(); + } + else + { + sb.AppendFormat("\t" + Localization._0_blocks_are_1_bytes_each, descriptor.Blocks, + descriptor.BlockLength). + AppendLine(); + } + } + } + + break; + } + + #endregion Optical device mode header + + #region Multimedia device mode header + + case PeripheralDeviceTypes.MultiMediaDevice: + { + sb.Append("\t" + Localization.Medium_is_); + + switch(header.Value.MediumType) + { + case MediumTypes.CDROM: + sb.AppendLine(Localization.MediumTypes_CDROM); + + break; + case MediumTypes.CDDA: + sb.AppendLine(Localization.MediumTypes_CDDA); + + break; + case MediumTypes.MixedCD: + sb.AppendLine(Localization.MediumTypes_MixedCD); + + break; + case MediumTypes.CDROM_80: + sb.AppendLine(Localization.MediumTypes_CDROM_80); + + break; + case MediumTypes.CDDA_80: + sb.AppendLine(Localization.MediumTypes_CDDA_80); + + break; + case MediumTypes.MixedCD_80: + sb.AppendLine(Localization.MediumTypes_MixedCD_80); + + break; + case MediumTypes.Unknown_CD: + sb.AppendLine(Localization.Unknown_medium_type); + + break; + case MediumTypes.HybridCD: + sb.AppendLine(Localization.MediumTypes_HybridCD); + + break; + case MediumTypes.Unknown_CDR: + sb.AppendLine(Localization.MediumTypes_Unknown_CDR); + + break; + case MediumTypes.CDR: + sb.AppendLine(Localization.MediumTypes_CDR); + + break; + case MediumTypes.CDR_DA: + sb.AppendLine(Localization.MediumTypes_CDR_DA); + + break; + case MediumTypes.CDR_Mixed: + sb.AppendLine(Localization.MediumTypes_CDR_Mixed); + + break; + case MediumTypes.HybridCDR: + sb.AppendLine(Localization.MediumTypes_HybridCDR); + + break; + case MediumTypes.CDR_80: + sb.AppendLine(Localization.MediumTypes_CDR_80); + + break; + case MediumTypes.CDR_DA_80: + sb.AppendLine(Localization.MediumTypes_CDR_DA_80); + + break; + case MediumTypes.CDR_Mixed_80: + sb.AppendLine("80 mm CD-R with data and audio"); + + break; + case MediumTypes.HybridCDR_80: + sb.AppendLine(Localization.MediumTypes_HybridCDR_80); + + break; + case MediumTypes.Unknown_CDRW: + sb.AppendLine(Localization.MediumTypes_Unknown_CDRW); + + break; + case MediumTypes.CDRW: + sb.AppendLine(Localization.MediumTypes_CDRW); + + break; + case MediumTypes.CDRW_DA: + sb.AppendLine(Localization.MediumTypes_CDRW_DA); + + break; + case MediumTypes.CDRW_Mixed: + sb.AppendLine(Localization.MediumTypes_CDRW_Mixed); + + break; + case MediumTypes.HybridCDRW: + sb.AppendLine(Localization.MediumTypes_HybridCDRW); + + break; + case MediumTypes.CDRW_80: + sb.AppendLine(Localization.MediumTypes_CDRW_80); + + break; + case MediumTypes.CDRW_DA_80: + sb.AppendLine(Localization.MediumTypes_CDRW_DA_80); + + break; + case MediumTypes.CDRW_Mixed_80: + sb.AppendLine(Localization.MediumTypes_CDRW_Mixed_80); + + break; + case MediumTypes.HybridCDRW_80: + sb.AppendLine(Localization.MediumTypes_HybridCDRW_80); + + break; + case MediumTypes.Unknown_HD: + sb.AppendLine(Localization.MediumTypes_Unknown_HD); + + break; + case MediumTypes.HD: + sb.AppendLine(Localization.MediumTypes_HD); + + break; + case MediumTypes.HD_80: + sb.AppendLine(Localization.MediumTypes_HD_80); + + break; + case MediumTypes.NoDisc: + sb.AppendLine(Localization.No_disc_inserted_tray_closed_or_caddy_inserted); + + break; + case MediumTypes.TrayOpen: + sb.AppendLine(Localization.Tray_open_or_no_caddy_inserted); + + break; + case MediumTypes.MediumError: + sb.AppendLine(Localization.Tray_closed_or_caddy_inserted_but_medium_error); + + break; + case MediumTypes.UnknownBlockDevice: + sb.AppendLine(Localization.Unknown_block_device); + + break; + case MediumTypes.ReadOnlyBlockDevice: + sb.AppendLine(Localization.Read_only_block_device); + + break; + case MediumTypes.ReadWriteBlockDevice: + sb.AppendLine(Localization.Read_Write_block_device); + + break; + case MediumTypes.LTOCD: + sb.AppendLine(Localization.LTO_in_CD_ROM_emulation_mode); + + break; + default: + sb.AppendFormat(Localization.Unknown_medium_type_0, (byte)header.Value.MediumType).AppendLine(); + + break; + } + + if(header.Value.WriteProtected) + sb.AppendLine("\t" + Localization.Medium_is_write_protected); + + if(header.Value.DPOFUA) + sb.AppendLine("\t" + Localization.Drive_supports_DPO_and_FUA_bits); + + if(header.Value.BlockDescriptors != null) + { + foreach(BlockDescriptor descriptor in header.Value.BlockDescriptors) + { + var density = ""; + + switch(descriptor.Density) + { + case DensityType.Default: + break; + case DensityType.User: + density = Localization.user_data_only; + + break; + case DensityType.UserAuxiliary: + density = Localization.user_data_plus_auxiliary_data; + + break; + case DensityType.UserAuxiliaryTag: + density = Localization._4byte_tag_user_data_plus_auxiliary_data; + + break; + case DensityType.Audio: + density = Localization.audio_information_only; + + break; + case DensityType.LTO2: + density = Localization.MediumType_LTO2; + + break; + case DensityType.LTO3: + density = Localization.MediumType_LTO3; + + break; + case DensityType.LTO4: + density = Localization.MediumType_LTO4; + + break; + case DensityType.LTO5: + density = Localization.MediumType_LTO5; + + break; + default: + density = string.Format(Localization.with_unknown_density_code_0, + (byte)descriptor.Density); + + break; + } + + if(density != "") + { + if(descriptor.Blocks == 0) + { + sb.AppendFormat("\t" + Localization.All_remaining_blocks_have_0_and_are_1_bytes_each, + density, descriptor.BlockLength). + AppendLine(); + } + else + { + sb.AppendFormat("\t" + Localization._0_blocks_have_1_and_are_2_bytes_each, + descriptor.Blocks, density, descriptor.BlockLength). + AppendLine(); + } + } + else if(descriptor.Blocks == 0) + { + sb.AppendFormat("\t" + Localization.All_remaining_blocks_are_0_bytes_each, + descriptor.BlockLength). + AppendLine(); + } + else + { + sb.AppendFormat("\t" + Localization._0_blocks_are_1_bytes_each, descriptor.Blocks, + descriptor.BlockLength). + AppendLine(); + } + } + } + + break; + } + + #endregion Multimedia device mode header + } + + return sb.ToString(); + } +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/Mode10.cs b/Aaru.Decoders/SCSI/Modes/Mode10.cs new file mode 100644 index 000000000..32eca1188 --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/Mode10.cs @@ -0,0 +1,378 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : Mode10.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes and encodines SCSI modes in MODE SENSE/SELECT (10) format. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using Aaru.CommonTypes.Structs.Devices.SCSI; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ + public static ModeHeader? DecodeModeHeader10(byte[] modeResponse, PeripheralDeviceTypes deviceType) + { + if(modeResponse == null || modeResponse.Length < 8) + return null; + + var modeLength = (ushort)((modeResponse[0] << 8) + modeResponse[1]); + var blockDescLength = (ushort)((modeResponse[6] << 8) + modeResponse[7]); + + if(modeResponse.Length < modeLength) + return null; + + var header = new ModeHeader + { + MediumType = (MediumTypes)modeResponse[2] + }; + + bool longLBA = (modeResponse[4] & 0x01) == 0x01; + + if(blockDescLength > 0) + { + if(longLBA) + { + header.BlockDescriptors = new BlockDescriptor[blockDescLength / 16]; + + for(var i = 0; i < header.BlockDescriptors.Length; i++) + { + if(12 + i * 16 + 8 >= modeResponse.Length) + break; + + header.BlockDescriptors[i] = new BlockDescriptor + { + Density = DensityType.Default + }; + + var temp = new byte[8]; + temp[0] = modeResponse[7 + i * 16 + 8]; + temp[1] = modeResponse[6 + i * 16 + 8]; + temp[2] = modeResponse[5 + i * 16 + 8]; + temp[3] = modeResponse[4 + i * 16 + 8]; + temp[4] = modeResponse[3 + i * 16 + 8]; + temp[5] = modeResponse[2 + i * 16 + 8]; + temp[6] = modeResponse[1 + i * 16 + 8]; + temp[7] = modeResponse[0 + i * 16 + 8]; + header.BlockDescriptors[i].Blocks = BitConverter.ToUInt64(temp, 0); + header.BlockDescriptors[i].BlockLength += (uint)(modeResponse[15 + i * 16 + 8] << 24); + header.BlockDescriptors[i].BlockLength += (uint)(modeResponse[14 + i * 16 + 8] << 16); + header.BlockDescriptors[i].BlockLength += (uint)(modeResponse[13 + i * 16 + 8] << 8); + header.BlockDescriptors[i].BlockLength += modeResponse[12 + i * 16 + 8]; + } + } + else + { + header.BlockDescriptors = new BlockDescriptor[blockDescLength / 8]; + + for(var i = 0; i < header.BlockDescriptors.Length; i++) + { + if(7 + i * 8 + 8 >= modeResponse.Length) + break; + + header.BlockDescriptors[i] = new BlockDescriptor(); + + if(deviceType != PeripheralDeviceTypes.DirectAccess) + header.BlockDescriptors[i].Density = (DensityType)modeResponse[0 + i * 8 + 8]; + else + { + header.BlockDescriptors[i].Density = DensityType.Default; + header.BlockDescriptors[i].Blocks += (ulong)(modeResponse[0 + i * 8 + 8] << 24); + } + + header.BlockDescriptors[i].Blocks += (ulong)(modeResponse[1 + i * 8 + 8] << 16); + header.BlockDescriptors[i].Blocks += (ulong)(modeResponse[2 + i * 8 + 8] << 8); + header.BlockDescriptors[i].Blocks += modeResponse[3 + i * 8 + 8]; + header.BlockDescriptors[i].BlockLength += (uint)(modeResponse[5 + i * 8 + 8] << 16); + header.BlockDescriptors[i].BlockLength += (uint)(modeResponse[6 + i * 8 + 8] << 8); + header.BlockDescriptors[i].BlockLength += modeResponse[7 + i * 8 + 8]; + } + } + } + + switch(deviceType) + { + case PeripheralDeviceTypes.DirectAccess: + case PeripheralDeviceTypes.MultiMediaDevice: + header.WriteProtected = (modeResponse[3] & 0x80) == 0x80; + header.DPOFUA = (modeResponse[3] & 0x10) == 0x10; + + break; + case PeripheralDeviceTypes.SequentialAccess: + header.WriteProtected = (modeResponse[3] & 0x80) == 0x80; + header.Speed = (byte)(modeResponse[3] & 0x0F); + header.BufferedMode = (byte)((modeResponse[3] & 0x70) >> 4); + + break; + case PeripheralDeviceTypes.PrinterDevice: + header.BufferedMode = (byte)((modeResponse[3] & 0x70) >> 4); + + break; + case PeripheralDeviceTypes.OpticalDevice: + header.WriteProtected = (modeResponse[3] & 0x80) == 0x80; + header.EBC = (modeResponse[3] & 0x01) == 0x01; + header.DPOFUA = (modeResponse[3] & 0x10) == 0x10; + + break; + } + + return header; + } + + public static string PrettifyModeHeader10(byte[] modeResponse, PeripheralDeviceTypes deviceType) => + PrettifyModeHeader(DecodeModeHeader10(modeResponse, deviceType), deviceType); + + public static DecodedMode? DecodeMode10(byte[] modeResponse, PeripheralDeviceTypes deviceType) + { + ModeHeader? hdr = DecodeModeHeader10(modeResponse, deviceType); + + if(!hdr.HasValue) + return null; + + var decoded = new DecodedMode + { + Header = hdr.Value + }; + + bool longlba = (modeResponse[4] & 0x01) == 0x01; + int offset; + var blkDrLength = 0; + + if(decoded.Header.BlockDescriptors != null) + blkDrLength = decoded.Header.BlockDescriptors.Length; + + if(longlba) + offset = 8 + blkDrLength * 16; + else + offset = 8 + blkDrLength * 8; + + int length = modeResponse[0] << 8; + length += modeResponse[1]; + length += 2; + + if(length != modeResponse.Length) + return decoded; + + List listpages = new(); + + while(offset < modeResponse.Length) + { + bool isSubpage = (modeResponse[offset] & 0x40) == 0x40; + var pg = new ModePage(); + var pageNo = (byte)(modeResponse[offset] & 0x3F); + + if(pageNo == 0) + { + pg.PageResponse = new byte[modeResponse.Length - offset]; + Array.Copy(modeResponse, offset, pg.PageResponse, 0, pg.PageResponse.Length); + pg.Page = 0; + pg.Subpage = 0; + offset += pg.PageResponse.Length; + } + else + { + switch(isSubpage) + { + case true when offset + 3 < modeResponse.Length: + { + pg.PageResponse = new byte[(modeResponse[offset + 2] << 8) + modeResponse[offset + 3] + 4]; + int copyLen = pg.PageResponse.Length; + + if(pg.PageResponse.Length + offset > modeResponse.Length) + copyLen = modeResponse.Length - offset; + + Array.Copy(modeResponse, offset, pg.PageResponse, 0, copyLen); + pg.Page = (byte)(modeResponse[offset] & 0x3F); + pg.Subpage = modeResponse[offset + 1]; + offset += pg.PageResponse.Length; + + break; + } + case true when offset + 1 < modeResponse.Length: + { + pg.PageResponse = new byte[modeResponse[offset + 1] + 2]; + int copyLen = pg.PageResponse.Length; + + if(pg.PageResponse.Length + offset > modeResponse.Length) + copyLen = modeResponse.Length - offset; + + Array.Copy(modeResponse, offset, pg.PageResponse, 0, copyLen); + pg.Page = (byte)(modeResponse[offset] & 0x3F); + pg.Subpage = 0; + offset += pg.PageResponse.Length; + + break; + } + default: + offset = modeResponse.Length; + + break; + } + } + + listpages.Add(pg); + } + + decoded.Pages = listpages.ToArray(); + + return decoded; + } + + public static byte[] EncodeModeHeader10(ModeHeader header, PeripheralDeviceTypes deviceType, bool longLBA = false) + { + byte[] hdr; + + if(header.BlockDescriptors != null) + { + hdr = longLBA + ? new byte[8 + header.BlockDescriptors.Length * 16] + : new byte[8 + header.BlockDescriptors.Length * 8]; + } + else + hdr = new byte[8]; + + hdr[2] = (byte)header.MediumType; + + switch(deviceType) + { + case PeripheralDeviceTypes.DirectAccess: + case PeripheralDeviceTypes.MultiMediaDevice: + if(header.WriteProtected) + hdr[3] += 0x80; + + if(header.DPOFUA) + hdr[3] += 0x10; + + break; + case PeripheralDeviceTypes.SequentialAccess: + if(header.WriteProtected) + hdr[3] += 0x80; + + hdr[3] += (byte)(header.Speed & 0x0F); + hdr[3] += (byte)(header.BufferedMode << 4 & 0x70); + + break; + case PeripheralDeviceTypes.PrinterDevice: + hdr[3] += (byte)(header.BufferedMode << 4 & 0x70); + + break; + case PeripheralDeviceTypes.OpticalDevice: + if(header.WriteProtected) + hdr[3] += 0x80; + + if(header.EBC) + hdr[3] += 0x01; + + if(header.DPOFUA) + hdr[3] += 0x10; + + break; + } + + if(longLBA) + hdr[4] += 0x01; + + if(header.BlockDescriptors == null) + return hdr; + + if(longLBA) + { + for(var i = 0; i < header.BlockDescriptors.Length; i++) + { + byte[] temp = BitConverter.GetBytes(header.BlockDescriptors[i].Blocks); + hdr[7 + i * 16 + 8] = temp[0]; + hdr[6 + i * 16 + 8] = temp[1]; + hdr[5 + i * 16 + 8] = temp[2]; + hdr[4 + i * 16 + 8] = temp[3]; + hdr[3 + i * 16 + 8] = temp[4]; + hdr[2 + i * 16 + 8] = temp[5]; + hdr[1 + i * 16 + 8] = temp[6]; + hdr[0 + i * 16 + 8] = temp[7]; + hdr[12 + i * 16 + 8] = (byte)((header.BlockDescriptors[i].BlockLength & 0xFF000000) >> 24); + hdr[13 + i * 16 + 8] = (byte)((header.BlockDescriptors[i].BlockLength & 0xFF0000) >> 16); + hdr[14 + i * 16 + 8] = (byte)((header.BlockDescriptors[i].BlockLength & 0xFF00) >> 8); + hdr[15 + i * 16 + 8] = (byte)(header.BlockDescriptors[i].BlockLength & 0xFF); + } + } + else + { + for(var i = 0; i < header.BlockDescriptors.Length; i++) + { + if(deviceType != PeripheralDeviceTypes.DirectAccess) + hdr[0 + i * 8 + 8] = (byte)header.BlockDescriptors[i].Density; + else + hdr[0 + i * 8 + 8] = (byte)((header.BlockDescriptors[i].Blocks & 0xFF000000) >> 24); + + hdr[1 + i * 8 + 8] = (byte)((header.BlockDescriptors[i].Blocks & 0xFF0000) >> 16); + hdr[2 + i * 8 + 8] = (byte)((header.BlockDescriptors[i].Blocks & 0xFF00) >> 8); + hdr[3 + i * 8 + 8] = (byte)(header.BlockDescriptors[i].Blocks & 0xFF); + hdr[5 + i * 8 + 8] = (byte)((header.BlockDescriptors[i].BlockLength & 0xFF0000) >> 16); + hdr[6 + i * 8 + 8] = (byte)((header.BlockDescriptors[i].BlockLength & 0xFF00) >> 8); + hdr[7 + i * 8 + 8] = (byte)(header.BlockDescriptors[i].BlockLength & 0xFF); + } + } + + return hdr; + } + + public static byte[] EncodeMode10(DecodedMode mode, PeripheralDeviceTypes deviceType) + { + var modeSize = 0; + + if(mode.Pages != null) + modeSize += mode.Pages.Sum(page => page.PageResponse.Length); + + byte[] hdr = EncodeModeHeader10(mode.Header, deviceType); + modeSize += hdr.Length; + var md = new byte[modeSize]; + + Array.Copy(hdr, 0, md, 0, hdr.Length); + + if(mode.Pages == null) + return md; + + { + int offset = hdr.Length; + + foreach(ModePage page in mode.Pages) + { + Array.Copy(page.PageResponse, 0, md, offset, page.PageResponse.Length); + offset += page.PageResponse.Length; + } + } + + return md; + } +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/Mode6.cs b/Aaru.Decoders/SCSI/Modes/Mode6.cs new file mode 100644 index 000000000..33e4773f5 --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/Mode6.cs @@ -0,0 +1,276 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : Modes.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes and encodines SCSI modes in MODE SENSE/SELECT (6) format. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using Aaru.CommonTypes.Structs.Devices.SCSI; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ + public static ModeHeader? DecodeModeHeader6(byte[] modeResponse, PeripheralDeviceTypes deviceType) + { + if(modeResponse == null || modeResponse.Length < 4 || modeResponse.Length < modeResponse[0] + 1) + return null; + + var header = new ModeHeader + { + MediumType = (MediumTypes)modeResponse[1] + }; + + if(modeResponse[3] > 0) + { + header.BlockDescriptors = new BlockDescriptor[modeResponse[3] / 8]; + + for(var i = 0; i < header.BlockDescriptors.Length; i++) + { + header.BlockDescriptors[i].Density = (DensityType)modeResponse[0 + i * 8 + 4]; + header.BlockDescriptors[i].Blocks += (ulong)(modeResponse[1 + i * 8 + 4] << 16); + header.BlockDescriptors[i].Blocks += (ulong)(modeResponse[2 + i * 8 + 4] << 8); + header.BlockDescriptors[i].Blocks += modeResponse[3 + i * 8 + 4]; + header.BlockDescriptors[i].BlockLength += (uint)(modeResponse[5 + i * 8 + 4] << 16); + header.BlockDescriptors[i].BlockLength += (uint)(modeResponse[6 + i * 8 + 4] << 8); + header.BlockDescriptors[i].BlockLength += modeResponse[7 + i * 8 + 4]; + } + } + + switch(deviceType) + { + case PeripheralDeviceTypes.DirectAccess: + case PeripheralDeviceTypes.MultiMediaDevice: + header.WriteProtected = (modeResponse[2] & 0x80) == 0x80; + header.DPOFUA = (modeResponse[2] & 0x10) == 0x10; + + break; + case PeripheralDeviceTypes.SequentialAccess: + header.WriteProtected = (modeResponse[2] & 0x80) == 0x80; + header.Speed = (byte)(modeResponse[2] & 0x0F); + header.BufferedMode = (byte)((modeResponse[2] & 0x70) >> 4); + + break; + case PeripheralDeviceTypes.PrinterDevice: + header.BufferedMode = (byte)((modeResponse[2] & 0x70) >> 4); + + break; + case PeripheralDeviceTypes.OpticalDevice: + header.WriteProtected = (modeResponse[2] & 0x80) == 0x80; + header.EBC = (modeResponse[2] & 0x01) == 0x01; + header.DPOFUA = (modeResponse[2] & 0x10) == 0x10; + + break; + } + + return header; + } + + public static string PrettifyModeHeader6(byte[] modeResponse, PeripheralDeviceTypes deviceType) => + PrettifyModeHeader(DecodeModeHeader6(modeResponse, deviceType), deviceType); + + public static DecodedMode? DecodeMode6(byte[] modeResponse, PeripheralDeviceTypes deviceType) + { + ModeHeader? hdr = DecodeModeHeader6(modeResponse, deviceType); + + if(!hdr.HasValue) + return null; + + var decoded = new DecodedMode + { + Header = hdr.Value + }; + + var blkDrLength = 0; + + if(decoded.Header.BlockDescriptors != null) + blkDrLength = decoded.Header.BlockDescriptors.Length; + + int offset = 4 + blkDrLength * 8; + int length = modeResponse[0] + 1; + + if(length != modeResponse.Length) + return decoded; + + List listpages = new(); + + while(offset < modeResponse.Length) + { + bool isSubpage = (modeResponse[offset] & 0x40) == 0x40; + var pg = new ModePage(); + var pageNo = (byte)(modeResponse[offset] & 0x3F); + + if(pageNo == 0) + { + pg.PageResponse = new byte[modeResponse.Length - offset]; + Array.Copy(modeResponse, offset, pg.PageResponse, 0, pg.PageResponse.Length); + pg.Page = 0; + pg.Subpage = 0; + offset += pg.PageResponse.Length; + } + else + { + if(isSubpage) + { + if(offset + 3 >= modeResponse.Length) + break; + + pg.PageResponse = new byte[(modeResponse[offset + 2] << 8) + modeResponse[offset + 3] + 4]; + int copyLen = pg.PageResponse.Length; + + if(pg.PageResponse.Length + offset > modeResponse.Length) + copyLen = modeResponse.Length - offset; + + Array.Copy(modeResponse, offset, pg.PageResponse, 0, copyLen); + pg.Page = (byte)(modeResponse[offset] & 0x3F); + pg.Subpage = modeResponse[offset + 1]; + offset += pg.PageResponse.Length; + } + else + { + if(offset + 1 >= modeResponse.Length) + break; + + pg.PageResponse = new byte[modeResponse[offset + 1] + 2]; + int copyLen = pg.PageResponse.Length; + + if(pg.PageResponse.Length + offset > modeResponse.Length) + copyLen = modeResponse.Length - offset; + + Array.Copy(modeResponse, offset, pg.PageResponse, 0, copyLen); + pg.Page = (byte)(modeResponse[offset] & 0x3F); + pg.Subpage = 0; + offset += pg.PageResponse.Length; + } + } + + listpages.Add(pg); + } + + decoded.Pages = listpages.ToArray(); + + return decoded; + } + + public static byte[] EncodeModeHeader6(ModeHeader header, PeripheralDeviceTypes deviceType) + { + byte[] hdr = header.BlockDescriptors != null ? new byte[4 + header.BlockDescriptors.Length * 8] : new byte[4]; + + hdr[1] = (byte)header.MediumType; + + switch(deviceType) + { + case PeripheralDeviceTypes.DirectAccess: + case PeripheralDeviceTypes.MultiMediaDevice: + if(header.WriteProtected) + hdr[2] += 0x80; + + if(header.DPOFUA) + hdr[2] += 0x10; + + break; + case PeripheralDeviceTypes.SequentialAccess: + if(header.WriteProtected) + hdr[2] += 0x80; + + hdr[2] += (byte)(header.Speed & 0x0F); + hdr[2] += (byte)(header.BufferedMode << 4 & 0x70); + + break; + case PeripheralDeviceTypes.PrinterDevice: + hdr[2] += (byte)(header.BufferedMode << 4 & 0x70); + + break; + case PeripheralDeviceTypes.OpticalDevice: + if(header.WriteProtected) + hdr[2] += 0x80; + + if(header.EBC) + hdr[2] += 0x01; + + if(header.DPOFUA) + hdr[2] += 0x10; + + break; + } + + if(header.BlockDescriptors == null) + return hdr; + + hdr[3] = (byte)(header.BlockDescriptors.Length * 8); + + for(var i = 0; i < header.BlockDescriptors.Length; i++) + { + hdr[0 + i * 8 + 4] = (byte)header.BlockDescriptors[i].Density; + hdr[1 + i * 8 + 4] = (byte)((header.BlockDescriptors[i].Blocks & 0xFF0000) >> 16); + hdr[2 + i * 8 + 4] = (byte)((header.BlockDescriptors[i].Blocks & 0xFF00) >> 8); + hdr[3 + i * 8 + 4] = (byte)(header.BlockDescriptors[i].Blocks & 0xFF); + hdr[5 + i * 8 + 4] = (byte)((header.BlockDescriptors[i].BlockLength & 0xFF0000) >> 16); + hdr[6 + i * 8 + 4] = (byte)((header.BlockDescriptors[i].BlockLength & 0xFF00) >> 8); + hdr[7 + i * 8 + 4] = (byte)(header.BlockDescriptors[i].BlockLength & 0xFF); + } + + return hdr; + } + + public static byte[] EncodeMode6(DecodedMode mode, PeripheralDeviceTypes deviceType) + { + var modeSize = 0; + + if(mode.Pages != null) + modeSize += mode.Pages.Sum(page => page.PageResponse.Length); + + byte[] hdr = EncodeModeHeader6(mode.Header, deviceType); + modeSize += hdr.Length; + var md = new byte[modeSize]; + + Array.Copy(hdr, 0, md, 0, hdr.Length); + + if(mode.Pages == null) + return md; + + { + int offset = hdr.Length; + + foreach(ModePage page in mode.Pages) + { + Array.Copy(page.PageResponse, 0, md, offset, page.PageResponse.Length); + offset += page.PageResponse.Length; + } + } + + return md; + } +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Modes/Structs.cs b/Aaru.Decoders/SCSI/Modes/Structs.cs new file mode 100644 index 000000000..cd88db92e --- /dev/null +++ b/Aaru.Decoders/SCSI/Modes/Structs.cs @@ -0,0 +1,88 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : Structs.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Common structures for MODE pages decoding and encoding. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static partial class Modes +{ +#region Nested type: BlockDescriptor + + public struct BlockDescriptor + { + public DensityType Density; + public ulong Blocks; + public uint BlockLength; + } + +#endregion + +#region Nested type: DecodedMode + + public struct DecodedMode + { + public ModeHeader Header; + public ModePage[] Pages; + } + +#endregion + +#region Nested type: ModeHeader + + public struct ModeHeader + { + public MediumTypes MediumType; + public bool WriteProtected; + public BlockDescriptor[] BlockDescriptors; + public byte Speed; + public byte BufferedMode; + public bool EBC; + public bool DPOFUA; + } + +#endregion + +#region Nested type: ModePage + + public struct ModePage + { + public byte Page; + public byte Subpage; + public byte[] PageResponse; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/SSC/BlockLimits.cs b/Aaru.Decoders/SCSI/SSC/BlockLimits.cs new file mode 100644 index 000000000..9e8c68f77 --- /dev/null +++ b/Aaru.Decoders/SCSI/SSC/BlockLimits.cs @@ -0,0 +1,102 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : BlockLimits.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI SSC block limits structures. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Text; +using Aaru.Localization; + +namespace Aaru.Decoders.SCSI.SSC; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static class BlockLimits +{ + public static BlockLimitsData? Decode(byte[] response) + { + if(response?.Length != 6) + return null; + + return new BlockLimitsData + { + granularity = (byte)(response[0] & 0x1F), + maxBlockLen = (uint)((response[1] << 16) + (response[2] << 8) + response[3]), + minBlockLen = (ushort)((response[4] << 8) + response[5]) + }; + } + + public static string Prettify(BlockLimitsData? decoded) + { + if(decoded == null) + return null; + + var sb = new StringBuilder(); + + if(decoded.Value.maxBlockLen == decoded.Value.minBlockLen) + sb.AppendFormat(Core.Device_block_size_is_fixed_at_0_bytes, decoded.Value.minBlockLen).AppendLine(); + else + { + if(decoded.Value.maxBlockLen > 0) + sb.AppendFormat(Core.Device_maximum_block_size_is_0_bytes, decoded.Value.maxBlockLen).AppendLine(); + else + sb.AppendLine(Core.Device_does_not_specify_a_maximum_block_size); + + sb.AppendFormat(Core.Device_minimum_block_size_is_0_bytes, decoded.Value.minBlockLen).AppendLine(); + + if(decoded.Value.granularity > 0) + { + sb.AppendFormat(Core.Device_needs_a_block_size_granularity_of_pow_0_1_bytes, decoded.Value.granularity, + Math.Pow(2, decoded.Value.granularity)). + AppendLine(); + } + } + + return sb.ToString(); + } + + public static string Prettify(byte[] response) => Prettify(Decode(response)); + +#region Nested type: BlockLimitsData + + public struct BlockLimitsData + { + /// All blocks size must be multiple of 2^ + public byte granularity; + /// Maximum block length in bytes + public uint maxBlockLen; + /// Minimum block length in bytes + public ushort minBlockLen; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/SSC/DensitySupport.cs b/Aaru.Decoders/SCSI/SSC/DensitySupport.cs new file mode 100644 index 000000000..e2bc9085e --- /dev/null +++ b/Aaru.Decoders/SCSI/SSC/DensitySupport.cs @@ -0,0 +1,311 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : DensitySupport.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI SSC density support structures. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Text; +using Aaru.Helpers; + +namespace Aaru.Decoders.SCSI.SSC; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +public static class DensitySupport +{ + public static DensitySupportHeader? DecodeDensity(byte[] response) + { + if(response is not { Length: > 56 }) + return null; + + var responseLen = (ushort)((response[0] << 8) + response[1] + 2); + + if(response.Length != responseLen) + return null; + + List descriptors = new(); + var offset = 4; + + while(offset < response.Length) + { + var descriptor = new DensitySupportDescriptor + { + primaryCode = response[offset + 0], + secondaryCode = response[offset + 1], + writable = (response[offset + 2] & 0x80) == 0x80, + duplicate = (response[offset + 2] & 0x40) == 0x40, + defaultDensity = (response[offset + 2] & 0x20) == 0x20, + reserved = (byte)((response[offset + 2] & 0x1E) >> 1), + lenvalid = (response[offset + 2] & 0x01) == 0x01, + len = (ushort)((response[offset + 3] << 8) + response[offset + 4]), + bpmm = (uint)((response[offset + 5] << 16) + (response[offset + 6] << 8) + response[offset + 7]), + width = (ushort)((response[offset + 8] << 8) + response[offset + 9]), + tracks = (ushort)((response[offset + 10] << 8) + response[offset + 11]), + capacity = (uint)((response[offset + 12] << 24) + + (response[offset + 13] << 16) + + (response[offset + 14] << 8) + + response[offset + 15]) + }; + + var tmp = new byte[8]; + Array.Copy(response, offset + 16, tmp, 0, 8); + descriptor.organization = StringHandlers.CToString(tmp).Trim(); + tmp = new byte[8]; + Array.Copy(response, offset + 24, tmp, 0, 8); + descriptor.name = StringHandlers.CToString(tmp).Trim(); + tmp = new byte[20]; + Array.Copy(response, offset + 32, tmp, 0, 20); + descriptor.description = StringHandlers.CToString(tmp).Trim(); + + if(descriptor.lenvalid) + offset += descriptor.len + 5; + else + offset += 52; + + descriptors.Add(descriptor); + } + + var decoded = new DensitySupportHeader + { + length = responseLen, + reserved = (ushort)((response[2] << 8) + response[3] + 2), + descriptors = descriptors.ToArray() + }; + + return decoded; + } + + public static string PrettifyDensity(DensitySupportHeader? density) + { + if(density == null) + return null; + + DensitySupportHeader decoded = density.Value; + var sb = new StringBuilder(); + + foreach(DensitySupportDescriptor descriptor in decoded.descriptors) + { + sb.AppendFormat(Localization.Density_0_defined_by_1, descriptor.name, descriptor.organization).AppendLine(); + + sb.AppendFormat("\t" + Localization.Primary_code_0, descriptor.primaryCode).AppendLine(); + + if(descriptor.primaryCode != descriptor.secondaryCode) + sb.AppendFormat("\t" + Localization.Secondary_code_0, descriptor.secondaryCode).AppendLine(); + + if(descriptor.writable) + sb.AppendLine("\t" + Localization.Drive_can_write_this_density); + + if(descriptor.duplicate) + sb.AppendLine("\t" + Localization.This_descriptor_is_duplicated); + + if(descriptor.defaultDensity) + sb.AppendLine("\t" + Localization.This_is_the_default_density_on_the_drive); + + sb.AppendFormat("\t" + Localization.Density_has_0_bits_per_mm__with_1_tracks_in_a_2_mm_width_tape, + descriptor.bpmm, descriptor.tracks, descriptor.width / (double)10). + AppendLine(); + + sb.AppendFormat("\t" + Localization.Density_maximum_capacity_is_0_megabytes, descriptor.capacity). + AppendLine(); + + sb.AppendFormat("\t" + Localization.Density_description_0, descriptor.description).AppendLine(); + sb.AppendLine(); + } + + return sb.ToString(); + } + + public static string PrettifyDensity(byte[] response) => PrettifyDensity(DecodeDensity(response)); + + public static MediaTypeSupportHeader? DecodeMediumType(byte[] response) + { + if(response is not { Length: > 60 }) + return null; + + var responseLen = (ushort)((response[0] << 8) + response[1] + 2); + + if(response.Length != responseLen) + return null; + + List descriptors = new(); + var offset = 4; + + while(offset < response.Length) + { + var descriptor = new MediaTypeSupportDescriptor + { + mediumType = response[offset + 0], + reserved1 = response[offset + 1], + len = (ushort)((response[offset + 2] << 8) + response[offset + 3]) + }; + + if(descriptor.len != 52) + return null; + + descriptor.numberOfCodes = response[offset + 4]; + descriptor.densityCodes = new byte[9]; + Array.Copy(response, offset + 5, descriptor.densityCodes, 0, 9); + descriptor.width = (ushort)((response[offset + 14] << 8) + response[offset + 15]); + descriptor.length = (ushort)((response[offset + 16] << 8) + response[offset + 17]); + descriptor.reserved1 = response[offset + 18]; + descriptor.reserved1 = response[offset + 19]; + var tmp = new byte[8]; + Array.Copy(response, offset + 20, tmp, 0, 8); + descriptor.organization = StringHandlers.CToString(tmp).Trim(); + tmp = new byte[8]; + Array.Copy(response, offset + 28, tmp, 0, 8); + descriptor.name = StringHandlers.CToString(tmp).Trim(); + tmp = new byte[20]; + Array.Copy(response, offset + 36, tmp, 0, 20); + descriptor.description = StringHandlers.CToString(tmp).Trim(); + + offset += 56; + + descriptors.Add(descriptor); + } + + var decoded = new MediaTypeSupportHeader + { + length = responseLen, + reserved = (ushort)((response[2] << 8) + response[3] + 2), + descriptors = descriptors.ToArray() + }; + + return decoded; + } + + public static string PrettifyMediumType(MediaTypeSupportHeader? mediumType) + { + if(mediumType == null) + return null; + + MediaTypeSupportHeader decoded = mediumType.Value; + var sb = new StringBuilder(); + + foreach(MediaTypeSupportDescriptor descriptor in decoded.descriptors) + { + sb.AppendFormat(Localization.Medium_type_0_defined_by_1, descriptor.name, descriptor.organization). + AppendLine(); + + sb.AppendFormat("\t" + Localization.Medium_type_code_0, descriptor.mediumType).AppendLine(); + + if(descriptor.numberOfCodes > 0) + { + sb.AppendFormat("\t" + Localization.Medium_supports_following_density_codes); + + for(var i = 0; i < descriptor.numberOfCodes; i++) + sb.Append($" {descriptor.densityCodes[i]:X2}h"); + + sb.AppendLine(); + } + + sb.AppendFormat("\t" + Localization.Medium_has_a_nominal_length_of_0_m_in_a_1_mm_width_tape, + descriptor.length, descriptor.width / (double)10). + AppendLine(); + + sb.AppendFormat("\t" + Localization.Medium_description_0, descriptor.description).AppendLine(); + sb.AppendLine(); + } + + return sb.ToString(); + } + + public static string PrettifyMediumType(byte[] response) => PrettifyMediumType(DecodeMediumType(response)); + +#region Nested type: DensitySupportDescriptor + + public struct DensitySupportDescriptor + { + public byte primaryCode; + public byte secondaryCode; + public bool writable; + public bool duplicate; + public bool defaultDensity; + public byte reserved; + public bool lenvalid; + public ushort len; + public uint bpmm; + public ushort width; + public ushort tracks; + public uint capacity; + public string organization; + public string name; + public string description; + } + +#endregion + +#region Nested type: DensitySupportHeader + + public struct DensitySupportHeader + { + public ushort length; + public ushort reserved; + public DensitySupportDescriptor[] descriptors; + } + +#endregion + +#region Nested type: MediaTypeSupportDescriptor + + [SuppressMessage("ReSharper", "UnusedMember.Global")] + public struct MediaTypeSupportDescriptor + { + public byte mediumType; + public byte reserved1; + public ushort len; + public byte numberOfCodes; + public byte[] densityCodes; + public ushort width; + public ushort length; + public byte reserved2; + public byte reserved3; + public string organization; + public string name; + public string description; + } + +#endregion + +#region Nested type: MediaTypeSupportHeader + + public struct MediaTypeSupportHeader + { + public ushort length; + public ushort reserved; + public MediaTypeSupportDescriptor[] descriptors; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Sense.cs b/Aaru.Decoders/SCSI/Sense.cs new file mode 100644 index 000000000..2587552a9 --- /dev/null +++ b/Aaru.Decoders/SCSI/Sense.cs @@ -0,0 +1,2740 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : Sense.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI SENSE. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Text; +using Aaru.Decoders.ATA; + +// ReSharper disable UnusedMember.Global + +namespace Aaru.Decoders.SCSI; + +public enum SenseType +{ + StandardSense, + ExtendedSenseFixedCurrent, + ExtendedSenseFixedPast, + ExtendedSenseDescriptorCurrent, + ExtendedSenseDescriptorPast, + Invalid, + Unknown +} + +public struct DecodedSense +{ + public FixedSense? Fixed; + public DescriptorSense? Descriptor; + + // ReSharper disable once InconsistentNaming + public readonly byte ASC => Descriptor?.ASC ?? (Fixed?.ASC ?? 0); + + // ReSharper disable once InconsistentNaming + public readonly byte ASCQ => Descriptor?.ASCQ ?? (Fixed?.ASCQ ?? 0); + public readonly SenseKeys SenseKey => Descriptor?.SenseKey ?? (Fixed?.SenseKey ?? SenseKeys.NoSense); + public readonly string Description => Sense.GetSenseDescription(ASC, ASCQ); +} + +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +[SuppressMessage("ReSharper", "InconsistentNaming")] +public struct StandardSense +{ + /// If set, is valid + public bool AddressValid; + /// Error class, 0 to 6 + public byte ErrorClass; + /// Error type + public byte ErrorType; + /// Private usage + public byte Private; + /// LBA where error happened + public uint LBA; +} + +public enum SenseKeys : byte +{ + /// No information to be reported, but bits should be checked + NoSense = 0, + /// Target performed some recovery to successfully complete last command + RecoveredError = 1, + /// Target is not ready + NotReady = 2, + /// Non-recoverable medium error occurred + MediumError = 3, + /// Non-recoverable hardware error occurred + HardwareError = 4, + /// Target has received an illegal request + IllegalRequest = 5, + /// Target requires initiator attention + UnitAttention = 6, + /// A protected command has been denied + DataProtect = 7, + /// A blank block has been tried to read or a non-rewritable one to write + BlankCheck = 8, + /// For private/vendor usage + PrivateUse = 9, + /// COPY command aborted + CopyAborted = 0xA, + /// Command aborted + AbortedCommand = 0xB, + /// SEARCH command has been satisfied + Equal = 0xC, + /// End-of-medium reached with data remaining in buffer + VolumeOverflow = 0xD, + /// COMPARE failed + Miscompare = 0xE, + /// Complated + Completed = 0xF +} + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "UnassignedField.Global")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +public struct FixedSense +{ + /// If set, is valid + public bool InformationValid; + /// Contains number of current segment descriptor + public byte SegmentNumber; + /// If set indicates current command has read a filemark or a setmark + public bool Filemark; + /// If set indicates device has arrived end-of-medium + public bool EOM; + /// Means the requested logical block length did not match the logical block length on the medium + public bool ILI; + /// Contains the sense key + public SenseKeys SenseKey; + /// Additional information + public uint Information; + /// Additional sense length + public byte AdditionalLength; + /// Command specific information field + public uint CommandSpecific; + /// Additional sense code + public byte ASC; + /// Additional sense code qualifier + public byte ASCQ; + public byte FieldReplaceable; + /// If set, is valid + public bool SKSV; + public uint SenseKeySpecific; + public byte[] AdditionalSense; +} + +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +public struct DescriptorSense +{ + /// Contains the sense key + public SenseKeys SenseKey; + /// Additional sense code + public byte ASC; + /// Additional sense code qualifier + public byte ASCQ; + public bool Overflow; + /// The descriptors, indexed by type + public Dictionary Descriptors; +} + +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +public struct AnotherProgressIndicationSenseDescriptor +{ + public SenseKeys SenseKey; + public byte ASC; + public byte ASCQ; + public ushort Progress; +} + +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static class Sense +{ + /// Gets the SCSI SENSE type to help chosing the correct decoding function + /// The type. + /// Sense bytes. + public static SenseType GetType(byte[] sense) + { + if(sense == null) + return SenseType.Invalid; + + if(sense.Length < 4) + return SenseType.Invalid; + + if((sense[0] & 0x70) != 0x70) + return sense.Length != 4 ? SenseType.Invalid : SenseType.StandardSense; + + return (sense[0] & 0x0F) switch + { + 0 => SenseType.ExtendedSenseFixedCurrent, + 1 => SenseType.ExtendedSenseFixedPast, + 2 => SenseType.ExtendedSenseDescriptorCurrent, + 3 => SenseType.ExtendedSenseDescriptorPast, + _ => SenseType.Unknown + }; + } + + public static StandardSense? DecodeStandard(byte[] sense) + { + if(GetType(sense) != SenseType.StandardSense) + return null; + + var decoded = new StandardSense(); + decoded.AddressValid |= (sense[0] & 0x80) == 0x80; + decoded.ErrorClass = (byte)((sense[0] & 0x70) >> 4); + decoded.ErrorType = (byte)(sense[0] & 0x0F); + decoded.Private = (byte)((sense[1] & 0x80) >> 4); + decoded.LBA = (uint)(((sense[1] & 0x0F) << 16) + (sense[2] << 8) + sense[3]); + + return decoded; + } + + public static DecodedSense? Decode(byte[] sense) + { + var decoded = new DecodedSense(); + + switch(sense[0] & 0x7F) + { + case 0x70: + case 0x71: + decoded.Fixed = DecodeFixed(sense); + + break; + case 0x72: + case 0x73: + decoded.Descriptor = DecodeDescriptor(sense); + + break; + } + + return decoded.Fixed is null && decoded.Descriptor is null ? null : decoded; + } + + public static FixedSense? DecodeFixed(byte[] sense) => DecodeFixed(sense, out _); + + public static FixedSense? DecodeFixed(byte[] sense, out string senseDescription) + { + senseDescription = null; + + if(sense is null || sense.Length == 0) + return null; + + if((sense[0] & 0x7F) != 0x70 && (sense[0] & 0x7F) != 0x71) + return null; + + if(sense.Length < 8) + return null; + + var decoded = new FixedSense + { + InformationValid = (sense[0] & 0x80) == 0x80, + SegmentNumber = sense[1], + Filemark = (sense[2] & 0x80) == 0x80, + EOM = (sense[2] & 0x40) == 0x40, + ILI = (sense[2] & 0x20) == 0x20, + SenseKey = (SenseKeys)(sense[2] & 0x0F), + Information = (uint)((sense[3] << 24) + (sense[4] << 16) + (sense[5] << 8) + sense[6]), + AdditionalLength = sense[7] + }; + + if(sense.Length >= 12) + decoded.CommandSpecific = (uint)((sense[8] << 24) + (sense[9] << 16) + (sense[10] << 8) + sense[11]); + + if(sense.Length >= 14) + { + decoded.ASC = sense[12]; + decoded.ASCQ = sense[13]; + senseDescription = GetSenseDescription(decoded.ASC, decoded.ASCQ); + } + + if(sense.Length >= 15) + decoded.FieldReplaceable = sense[14]; + + if(sense.Length >= 18) + decoded.SenseKeySpecific = (uint)((sense[15] << 16) + (sense[16] << 8) + sense[17]); + + if(sense.Length <= 18) + return decoded; + + decoded.AdditionalSense = new byte[sense.Length - 18]; + Array.Copy(sense, 18, decoded.AdditionalSense, 0, decoded.AdditionalSense.Length); + + return decoded; + } + + public static DescriptorSense? DecodeDescriptor(byte[] sense) => DecodeDescriptor(sense, out _); + + public static DescriptorSense? DecodeDescriptor(byte[] sense, out string senseDescription) + { + senseDescription = null; + + if(sense == null) + return null; + + if(sense.Length < 8) + return null; + + // Fixed sense + if((sense[0] & 0x7F) == 0x70 || (sense[0] & 0x7F) == 0x71) + return null; + + var decoded = new DescriptorSense + { + SenseKey = (SenseKeys)(sense[1] & 0x0F), + ASC = sense[2], + ASCQ = sense[3], + Overflow = (sense[4] & 0x80) == 0x80, + Descriptors = new Dictionary() + }; + + senseDescription = GetSenseDescription(decoded.ASC, decoded.ASCQ); + + var offset = 8; + + while(offset < sense.Length) + { + if(offset + 2 < sense.Length) + { + byte descType = sense[offset]; + int descLen = sense[offset + 1] + 2; + + var desc = new byte[descLen]; + + if(offset + descLen >= sense.Length) + descLen = sense.Length - offset; + + Array.Copy(sense, offset, desc, 0, descLen); + + decoded.Descriptors.TryAdd(descType, desc); + + offset += descLen; + } + else + break; + } + + return decoded; + } + + public static string PrettifySense(byte[] sense) + { + SenseType type = GetType(sense); + + switch(type) + { + case SenseType.StandardSense: + return PrettifySense(DecodeStandard(sense)); + case SenseType.ExtendedSenseFixedCurrent: + case SenseType.ExtendedSenseFixedPast: + return PrettifySense(DecodeFixed(sense)); + case SenseType.ExtendedSenseDescriptorCurrent: + case SenseType.ExtendedSenseDescriptorPast: + return PrettifySense(DecodeDescriptor(sense)); + default: + return null; + } + } + + public static string PrettifySense(StandardSense? sense) + { + if(!sense.HasValue) + return null; + + return sense.Value.AddressValid + ? string.Format(Localization.Error_class_0_type_1_happened_on_block_2 + "\n", sense.Value.ErrorClass, + sense.Value.ErrorType, sense.Value.LBA) + : string.Format(Localization.Error_class_0_type_1 + "\n", sense.Value.ErrorClass, + sense.Value.ErrorType); + } + + public static string PrettifySense(FixedSense? sense) + { + if(!sense.HasValue) + return null; + + FixedSense decoded = sense.Value; + + var sb = new StringBuilder(); + + sb.AppendFormat(Localization.SCSI_SENSE_0, GetSenseKey(decoded.SenseKey)).AppendLine(); + + if(decoded.SegmentNumber > 0) + sb.AppendFormat(Localization.On_segment_0, decoded.SegmentNumber).AppendLine(); + + if(decoded.Filemark) + sb.AppendLine(Localization.Filemark_or_setmark_found); + + if(decoded.EOM) + sb.AppendLine(Localization.End_of_medium_partition_found); + + if(decoded.ILI) + sb.AppendLine(Localization.Incorrect_length_indicator); + + if(decoded.InformationValid) + sb.AppendFormat(Localization.On_logical_block_0, decoded.Information).AppendLine(); + + if(decoded.AdditionalLength < 6) + return sb.ToString(); + + sb.AppendLine(GetSenseDescription(decoded.ASC, decoded.ASCQ)); + + if(decoded.AdditionalLength < 10) + return sb.ToString(); + + if(!decoded.SKSV) + return sb.ToString(); + + switch(decoded.SenseKey) + { + case SenseKeys.IllegalRequest: + { + sb.AppendLine((decoded.SenseKeySpecific & 0x400000) == 0x400000 + ? Localization.Illegal_field_in_CDB + : Localization.Illegal_field_in_data_parameters); + + if((decoded.SenseKeySpecific & 0x200000) == 0x200000) + { + sb.AppendFormat(Localization.Invalid_value_in_bit_0_in_field_1_of_CDB, + (decoded.SenseKeySpecific & 0x70000) >> 16, decoded.SenseKeySpecific & 0xFFFF). + AppendLine(); + } + else + { + sb.AppendFormat(Localization.Invalid_value_in_field_0_of_CDB, decoded.SenseKeySpecific & 0xFFFF). + AppendLine(); + } + } + + break; + case SenseKeys.NotReady: + sb.AppendFormat(Localization.Format_progress_0, (double)(decoded.SenseKeySpecific & 0xFFFF) / 65536). + AppendLine(); + + break; + case SenseKeys.RecoveredError: + case SenseKeys.HardwareError: + case SenseKeys.MediumError: + sb.AppendFormat(Localization.Actual_retry_count_is_0, decoded.SenseKeySpecific & 0xFFFF).AppendLine(); + + break; + } + + return sb.ToString(); + } + + public static string PrettifySense(DescriptorSense? sense) + { + if(!sense.HasValue) + return null; + + DescriptorSense decoded = sense.Value; + + var sb = new StringBuilder(); + + sb.AppendFormat(Localization.SCSI_SENSE_0, GetSenseKey(decoded.SenseKey)).AppendLine(); + sb.AppendLine(GetSenseDescription(decoded.ASC, decoded.ASCQ)); + + if(decoded.Descriptors == null || decoded.Descriptors.Count == 0) + return sb.ToString(); + + foreach(KeyValuePair kvp in decoded.Descriptors) + { + switch(kvp.Key) + { + case 0x00: + sb.AppendLine(PrettifyDescriptor00(kvp.Value)); + + break; + } + } + + return sb.ToString(); + } + + /// Decodes the information sense data descriptor + /// The information value + /// Descriptor. + public static ulong DecodeDescriptor00(byte[] descriptor) + { + if(descriptor.Length != 12 || descriptor[0] != 0x00) + return 0; + + var temp = new byte[8]; + + temp[0] = descriptor[11]; + temp[1] = descriptor[10]; + temp[2] = descriptor[9]; + temp[3] = descriptor[8]; + temp[4] = descriptor[7]; + temp[5] = descriptor[6]; + temp[6] = descriptor[5]; + temp[7] = descriptor[4]; + + return BitConverter.ToUInt64(temp, 0); + } + + /// Decodes the command-specific information sense data descriptor + /// The command-specific information sense data descriptor. + /// Descriptor. + public static ulong DecodeDescriptor01(byte[] descriptor) + { + if(descriptor.Length != 12 || descriptor[0] != 0x01) + return 0; + + var temp = new byte[8]; + + temp[0] = descriptor[11]; + temp[1] = descriptor[10]; + temp[2] = descriptor[9]; + temp[3] = descriptor[8]; + temp[4] = descriptor[7]; + temp[5] = descriptor[6]; + temp[6] = descriptor[5]; + temp[7] = descriptor[4]; + + return BitConverter.ToUInt64(temp, 0); + } + + /// Decodes the sense key specific sense data descriptor + /// The sense key specific sense data descriptor. + /// Descriptor. + public static byte[] DecodeDescriptor02(byte[] descriptor) + { + if(descriptor.Length != 8 || descriptor[0] != 0x02) + return null; + + var temp = new byte[3]; + Array.Copy(descriptor, 4, temp, 0, 3); + + return temp; + } + + /// Decodes the field replaceable unit sense data descriptor + /// The field replaceable unit sense data descriptor. + /// Descriptor. + public static byte DecodeDescriptor03(byte[] descriptor) + { + if(descriptor.Length != 4 || descriptor[0] != 0x03) + return 0; + + return descriptor[3]; + } + + /// Decodes the another progress indication sense data descriptor + /// The another progress indication sense data descriptor. + /// Descriptor. + public static AnotherProgressIndicationSenseDescriptor? DecodeDescriptor0A(byte[] descriptor) + { + if(descriptor.Length != 8 || descriptor[0] != 0x0A) + return null; + + return new AnotherProgressIndicationSenseDescriptor + { + SenseKey = (SenseKeys)descriptor[2], + ASC = descriptor[3], + ASCQ = descriptor[4], + Progress = (ushort)((descriptor[6] << 8) + descriptor[7]) + }; + } + + public static void DecodeDescriptor04(byte[] descriptor, out bool filemark, out bool eom, out bool ili) + { + filemark = (descriptor[3] & 0x80) > 0; + eom = (descriptor[3] & 0x40) > 0; + ili = (descriptor[3] & 0x20) > 0; + } // ReSharper disable UnusedParameter.Global + public static void DecodeDescriptor05(byte[] descriptor) => throw new NotImplementedException("Check SBC-3"); + + public static void DecodeDescriptor06(byte[] descriptor) => throw new NotImplementedException("Check OSD"); + + public static void DecodeDescriptor07(byte[] descriptor) => throw new NotImplementedException("Check OSD"); + + public static void DecodeDescriptor08(byte[] descriptor) => throw new NotImplementedException("Check OSD"); + + public static AtaErrorRegistersLba48 DecodeDescriptor09(byte[] descriptor) => new() + { + Error = descriptor[3], + SectorCount = (ushort)((descriptor[4] << 8) + descriptor[5]), + LbaLowCurrent = descriptor[6], + LbaLowPrevious = descriptor[7], + LbaMidCurrent = descriptor[8], + LbaMidPrevious = descriptor[9], + LbaHighCurrent = descriptor[10], + LbaHighPrevious = descriptor[11], + DeviceHead = descriptor[12], + Status = descriptor[13] + }; + + public static void DecodeDescriptor0B(byte[] descriptor) => throw new NotImplementedException("Check SBC-3"); + + public static void DecodeDescriptor0D(byte[] descriptor) => throw new NotImplementedException("Check SBC-3"); + + public static string PrettifyDescriptor00(ulong information) => + string.Format(Localization.Sense_PrettifyDescriptor00_On_logical_block_0 + "\n", information); + + public static string PrettifyDescriptor00(byte[] descriptor) => + PrettifyDescriptor00(DecodeDescriptor00(descriptor)); + + public static string GetSenseKey(SenseKeys key) => key switch + { + SenseKeys.AbortedCommand => "ABORTED COMMAND", + SenseKeys.BlankCheck => "BLANK CHECK", + SenseKeys.CopyAborted => "COPY ABORTED", + SenseKeys.DataProtect => "DATA PROTECT", + SenseKeys.Equal => "EQUAL", + SenseKeys.HardwareError => "HARDWARE ERROR", + SenseKeys.IllegalRequest => "ILLEGAL REQUEST", + SenseKeys.MediumError => "MEDIUM ERROR", + SenseKeys.Miscompare => "MISCOMPARE", + SenseKeys.NoSense => "NO SENSE", + SenseKeys.PrivateUse => "PRIVATE USE", + SenseKeys.RecoveredError => "RECOVERED ERROR", + SenseKeys.Completed => "COMPLETED", + SenseKeys.UnitAttention => "UNIT ATTENTION", + SenseKeys.VolumeOverflow => "VOLUME OVERFLOW", + _ => "UNKNOWN" + }; + + [SuppressMessage("ReSharper", "InconsistentNaming")] + public static string GetSenseDescription(byte ASC, byte ASCQ) + { + switch(ASC) + { + case 0x00: + switch(ASCQ) + { + case 0x00: + return "NO ADDITIONAL SENSE INFORMATION"; + case 0x01: + return "FILEMARK DETECTED"; + case 0x02: + return "END-OF-PARTITION/MEDIUM DETECTED"; + case 0x03: + return "SETMARK DETECTED"; + case 0x04: + return "BEGINNING-OF-PARTITION/MEDIUM DETECTED"; + case 0x05: + return "END-OF-DATA DETECTED"; + case 0x06: + return "I/O PROCESS TERMINATED"; + case 0x07: + return "PROGRAMMABLE EARLY WARNING DETECTED"; + case 0x11: + return "AUDIO PLAY OPERATION IN PROGRESS"; + case 0x12: + return "AUDIO PLAY OPERATION PAUSED"; + case 0x13: + return "AUDIO PLAY OPERATION SUCCESSFULLY COMPLETED"; + case 0x14: + return "AUDIO PLAY OPERATION STOPPED DUE TO ERROR"; + case 0x15: + return "NO CURRENT AUDIO STATUS TO RETURN"; + case 0x16: + return "OPERATION IN PROGRESS"; + case 0x17: + return "CLEANING REQUESTED"; + case 0x18: + return "ERASE OPERATION IN PROGRESS"; + case 0x19: + return "LOCATE OPERATION IN PROGRESS"; + case 0x1A: + return "REWIND OPERATION IN PROGRESS"; + case 0x1B: + return "SET CAPACITY OPERATION IN PROGRESS"; + case 0x1C: + return "VERIFY OPERATION IN PROGRESS"; + case 0x1D: + return "ATA PASS THROUGH INFORMATION AVAILABLE"; + case 0x1E: + return "CONFLICTING SA CREATION REQUEST"; + case 0x1F: + return "LOGICAL UNIT TRANSITIONING TO ANOTHER POWER CONDITION"; + case 0x20: + return "EXTENDED COPY INFORMATION AVAILABLE"; + case 0x21: + return "ATOMIC COMMAND ABORTED DUE TO ACA"; + } + + break; + case 0x01: + switch(ASCQ) + { + case 0x00: + return "NO INDEX/SECTOR SIGNAL"; + } + + break; + case 0x02: + switch(ASCQ) + { + case 0x00: + return "NO SEEK COMPLETE"; + } + + break; + case 0x03: + switch(ASCQ) + { + case 0x00: + return "PERIPHERAL DEVICE WRITE FAULT"; + case 0x01: + return "NO WRITE CURRENT"; + case 0x02: + return "EXCESSIVE WRITE ERRORS"; + } + + break; + case 0x04: + switch(ASCQ) + { + case 0x00: + return "LOGICAL UNIT NOT READY, CAUSE NOT REPORTABLE"; + case 0x01: + return "LOGICAL UNIT IS IN PROCESS OF BECOMING READY"; + case 0x02: + return "LOGICAL UNIT NOT READY, INITIALIZING COMMAND REQUIRED"; + case 0x03: + return "LOGICAL UNIT NOT READY, MANUAL INTERVENTION REQUIRED"; + case 0x04: + return "LOGICAL UNIT NOT READY, FORMAT IN PROGRESS"; + case 0x05: + return "LOGICAL UNIT NOT READY, REBUILD IN PROGRESS"; + case 0x06: + return "LOGICAL UNIT NOT READY, RECALCULATION IN PROGRESS"; + case 0x07: + return "LOGICAL UNIT NOT READY, OPERATION IN PROGRESS"; + case 0x08: + return "LOGICAL UNIT NOT READY, LONG WRITE IN PROGRESS"; + case 0x09: + return "LOGICAL UNIT NOT READY, SELF-TEST IN PROGRESS"; + case 0x0A: + return "LOGICAL UNIT NOT ACCESSIBLE, ASYMMETRIC ACCESS STATE TRANSITION"; + case 0x0B: + return "LOGICAL UNIT NOT ACCESSIBLE, TARGET IN STANDBY STATE"; + case 0x0C: + return "LOGICAL UNIT NOT ACCESSIBLE, TARGET PORT IN UNAVAILABLE STATE"; + case 0x0D: + return "LOGICAL UNIT NOT READY, STRUCTURE CHECK REQUIRED"; + case 0x0E: + return "LOGICAL UNIT NOT READY, SECURITY SESSION IN PROGRESS"; + case 0x10: + return "LOGICAL UNIT NOT READY, AUXILIARY MEMORY NOT ACCESSIBLE"; + case 0x11: + return "LOGICAL UNIT NOT READY, NOTIFY (ENABLE SPINUP) REQUIRED"; + case 0x12: + return "LOGICAL UNIT NOT READY, OFFLINE"; + case 0x13: + return "LOGICAL UNIT NOT READY, SA CREATION IN PROGRESS"; + case 0x14: + return "LOGICAL UNIT NOT READY, SPACE ALLOCATION IN PROGRESS"; + case 0x15: + return "LOGICAL UNIT NOT READY, ROBOTICS DISABLED"; + case 0x16: + return "LOGICAL UNIT NOT READY, CONFIGURATION REQUIRED"; + case 0x17: + return "LOGICAL UNIT NOT READY, CALIBRATION REQUIRED"; + case 0x18: + return "LOGICAL UNIT NOT READY, A DOOR IS OPEN"; + case 0x19: + return "LOGICAL UNIT NOT READY, OPERATING IN SEQUENTIAL MODE"; + case 0x1A: + return "LOGICAL UNIT NOT READY, START STOP UNIT IN PROGRESS"; + case 0x1B: + return "LOGICAL UNIT NOT READY, SANITIZE IN PROGRESS"; + case 0x1C: + return "LOGICAL UNIT NOT READY, ADDITIONAL POWER USE NOT YET GRANTED"; + case 0x1D: + return "LOGICAL UNIT NOT READY, CONFIGURATION IN PROGRESS"; + case 0x1E: + return "LOGICAL UNIT NOT READY, MICROCODE ACTIVATION REQUIRED"; + case 0x1F: + return "LOGICAL UNIT NOT READY, MICROCODE DOWNLOAD REQUIRED"; + case 0x20: + return "LOGICAL UNIT NOT READY, LOGICAL UNIT RESET REQUIRED"; + case 0x21: + return "LOGICAL UNIT NOT READY, HARD RESET REQUIRED"; + case 0x22: + return "LOGICAL UNIT NOT READY, POWER CYCLE REQUIRED"; + } + + break; + case 0x05: + switch(ASCQ) + { + case 0x00: + return "LOGICAL UNIT DOES NOT RESPOND TO SELECTION"; + } + + break; + case 0x06: + switch(ASCQ) + { + case 0x00: + return "NO REFERENCE POSITION FOUND"; + } + + break; + case 0x07: + switch(ASCQ) + { + case 0x00: + return "MULTIPLE PERIPHERAL DEVICES SELECTED"; + } + + break; + case 0x08: + switch(ASCQ) + { + case 0x00: + return "LOGICAL UNIT COMMUNICATION FAILURE"; + case 0x01: + return "LOGICAL UNIT COMMUNICATION TIME-OUT"; + case 0x02: + return "LOGICAL UNIT COMMUNICATION PARITY ERROR"; + case 0x03: + return "LOGICAL UNIT COMMUNICATION CRC ERROR"; + case 0x04: + return "UNREACHABLE COPY TARGET"; + } + + break; + case 0x09: + switch(ASCQ) + { + case 0x00: + return "TRACK FOLLOWING ERROR"; + case 0x01: + return "TRACKING SERVO FAILURE"; + case 0x02: + return "FOCUS SERVO FAILURE"; + case 0x03: + return "SPINDLE SERVO FAILURE"; + case 0x04: + return "HEAD SELECT FAULT"; + case 0x05: + return "VIBRATION INDUCED TRACKING ERROR"; + } + + break; + case 0x0A: + switch(ASCQ) + { + case 0x00: + return "ERROR LOG OVERFLOW"; + } + + break; + case 0x0B: + switch(ASCQ) + { + case 0x00: + return "WARNING"; + case 0x01: + return "WARNING - SPECIFIED TEMPERATURE EXCEEDED"; + case 0x02: + return "WARNING - ENCLOSURE DEGRADED"; + case 0x03: + return "WARNING - BACKGROUND SELF-TEST FAILED"; + case 0x04: + return "WARNING - BACKGROUND PRE-SCAN DETECTED MEDIUM ERROR"; + case 0x05: + return "WARNING - BACKGROUND MEDIUM SCAN DETECTED MEDIUM ERROR"; + case 0x06: + return "WARNING - NON-VOLATILE CACHE NOW VOLATILE"; + case 0x07: + return "WARNING - DEGRADED POWER TO NON-VOLATILE CACHE"; + case 0x08: + return "WARNING - POWER LOSS EXPECTED"; + case 0x09: + return "WARNING - DEVICE STATISTICS NOTIFICATION ACTIVE"; + case 0x0A: + return "WARNING - HIGH CRITICAL TEMPERATURE LIMIT EXCEEDED"; + case 0x0B: + return "WARNING - LOW CRITICAL TEMPERATURE LIMIT EXCEEDED"; + case 0x0C: + return "WARNING - HIGH OPERATING TEMPERATURE LIMIT EXCEEDED"; + case 0x0D: + return "WARNING - LOW OPERATING TEMPERATURE LIMIT EXCEEDED"; + case 0x0E: + return "WARNING - HIGH CRITICAL HUMIDITY LIMIT EXCEEDED"; + case 0x0F: + return "WARNING - LOW CRITICAL HUMIDITY LIMIT EXCEEDED"; + case 0x10: + return "WARNING - HIGH OPERATING HUMIDITY LIMIT EXCEEDED"; + case 0x11: + return "WARNING - LOW OPERATING HUMIDITY LIMIT EXCEEDED"; + } + + break; + case 0x0C: + switch(ASCQ) + { + case 0x00: + return "WRITE ERROR"; + case 0x01: + return "WRITE ERROR - RECOVERED WITH AUTO REALLOCATION"; + case 0x02: + return "WRITE ERROR - AUTO REALLOCATION FAILED"; + case 0x03: + return "WRITE ERROR - RECOMMENDED REASSIGNMENT"; + case 0x04: + return "COMPRESSION CHECK MISCOMPARE ERROR"; + case 0x05: + return "DATA EXPANSION OCCURRED DURING COMPRESSION"; + case 0x06: + return "BLOCK NOT COMPRESSIBLE"; + case 0x07: + return "WRITE ERROR - RECOVERY NEEDED"; + case 0x08: + return "WRITE ERROR - RECOVERY FAILED"; + case 0x09: + return "WRITE ERROR - LOSS OF STREAMING"; + case 0x0A: + return "WRITE ERROR - PADDING BLOCKS ADDED"; + case 0x0B: + return "AUXILIARY MEMORY WRITE ERROR"; + case 0x0C: + return "WRITE ERROR - UNEXPECTED UNSOLICITED DATA"; + case 0x0D: + return "WRITE ERROR - NOT ENOUGH UNSOLICITED DATA"; + case 0x0E: + return "MULTIPLE WRITE ERRORS"; + case 0x0F: + return "DEFECTS IN ERROR WINDOW"; + case 0x10: + return "INCOMPLETE MULTIPLE ATOMIC WRITE OPERATIONS"; + case 0x11: + return "WRITE ERROR - RECOVERY SCAN NEEDED"; + case 0x12: + return "WRITE ERROR - INSUFFICIENT ZONE RESOURCES"; + } + + break; + case 0x0D: + switch(ASCQ) + { + case 0x00: + return "ERROR DETECTED BY THIRD PARTY TEMPORARY INITIATOR"; + case 0x01: + return "THIRD PARTY DEVICE FAILURE"; + case 0x02: + return "COPY TARGET DEVICE NOT REACHABLE"; + case 0x03: + return "INCORRECT COPY TARGET DEVICE TYPE"; + case 0x04: + return "COPY TARGET DEVICE DATA UNDERRUN"; + case 0x05: + return "COPY TARGET DEVICE DATA OVERRUN"; + } + + break; + case 0x0E: + switch(ASCQ) + { + case 0x00: + return "INVALID INFORMATION UNIT"; + case 0x01: + return "INFORMATION UNIT TOO SHORT"; + case 0x02: + return "INFORMATION UNIT TOO LONG"; + case 0x03: + return "INVALID FIELD IN COMMAND INFORMATION UNIT"; + } + + break; + case 0x10: + switch(ASCQ) + { + case 0x00: + return "ID CRC OR ECC ERROR"; + case 0x01: + return "LOGICAL BLOCK GUARD CHECK FAILED"; + case 0x02: + return "LOGICAL BLOCK APPLICATION TAG CHECK FAILED"; + case 0x03: + return "LOGICAL BLOCK REFERENCE TAG CHECK FAILED"; + case 0x04: + return "LOGICAL BLOCK PROTECTION ERROR ON RECOVER BUFFERED DATA"; + case 0x05: + return "LOGICAL BLOCK PROTECTION METHOD ERROR"; + } + + break; + case 0x11: + switch(ASCQ) + { + case 0x00: + return "UNRECOVERED READ ERROR"; + case 0x01: + return "READ RETRIES EXHAUSTED"; + case 0x02: + return "ERROR TOO LONG TO CORRECT"; + case 0x03: + return "MULTIPLE READ ERRORS"; + case 0x04: + return "UNRECOVERED READ ERROR - AUTO REALLOCATE FAILED"; + case 0x05: + return "L-EC UNCORRECTABLE ERROR"; + case 0x06: + return "CIRC UNRECOVERED ERROR"; + case 0x07: + return "DATA RESYNCHRONIZATION ERROR"; + case 0x08: + return "INCOMPLETE BLOCK READ"; + case 0x09: + return "NO GAP FOUND"; + case 0x0A: + return "MISCORRECTED ERROR"; + case 0x0B: + return "UNRECOVERED READ ERROR - RECOMMENDED REASSIGNMENT"; + case 0x0C: + return "UNRECOVERED READ ERROR - RECOMMENDED REWRITE THE DATA"; + case 0x0D: + return "DE-COMPRESSION CRC ERROR"; + case 0x0E: + return "CANNOT DECOMPRESS USING DECLARED ALGORITHM"; + case 0x0F: + return "ERROR READING UPC/EAN NUMBER"; + case 0x10: + return "ERROR READING ISRC NUMBER"; + case 0x11: + return "READ ERROR - LOSS OF STREAMING"; + case 0x12: + return "AUXILIARY MEMORY READ ERROR"; + case 0x13: + return "READ ERROR - FAILED RETRANSMISSION REQUEST"; + case 0x14: + return "READ ERROR - LBA MARKED BAD BY APPLICATION CLIENT"; + case 0x15: + return "WRITE AFTER SANITIZE REQUIRED"; + } + + break; + case 0x12: + switch(ASCQ) + { + case 0x00: + return "ADDRESS MARK NOT FOUND FOR ID FIELD"; + } + + break; + case 0x13: + switch(ASCQ) + { + case 0x00: + return "ADDRESS MARK NOT FOUND FOR DATA FIELD"; + } + + break; + case 0x14: + switch(ASCQ) + { + case 0x00: + return "RECORDED ENTITY NOT FOUND"; + case 0x01: + return "RECORD NOT FOUND"; + case 0x02: + return "FILEMARK OR SETMARK NOT FOUND"; + case 0x03: + return "END-OF-DATA NOT FOUND"; + case 0x04: + return "BLOCK SEQUENCE ERROR"; + case 0x05: + return "RECORD NOT FOUND - RECOMMENDED REASSIGNMENT"; + case 0x06: + return "RECORD NOT FOUND - DATA AUTO-REALLOCATED"; + case 0x07: + return "LOCATE OPERATION FAILURE"; + } + + break; + case 0x15: + switch(ASCQ) + { + case 0x00: + return "RANDOM POSITIONING ERROR"; + case 0x01: + return "MECHANICAL POSITIONING ERROR"; + case 0x02: + return "POSITIONING ERROR DETECTED BY READ OF MEDIUM"; + } + + break; + case 0x16: + switch(ASCQ) + { + case 0x00: + return "DATA SYNCHRONIZATION MARK ERROR"; + case 0x01: + return "DATA SYNC ERROR - DATA REWRITTEN"; + case 0x02: + return "DATA SYNC ERROR - RECOMMENDED REWRITE"; + case 0x03: + return "DATA SYNC ERROR - DATA AUTO-REALLOCATED"; + case 0x04: + return "DATA SYNC ERROR - RECOMMENDED REASSIGNMENT"; + } + + break; + case 0x17: + switch(ASCQ) + { + case 0x00: + return "RECOVERED DATA WITH NO ERROR CORRECTION APPLIED"; + case 0x01: + return "RECOVERED DATA WITH RETRIES"; + case 0x02: + return "RECOVERED DATA WITH POSITIVE HEAD OFFSET"; + case 0x03: + return "RECOVERED DATA WITH NEGATIVE HEAD OFFSET"; + case 0x04: + return "RECOVERED DATA WITH RETRIES AND/OR CIRC APPLIED"; + case 0x05: + return "RECOVERED DATA USING PREVIOUS SECTOR ID"; + case 0x06: + return "RECOVERED DATA WITHOUT ECC - DATA AUTO-REALLOCATED"; + case 0x07: + return "RECOVERED DATA WITHOUT ECC - RECOMMENDED REASSIGNMENT"; + case 0x08: + return "RECOVERED DATA WITHOUT ECC - RECOMMENDED REWRITE"; + case 0x09: + return "RECOVERED DATA WITHOUT ECC - DATA REWRITTEN"; + } + + break; + case 0x18: + switch(ASCQ) + { + case 0x00: + return "RECOVERED DATA WITH ERROR CORRECTION APPLIED"; + case 0x01: + return "RECOVERED DATA WITH ERROR CORRECTION & RETRIES APPLIED"; + case 0x02: + return "RECOVERED DATA - DATA AUTO-REALLOCATED"; + case 0x03: + return "RECOVERED DATA WITH CIRC"; + case 0x04: + return "RECOVERED DATA WITH L-EC"; + case 0x05: + return "RECOVERED DATA - RECOMMENDED REASSIGNMENT"; + case 0x06: + return "RECOVERED DATA - RECOMMENDED REWRITE"; + case 0x07: + return "RECOVERED DATA WITH ECC - DATA REWRITTEN"; + case 0x08: + return "RECOVERED DATA WITH LINKING"; + } + + break; + case 0x19: + switch(ASCQ) + { + case 0x00: + return "DEFECT LIST ERROR"; + case 0x01: + return "DEFECT LIST NOT AVAILABLE"; + case 0x02: + return "DEFECT LIST ERROR IN PRIMARY LIST"; + case 0x03: + return "DEFECT LIST ERROR IN GROWN LIST"; + } + + break; + case 0x1A: + switch(ASCQ) + { + case 0x00: + return "PARAMETER LIST LENGTH ERROR"; + } + + break; + case 0x1B: + switch(ASCQ) + { + case 0x00: + return "SYNCHRONOUS DATA TRANSFER ERROR"; + } + + break; + case 0x1C: + switch(ASCQ) + { + case 0x00: + return "DEFECT LIST NOT FOUND"; + case 0x01: + return "PRIMARY DEFECT LIST NOT FOUND"; + case 0x02: + return "GROWN DEFECT LIST NOT FOUND"; + } + + break; + case 0x1D: + switch(ASCQ) + { + case 0x00: + return "MISCOMPARE DURING VERIFY OPERATION"; + case 0x01: + return "MISCOMPARE VERIFY OF UNMAPPED LBA"; + } + + break; + case 0x1E: + switch(ASCQ) + { + case 0x00: + return "RECOVERED ID WITH ECC CORRECTION"; + } + + break; + case 0x1F: + switch(ASCQ) + { + case 0x00: + return "PARTIAL DEFECT LIST TRANSFER"; + } + + break; + case 0x20: + switch(ASCQ) + { + case 0x00: + return "INVALID COMMAND OPERATION CODE"; + case 0x01: + return "ACCESS DENIED - INITIATOR PENDING-ENROLLED"; + case 0x02: + return "ACCESS DENIED - NO ACCESS RIGHTS"; + case 0x03: + return "ACCESS DENIED - INVALID MGMT ID KEY"; + case 0x04: + return "ILLEGAL COMMAND WHILE IN WRITE CAPABLE STATE"; + case 0x05: + return "ILLEGAL COMMAND WHILE IN READ CAPABLE STATE"; + case 0x06: + return "ILLEGAL COMMAND WHILE IN EXPLICIT ADDRESS MODE"; + case 0x07: + return "ILLEGAL COMMAND WHILE IN IMPLICIT ADDRESS MODE"; + case 0x08: + return "ACCESS DENIED - ENROLLMENT CONFLICT"; + case 0x09: + return "ACCESS DENIED - INVALID LUN IDENTIFIER"; + case 0x0A: + return "ACCESS DENIED - INVALID PROXY TOKEN"; + case 0x0B: + return "ACCESS DENIED - ACL LUN CONFLICT"; + case 0x0C: + return "ILLEGAL COMMAND WHEN NOT IN APPEND-ONLY MODE"; + } + + break; + case 0x21: + switch(ASCQ) + { + case 0x00: + return "LOGICAL BLOCK ADDRESS OUT OF RANGE"; + case 0x01: + return "INVALID ELEMENT ADDRESS"; + case 0x02: + return "INVALID ADDRESS FOR WRITE"; + case 0x03: + return "INVALID WRITE CROSSING LAYER JUMP"; + case 0x04: + return "UNALIGNED WRITE COMMAND"; + case 0x05: + return "WRITE BOUNDARY VIOLATION"; + case 0x06: + return "ATTEMPT TO READ INVALID DATA"; + case 0x07: + return "READ BOUNDARY VIOLATION"; + } + + break; + case 0x22: + switch(ASCQ) + { + case 0x00: + return "ILLEGAL FUNCTION"; + } + + break; + case 0x23: + switch(ASCQ) + { + case 0x00: + return "INVALID TOKEN OPERATION, CAUSE NOT REPORTABLE"; + case 0x01: + return "INVALID TOKEN OPERATION, UNSUPPORTED TOKEN TYPE"; + case 0x02: + return "INVALID TOKEN OPERATION, REMOTE TOKEN USAGE NOT SUPPORTED"; + case 0x03: + return "INVALID TOKEN OPERATION, REMOTE ROD TOKEN CREATION NOT SUPPORTED"; + case 0x04: + return "INVALID TOKEN OPERATION, TOKEN UNKNOWN"; + case 0x05: + return "INVALID TOKEN OPERATION, TOKEN CORRUPT"; + case 0x06: + return "INVALID TOKEN OPERATION, TOKEN REVOKED"; + case 0x07: + return "INVALID TOKEN OPERATION, TOKEN EXPIRED"; + case 0x08: + return "INVALID TOKEN OPERATION, TOKEN CANCELLED"; + case 0x09: + return "INVALID TOKEN OPERATION, TOKEN DELETED"; + case 0x0A: + return "INVALID TOKEN OPERATION, INVALID TOKEN LENGTH"; + } + + break; + case 0x24: + switch(ASCQ) + { + case 0x00: + return "ILLEGAL FIELD IN CDB"; + case 0x01: + return "CDB DECRYPTION ERROR"; + case 0x02: + return "INVALID CDB FIELD WHILE IN EXPLICIT BLOCK ADDRESS MODEL"; + case 0x03: + return "INVALID CDB FIELD WHILE IN IMPLICIT BLOCK ADDRESS MODEL"; + case 0x04: + return "SECURITY AUDIT VALUE FROZEN"; + case 0x05: + return "SECURITY WORKING KEY FROZEN"; + case 0x06: + return "NONCE NOT UNIQUE"; + case 0x07: + return "NONCE TIMESTAMP OUT OF RANGE"; + case 0x08: + return "INVALID XCDB"; + } + + break; + case 0x25: + switch(ASCQ) + { + case 0x00: + return "LOGICAL UNIT NOT SUPPORTED"; + } + + break; + case 0x26: + switch(ASCQ) + { + case 0x00: + return "INVALID FIELD IN PARAMETER LIST"; + case 0x01: + return "PARAMETER NOT SUPPORTED"; + case 0x02: + return "PARAMETER VALUE INVALID"; + case 0x03: + return "THRESHOLD PARAMETERS NOT SUPPORTED"; + case 0x04: + return "INVALID RELEASE OF PERSISTENT RESERVATION"; + case 0x05: + return "DATA DECRYPTION ERROR"; + case 0x06: + return "TOO MANY TARGET DESCRIPTORS"; + case 0x07: + return "UNSUPPORTED TARGET DESCRIPTOR TYPE CODE"; + case 0x08: + return "TOO MANY SEGMENT DESCRIPTORS"; + case 0x09: + return "UNSUPPORTED SEGMENT DESCRIPTOR TYPE CODE"; + case 0x0A: + return "UNEXPECTED INEXACT SEGMENT"; + case 0x0B: + return "INLINE DATA LENGTH EXCEEDED"; + case 0x0C: + return "INVALID OPERATION FOR COPY SOURCE OR DESTINATION"; + case 0x0D: + return "COPY SEGMENT GRANULARITY VIOLATION"; + case 0x0E: + return "INVALID PARAMETER WHILE PORT IS ENABLED"; + case 0x0F: + return "INVALID DATA-OUT BUFFER INTEGRITY CHECK VALUE"; + case 0x10: + return "DATA DECRYPTION KEY FAIL LIMIT REACHED"; + case 0x11: + return "INCOMPLETE KEY-ASSOCIATED DATA SET"; + case 0x12: + return "VENDOR SPECIFIC KEY REFERENCE NOT FOUND"; + case 0x13: + return "APPLICATION TAG MODE PAGE IS INVALID"; + } + + break; + case 0x27: + switch(ASCQ) + { + case 0x00: + return "WRITE PROTECTED"; + case 0x01: + return "HARDWARE WRITE PROTECTED"; + case 0x02: + return "LOGICAL UNIT SOFTWARE WRITE PROTECTED"; + case 0x03: + return "ASSOCIATED WRITE PROTECT"; + case 0x04: + return "PERSISTENT WRITE PROTECT"; + case 0x05: + return "PERMANENT WRITE PROTECT"; + case 0x06: + return "CONDITIONAL WRITE PROTECT"; + case 0x07: + return "SPACE ALLOCATION FAILED WRITE PROTECT"; + case 0x08: + return "ZONE IS READ ONLY"; + } + + break; + case 0x28: + switch(ASCQ) + { + case 0x00: + return "NOT READY TO READY CHANGE (MEDIUM MAY HAVE CHANGED)"; + case 0x01: + return "IMPORT OR EXPORT ELEMENT ACCESSED"; + case 0x02: + return "FORMAT-LAYER MAY HAVE CHANGED"; + case 0x03: + return "IMPORT/EXPORT ELEMENT ACCESSED, MEDIUM CHANGED"; + } + + break; + case 0x29: + switch(ASCQ) + { + case 0x00: + return "POWER ON, RESET, OR BUS DEVICE RESET OCCURRED"; + case 0x01: + return "POWER ON OCCURRED"; + case 0x02: + return "SCSI BUS RESET OCCURRED"; + case 0x03: + return "BUS DEVICE RESET FUNCTION OCCURRED"; + case 0x04: + return "DEVICE INTERNAL RESET"; + case 0x05: + return "TRANSCEIVER MODE CHANGED TO SINGLE-ENDED"; + case 0x06: + return "TRANSCEIVER MODE CHANGED TO LVD"; + case 0x07: + return "I_T NEXUS LOSS OCCURRED"; + } + + break; + case 0x2A: + switch(ASCQ) + { + case 0x00: + return "PARAMETERS CHANGED"; + case 0x01: + return "MODE PARAMETERS CHANGED"; + case 0x02: + return "LOG PARAMETERS CHANGED"; + case 0x03: + return "RESERVATIONS PREEMPTED"; + case 0x04: + return "RESERVATIONS RELEASED"; + case 0x05: + return "REGISTRATIONS PREEMPTED"; + case 0x06: + return "ASYMMETRIC ACCESS STATE CHANGED"; + case 0x07: + return "IMPLICIT ASYMMETRIC ACCESS STATE TRANSITION FAILED"; + case 0x08: + return "PRIORITY CHANGED"; + case 0x09: + return "CAPACITY DATA HAS CHANGED"; + case 0x0A: + return "ERROR HISTORY I_T NEXUS CLEARED"; + case 0x0B: + return "ERROR HISTORY SNAPSHOT RELEASED"; + case 0x0C: + return "ERROR RECOVERY ATTRIBUTES HAVE CHANGED"; + case 0x0D: + return "DATA ENCRYPTION CAPABILITIES CHANGED"; + case 0x10: + return "TIMESTAMP CHANGED"; + case 0x11: + return "DATA ENCRYPTION PARAMETERS CHANGED BY ANOTHER I_T NEXUS"; + case 0x12: + return "DATA ENCRYPTION PARAMETERS CHANGED BY VENDOR SPECIFIC EVENT"; + case 0x13: + return "DATA ENCRYPTION KEY INSTANCE COUNTER HAS CHANGED"; + case 0x14: + return "SA CREATION CAPABILITIES DATA HAS CHANGED"; + case 0x15: + return "MEDIUM REMOVAL PREVENTION PREEMPTED"; + } + + break; + case 0x2B: + switch(ASCQ) + { + case 0x00: + return "COPY CANNOT EXECUTE SINCE HOST CANNOT DISCONNECT"; + } + + break; + case 0x2C: + switch(ASCQ) + { + case 0x00: + return "COMMAND SEQUENCE ERROR"; + case 0x01: + return "TOO MANY WINDOWS SPECIFIED"; + case 0x02: + return "INVALID COMBINATION OF WINDOWS SPECIFIED"; + case 0x03: + return "CURRENT PROGRAM AREA IS NOT EMPTY"; + case 0x04: + return "CURRENT PROGRAM AREA IS EMPTY"; + case 0x05: + return "ILLEGAL POWER CONDITION REQUEST"; + case 0x06: + return "PERSISTENT PREVENT CONFLICT"; + case 0x07: + return "PREVIOUS BUSY STATUS"; + case 0x08: + return "PREVIOUS TASK SET FULL STATUS"; + case 0x09: + return "PREVIOUS RESERVATION CONFLICT STATUS"; + case 0x0A: + return "PARTITION OR COLLECTION CONTAINS USER OBJECTS"; + case 0x0B: + return "NOT RESERVED"; + case 0x0C: + return "ORWRITE GENERATION DOES NOT MATCH"; + case 0x0D: + return "RESET WRITE POINTER NOT ALLOWED"; + case 0x0E: + return "ZONE IS OFFLINE"; + case 0x0F: + return "STREAM NOT OPEN"; + case 0x10: + return "UNWRITTEN DATA IN ZONE"; + } + + break; + case 0x2D: + switch(ASCQ) + { + case 0x00: + return "OVERWRITE ERROR ON UPDATE IN PLACE"; + } + + break; + case 0x2E: + switch(ASCQ) + { + case 0x00: + return "INSUFFICIENT TIME FOR OPERATION"; + case 0x01: + return "COMMAND TIMEOUT BEFORE PROCESSING"; + case 0x02: + return "COMMAND TIMEOUT DURING PROCESSING"; + case 0x03: + return "COMMAND TIMEOUT DURING PROCESSING DUE TO ERROR RECOVERY"; + } + + break; + case 0x2F: + switch(ASCQ) + { + case 0x00: + return "COMMANDS CLEARED BY ANOTHER INITIATOR"; + case 0x01: + return "COMMANDS CLEARED BY POWER LOSS NOTIFICATION"; + case 0x02: + return "COMMANDS CLEARED BY DEVICE SERVER"; + case 0x03: + return "SOME COMMANDS CLEARED BY QUEUING LAYER EVENT"; + } + + break; + case 0x30: + switch(ASCQ) + { + case 0x00: + return "INCOMPATIBLE MEDIUM INSTALLED"; + case 0x01: + return "CANNOT READ MEDIUM - UNKNOWN FORMAT"; + case 0x02: + return "CANNOT READ MEDIUM - INCOMPATIBLE FORMAT"; + case 0x03: + return "CLEANING CARTRIDGE INSTALLED"; + case 0x04: + return "CANNOT WRITE MEDIUM - UNKNOWN FORMAT"; + case 0x05: + return "CANNOT WRITE MEDIUM - INCOMPATIBLE FORMAT"; + case 0x06: + return "CANNOT FORMAT MEDIUM - INCOMPATIBLE MEDIUM"; + case 0x07: + return "CLEANING FAILURE"; + case 0x08: + return "CANNOT WRITE - APPLICATION CODE MISMATCH"; + case 0x09: + return "CURRENT SESSION NOT FIXATED FOR APPEND"; + case 0x0A: + return "CLEANING REQUEST REJECTED"; + case 0x0C: + return "WORM MEDIUM - OVERWRITE ATTEMPTED"; + case 0x0D: + return "WORM MEDIUM - INTEGRITY CHECK"; + case 0x10: + return "MEDIUM NOT FORMATTED"; + case 0x11: + return "INCOMPATIBLE VOLUME TYPE"; + case 0x12: + return "INCOMPATIBLE VOLUME QUALIFIER"; + case 0x13: + return "CLEANING VOLUME EXPIRED"; + } + + break; + case 0x31: + switch(ASCQ) + { + case 0x00: + return "MEDIUM FORMAT CORRUPTED"; + case 0x01: + return "FORMAT COMMAND FAILED"; + case 0x02: + return "ZONED FORMATTING FAILED DUE TO SPARE LINKING"; + case 0x03: + return "SANITIZE COMMAND FAILED"; + } + + break; + case 0x32: + switch(ASCQ) + { + case 0x00: + return "NO DEFECT SPARE LOCATION AVAILABLE"; + case 0x01: + return "DEFECT LIST UPDATE FAILURE"; + } + + break; + case 0x33: + switch(ASCQ) + { + case 0x00: + return "TAPE LENGTH ERROR"; + } + + break; + case 0x34: + switch(ASCQ) + { + case 0x00: + return "ENCLOSURE FAILURE"; + } + + break; + case 0x35: + switch(ASCQ) + { + case 0x00: + return "ENCLOSURE SERVICES FAILURE"; + case 0x01: + return "UNSUPPORTED ENCLOSURE FUNCTION"; + case 0x02: + return "ENCLOSURE SERVICES UNAVAILABLE"; + case 0x03: + return "ENCLOSURE SERVICES TRANSFER FAILURE"; + case 0x04: + return "ENCLOSURE SERVICES TRANSFER REFUSED"; + case 0x05: + return "ENCLOSURE SERVICES CHECKSUM ERROR"; + } + + break; + case 0x36: + switch(ASCQ) + { + case 0x00: + return "RIBBON, INK, OR TONER FAILURE"; + } + + break; + case 0x37: + switch(ASCQ) + { + case 0x00: + return "ROUNDED PARAMETER"; + } + + break; + case 0x38: + switch(ASCQ) + { + case 0x00: + return "EVENT STATUS NOTIFICATION"; + case 0x02: + return "ESN - POWER MANAGEMENT CLASS EVENT"; + case 0x04: + return "ESN - MEDIA CLASS EVENT"; + case 0x06: + return "ESN - DEVICE BUSY CLASS EVENT"; + case 0x07: + return "THIN PROVISIONING SOFT THRESHOLD REACHED"; + } + + break; + case 0x39: + switch(ASCQ) + { + case 0x00: + return "SAVING PARAMETERS NOT SUPPORTED"; + } + + break; + case 0x3A: + switch(ASCQ) + { + case 0x00: + return "MEDIUM NOT PRESENT"; + case 0x01: + return "MEDIUM NOT PRESENT - TRAY CLOSED"; + case 0x02: + return "MEDIUM NOT PRESENT - TRAY OPEN"; + case 0x03: + return "MEDIUM NOT PRESENT - LOADABLE"; + case 0x04: + return "MEDIUM NOT PRESENT - MEDIUM AUXILIARY MEMORY ACCESSIBLE"; + } + + break; + case 0x3B: + switch(ASCQ) + { + case 0x00: + return "SEQUENTIAL POSITIONING ERROR"; + case 0x01: + return "TAPE POSITION ERROR AT BEGINNING-OF-MEDIUM"; + case 0x02: + return "TAPE POSITION ERROR AT END-OF-MEDIUM"; + case 0x03: + return "TAPE OR ELECTRONIC VERTICAL FORMS UNIT NOT READY"; + case 0x04: + return "SLEW FAILURE"; + case 0x05: + return "PAPER JAM"; + case 0x06: + return "FAILED TO SENSE TOP-OF-FORM"; + case 0x07: + return "FAILED TO SENSE BOTTOM-OF-FORM"; + case 0x08: + return "REPOSITION ERROR"; + case 0x09: + return "READ PAST END OF MEDIUM"; + case 0x0A: + return "READ PAST BEGINNING OF MEDIUM"; + case 0x0B: + return "POSITION PAST END OF MEDIUM"; + case 0x0C: + return "POSITION PAST BEGINNING OF MEDIUM"; + case 0x0D: + return "MEDIUM DESTINATION ELEMENT FULL"; + case 0x0E: + return "MEDIUM SOURCE ELEMENT EMPTY"; + case 0x0F: + return "END OF MEDIUM REACHED"; + case 0x11: + return "MEDIUM MAGAZINE NOT ACCESSIBLE"; + case 0x12: + return "MEDIUM MAGAZINE REMOVED"; + case 0x13: + return "MEDIUM MAGAZINE INSERTED"; + case 0x14: + return "MEDIUM MAGAZINE LOCKED"; + case 0x15: + return "MEDIUM MAGAZINE UNLOCKED"; + case 0x16: + return "MECHANICAL POSITIONING OR CHANGER ERROR"; + case 0x17: + return "READ PAST END OF USER OBJECT"; + case 0x18: + return "ELEMENT DISABLED"; + case 0x19: + return "ELEMENT ENABLED"; + case 0x1A: + return "DATA TRANSFER DEVICE REMOVED"; + case 0x1B: + return "DATA TRANSFER DEVICE INSERTED"; + case 0x1C: + return "TOO MANY LOGICAL OBJECTS ON PARTITION TO SUPPORT OPERATION"; + } + + break; + case 0x3D: + switch(ASCQ) + { + case 0x00: + return "INVALID BITS IN IDENTIFY MESSAGE"; + } + + break; + case 0x3E: + switch(ASCQ) + { + case 0x00: + return "LOGICAL UNIT HAS NOT SELF-CONFIGURED YET"; + case 0x01: + return "LOGICAL UNIT FAILURE"; + case 0x02: + return "TIMEOUT ON LOGICAL UNIT"; + case 0x03: + return "LOGICAL UNIT FAILED SELF-TEST"; + case 0x04: + return "LOGICAL UNIT UNABLE TO UPDATE SELF-TEST LOG"; + } + + break; + case 0x3F: + switch(ASCQ) + { + case 0x00: + return "TARGET OPERATING CONDITIONS HAVE CHANGED"; + case 0x01: + return "MICROCODE HAS BEEN CHANGED"; + case 0x02: + return "CHANGED OPERATING DEFINITION"; + case 0x03: + return "INQUIRY DATA HAS CHANGED"; + case 0x04: + return "COMPONENT DEVICE ATTACHED"; + case 0x05: + return "DEVICE IDENTIFIED CHANGED"; + case 0x06: + return "REDUNDANCY GROUP CREATED OR MODIFIED"; + case 0x07: + return "REDUNDANCY GROUP DELETED"; + case 0x08: + return "SPARE CREATED OR MODIFIED"; + case 0x09: + return "SPARE DELETED"; + case 0x0A: + return "VOLUME SET CREATED OR MODIFIED"; + case 0x0B: + return "VOLUME SET DELETED"; + case 0x0C: + return "VOLUME SET DEASSIGNED"; + case 0x0D: + return "VOLUME SET REASSIGNED"; + case 0x0E: + return "REPORTED LUNS DATA HAS CHANGED"; + case 0x0F: + return "ECHO BUFFER OVERWRITTEN"; + case 0x10: + return "MEDIUM LOADABLE"; + case 0x11: + return "MEDIUM AUXILIARY MEMORY ACCESSIBLE"; + case 0x12: + return "iSCSI IP ADDRESS ADDED"; + case 0x13: + return "iSCSI IP ADDRESS REMOVED"; + case 0x14: + return "iSCSI IP ADDRESS CHANGED"; + case 0x15: + return "INSPECT REFERRALS SENSE DESCRIPTORS"; + case 0x16: + return "MICROCODE HAS BEEN CHANGED WITHOUT RESET"; + case 0x17: + return "ZONE TRANSITION TO FULL"; + } + + break; + case 0x40: + return ASCQ switch + { + 0x00 => "RAM FAILURE", + _ => $"DIAGNOSTIC FAILURE ON COMPONENT {ASCQ:X2}h" + }; + case 0x41: + switch(ASCQ) + { + case 0x00: + return "DATA PATH FAILURE"; + } + + break; + case 0x42: + switch(ASCQ) + { + case 0x00: + return "POWER-ON OR SELF-TEST FAILURE"; + } + + break; + case 0x43: + switch(ASCQ) + { + case 0x00: + return "MESSAGE ERROR"; + } + + break; + case 0x44: + switch(ASCQ) + { + case 0x00: + return "INTERNAL TARGET FAILURE"; + case 0x01: + return "PERSISTENT RESERVATION INFORMATION LOST"; + case 0x71: + return "ATA DEVICE FAILED SET FEATURES"; + } + + break; + case 0x45: + switch(ASCQ) + { + case 0x00: + return "SELECT OR RESELECT FAILURE"; + } + + break; + case 0x46: + switch(ASCQ) + { + case 0x00: + return "UNSUCCESSFUL SOFT RESET"; + } + + break; + case 0x47: + switch(ASCQ) + { + case 0x00: + return "SCSI PARITY ERROR"; + case 0x01: + return "DATA PHASE CRC ERROR DETECTED"; + case 0x02: + return "SCSI PARITY ERROR DETECTED DURING ST DATA PHASE"; + case 0x03: + return "INFORMATION UNIT iuCRC ERROR DETECTED"; + case 0x04: + return "ASYNCHRONOUS INFORMATION PROTECTION ERROR DETECTED"; + case 0x05: + return "PROTOCOL SERVICE CRC ERROR"; + case 0x06: + return "PHY TEST FUNCTION IN PROGRESS"; + case 0x7F: + return "SOME COMMANDS CLEARED BY iSCSI PROTOCOL EVENT"; + } + + break; + case 0x48: + switch(ASCQ) + { + case 0x00: + return "INITIATOR DETECTED ERROR MESSAGE RECEIVED"; + } + + break; + case 0x49: + switch(ASCQ) + { + case 0x00: + return "INVALID MESSAGE ERROR"; + } + + break; + case 0x4A: + switch(ASCQ) + { + case 0x00: + return "COMMAND PHASE ERROR"; + } + + break; + case 0x4B: + switch(ASCQ) + { + case 0x00: + return "DATA PHASE ERROR"; + case 0x01: + return "INVALID TARGET PORT TRANSFER TAG RECEIVED"; + case 0x02: + return "TOO MUCH WRITE DATA"; + case 0x03: + return "ACK/NAK TIMEOUT"; + case 0x04: + return "NAK RECEIVED"; + case 0x05: + return "DATA OFFSET ERROR"; + case 0x06: + return "INITIATOR RESPONSE TIMEOUT"; + case 0x07: + return "CONNECTION LOST"; + case 0x08: + return "DATA-IN BUFFER OVERFLOW - DATA BUFFER SIZE"; + case 0x09: + return "DATA-IN BUFFER OVERFLOW - DATA BUFFER DESCRIPTOR AREA"; + case 0x0A: + return "DATA-IN BUFFER ERROR"; + case 0x0B: + return "DATA-OUT BUFFER OVERFLOW - DATA BUFFER SIZE"; + case 0x0C: + return "DATA-OUT BUFFER OVERFLOW - DATA BUFFER DESCRIPTOR AREA"; + case 0x0D: + return "DATA-OUT BUFFER ERROR"; + case 0x0E: + return "PCIe FABRIC ERROR"; + case 0x0F: + return "PCIe COMPLETION TIMEOUT"; + case 0x10: + return "PCIe COMPLETION ABORT"; + case 0x11: + return "PCIe POISONED TLP RECEIVED"; + case 0x12: + return "PCIe ECRC CHECK FAILED"; + case 0x13: + return "PCIe UNSUPPORTED REQUEST"; + case 0x14: + return "PCIe ACS VIOLATION"; + case 0x15: + return "PCIe TLP PREFIX BLOCKED"; + } + + break; + case 0x4C: + switch(ASCQ) + { + case 0x00: + return "LOGICAL UNIT FAILED SELF-CONFIGURATION"; + } + + break; + case 0x4E: + return $"OVERLAPPED COMMANDS ATTEMPTED FOR TASK TAG {ASCQ:X2}h"; + case 0x50: + switch(ASCQ) + { + case 0x00: + return "WRITE APPEND ERROR"; + case 0x01: + return "WRITE APPEND POSITION ERROR"; + case 0x02: + return "POSITION ERROR RELATED TO TIMING"; + } + + break; + case 0x51: + switch(ASCQ) + { + case 0x00: + return "ERASE FAILURE"; + case 0x01: + return "ERASE FAILURE - INCOMPLETE ERASE OPERATION DETECTED"; + } + + break; + case 0x52: + switch(ASCQ) + { + case 0x00: + return "CARTRIDGE FAULT"; + } + + break; + case 0x53: + switch(ASCQ) + { + case 0x00: + return "MEDIA LOAD OR EJECT FAILED"; + case 0x01: + return "UNLOAD TAPE FAILURE"; + case 0x02: + return "MEDIUM REMOVAL PREVENTED"; + case 0x03: + return "MEDIUM REMOVAL PREVENTED BY DATA TRANSFER ELEMENT"; + case 0x04: + return "MEDIUM THREAD OR UNTHREAD FAILURE"; + case 0x05: + return "VOLUME IDENTIFIER INVALID"; + case 0x06: + return "VOLUME IDENTIFIED MISSING"; + case 0x07: + return "DUPLICATE VOLUME IDENTIFIER"; + case 0x08: + return "ELEMENT STATUS UNKNOWN"; + case 0x09: + return "DATA TRANSFER DEVICE ERROR - LOAD FAILED"; + case 0x0A: + return "DATA TRANSFER DEVICE ERROR - UNLOAD FAILED"; + case 0x0B: + return "DATA TRANSFER DEVICE ERROR - UNLOAD MISSING"; + case 0x0C: + return "DATA TRANSFER DEVICE ERROR - EJECT FAILED"; + case 0x0D: + return "DATA TRANSFER DEVICE ERROR - LIBRARY COMMUNICATION FAILED"; + } + + break; + case 0x54: + switch(ASCQ) + { + case 0x00: + return "SCSI TO HOST SYSTEM INTERFACE FAILURE"; + } + + break; + case 0x55: + switch(ASCQ) + { + case 0x00: + return "SYSTEM RESOURCE FAILURE"; + case 0x01: + return "SYSTEM BUFFER FULL"; + case 0x02: + return "INSUFFICIENT RESERVATION RESOURCES"; + case 0x03: + return "INSUFFICIENT RESOURCES"; + case 0x04: + return "INSUFFICIENT REGISTRATION RESOURCES"; + case 0x05: + return "INSUFFICIENT ACCESS CONTROL RESOURCES"; + case 0x06: + return "AUXILIARY MEMORY OUT OF SPACE"; + case 0x07: + return "QUOTA ERROR"; + case 0x08: + return "MAXIMUM NUMBER OF SUPPLEMENTAL DECRYPTION KEYS EXCEEDED"; + case 0x09: + return "MEDIUM AUXILIARY MEMORY NOT ACCESSIBLE"; + case 0x0A: + return "DATA CURRENTLY UNAVAILABLE"; + case 0x0B: + return "INSUFFICIENT POWER FOR OPERATION"; + case 0x0C: + return "INSUFFICIENT RESOURCES TO CREATE ROD"; + case 0x0D: + return "INSUFFICIENT RESOURCES TO CREATE ROD TOKEN"; + case 0x0E: + return "INSUFFICIENT ZONE RESOURCES"; + case 0x0F: + return "INSUFFICIENT ZONE RESOURCES TO COMPLETE WRITE"; + case 0x10: + return "MAXIMUM NUMBER OF STREAMS OPEN"; + } + + break; + case 0x57: + switch(ASCQ) + { + case 0x00: + return "UNABLE TO RECOVER TABLE-OF-CONTENTS"; + } + + break; + case 0x58: + switch(ASCQ) + { + case 0x00: + return "GENERATION DOES NOT EXIST"; + } + + break; + case 0x59: + switch(ASCQ) + { + case 0x00: + return "UPDATED BLOCK READ"; + } + + break; + case 0x5A: + switch(ASCQ) + { + case 0x00: + return "OPERATOR REQUEST OR STATE CHANGE INPUT"; + case 0x01: + return "OPERATOR MEDIUM REMOVAL REQUEST"; + case 0x02: + return "OPERATOR SELECTED WRITE PROTECT"; + case 0x03: + return "OPERATOR SELECTED WRITE PERMIT"; + } + + break; + case 0x5B: + switch(ASCQ) + { + case 0x00: + return "LOG EXCEPTION"; + case 0x01: + return "THRESHOLD CONDITION MET"; + case 0x02: + return "LOG COUNTER AT MAXIMUM"; + case 0x03: + return "LOG LIST CODES EXHAUSTED"; + } + + break; + case 0x5C: + switch(ASCQ) + { + case 0x00: + return "RPL STATUS CHANGE"; + case 0x01: + return "SPINDLES SYNCHRONIZED"; + case 0x02: + return "SPINDLES NOT SYNCHRONIZED"; + case 0x03: + return "SPARE AREA EXHAUSTION PREDICTION THRESHOLD EXCEEDED"; + case 0x10: + return "HARDWARE IMPENDING FAILURE GENERAL HARD DRIVE FAILURE"; + case 0x11: + return "HARDWARE IMPENDING FAILURE DRIVE ERROR RATE TOO HIGH"; + case 0x12: + return "HARDWARE IMPENDING FAILURE DATA ERROR RATE TOO HIGH"; + case 0x13: + return "HARDWARE IMPENDING FAILURE SEEK ERROR RATE TOO HIGH"; + case 0x14: + return "HARDWARE IMPENDING FAILURE TOO MANY BLOCK REASSIGNS"; + case 0x15: + return "HARDWARE IMPENDING FAILURE ACCESS TIME TOO HIGH"; + case 0x16: + return "HARDWARE IMPENDING FAILURE START UNIT TIMES TOO HIGH"; + case 0x17: + return "HARDWARE IMPENDING FAILURE CHANNEL PARAMETRICS"; + case 0x18: + return "HARDWARE IMPENDING FAILURE CONTROLLER DETECTED"; + case 0x19: + return "HARDWARE IMPENDING FAILURE THROUGHPUT PERFORMANCE"; + case 0x1A: + return "HARDWARE IMPENDING FAILURE SEEK TIME PERFORMANCE"; + case 0x1B: + return "HARDWARE IMPENDING FAILURE SPIN-UP RETRY COUNT"; + case 0x1C: + return "HARDWARE IMPENDING FAILURE DRIVE CALIBRATION RETRY COUNT"; + case 0x20: + return "CONTROLLER IMPENDING FAILURE GENERAL HARD DRIVE FAILURE"; + case 0x21: + return "CONTROLLER IMPENDING FAILURE DRIVE ERROR RATE TOO HIGH"; + case 0x22: + return "CONTROLLER IMPENDING FAILURE DATA ERROR RATE TOO HIGH"; + case 0x23: + return "CONTROLLER IMPENDING FAILURE SEEK ERROR RATE TOO HIGH"; + case 0x24: + return "CONTROLLER IMPENDING FAILURE TOO MANY BLOCK REASSIGNS"; + case 0x25: + return "CONTROLLER IMPENDING FAILURE ACCESS TIME TOO HIGH"; + case 0x26: + return "CONTROLLER IMPENDING FAILURE START UNIT TIMES TOO HIGH"; + case 0x27: + return "CONTROLLER IMPENDING FAILURE CHANNEL PARAMETRICS"; + case 0x28: + return "CONTROLLER IMPENDING FAILURE CONTROLLER DETECTED"; + case 0x29: + return "CONTROLLER IMPENDING FAILURE THROUGHPUT PERFORMANCE"; + case 0x2A: + return "CONTROLLER IMPENDING FAILURE SEEK TIME PERFORMANCE"; + case 0x2B: + return "CONTROLLER IMPENDING FAILURE SPIN-UP RETRY COUNT"; + case 0x2C: + return "CONTROLLER IMPENDING FAILURE DRIVE CALIBRATION RETRY COUNT"; + case 0x30: + return "DATA CHANNEL IMPENDING FAILURE GENERAL HARD DRIVE FAILURE"; + case 0x31: + return "DATA CHANNEL IMPENDING FAILURE DRIVE ERROR RATE TOO HIGH"; + case 0x32: + return "DATA CHANNEL IMPENDING FAILURE DATA ERROR RATE TOO HIGH"; + case 0x33: + return "DATA CHANNEL IMPENDING FAILURE SEEK ERROR RATE TOO HIGH"; + case 0x34: + return "DATA CHANNEL IMPENDING FAILURE TOO MANY BLOCK REASSIGNS"; + case 0x35: + return "DATA CHANNEL IMPENDING FAILURE ACCESS TIME TOO HIGH"; + case 0x36: + return "DATA CHANNEL IMPENDING FAILURE START UNIT TIMES TOO HIGH"; + case 0x37: + return "DATA CHANNEL IMPENDING FAILURE CHANNEL PARAMETRICS"; + case 0x38: + return "DATA CHANNEL IMPENDING FAILURE DATA CHANNEL DETECTED"; + case 0x39: + return "DATA CHANNEL IMPENDING FAILURE THROUGHPUT PERFORMANCE"; + case 0x3A: + return "DATA CHANNEL IMPENDING FAILURE SEEK TIME PERFORMANCE"; + case 0x3B: + return "DATA CHANNEL IMPENDING FAILURE SPIN-UP RETRY COUNT"; + case 0x3C: + return "DATA CHANNEL IMPENDING FAILURE DRIVE CALIBRATION RETRY COUNT"; + case 0x40: + return "SERVO IMPENDING FAILURE GENERAL HARD DRIVE FAILURE"; + case 0x41: + return "SERVO IMPENDING FAILURE DRIVE ERROR RATE TOO HIGH"; + case 0x42: + return "SERVO IMPENDING FAILURE DATA ERROR RATE TOO HIGH"; + case 0x43: + return "SERVO IMPENDING FAILURE SEEK ERROR RATE TOO HIGH"; + case 0x44: + return "SERVO IMPENDING FAILURE TOO MANY BLOCK REASSIGNS"; + case 0x45: + return "SERVO IMPENDING FAILURE ACCESS TIME TOO HIGH"; + case 0x46: + return "SERVO IMPENDING FAILURE START UNIT TIMES TOO HIGH"; + case 0x47: + return "SERVO IMPENDING FAILURE CHANNEL PARAMETRICS"; + case 0x48: + return "SERVO IMPENDING FAILURE SERVO DETECTED"; + case 0x49: + return "SERVO IMPENDING FAILURE THROUGHPUT PERFORMANCE"; + case 0x4A: + return "SERVO IMPENDING FAILURE SEEK TIME PERFORMANCE"; + case 0x4B: + return "SERVO IMPENDING FAILURE SPIN-UP RETRY COUNT"; + case 0x4C: + return "SERVO IMPENDING FAILURE DRIVE CALIBRATION RETRY COUNT"; + case 0x50: + return "SPINDLE IMPENDING FAILURE GENERAL HARD DRIVE FAILURE"; + case 0x51: + return "SPINDLE IMPENDING FAILURE DRIVE ERROR RATE TOO HIGH"; + case 0x52: + return "SPINDLE IMPENDING FAILURE DATA ERROR RATE TOO HIGH"; + case 0x53: + return "SPINDLE IMPENDING FAILURE SEEK ERROR RATE TOO HIGH"; + case 0x54: + return "SPINDLE IMPENDING FAILURE TOO MANY BLOCK REASSIGNS"; + case 0x55: + return "SPINDLE IMPENDING FAILURE ACCESS TIME TOO HIGH"; + case 0x56: + return "SPINDLE IMPENDING FAILURE START UNIT TIMES TOO HIGH"; + case 0x57: + return "SPINDLE IMPENDING FAILURE CHANNEL PARAMETRICS"; + case 0x58: + return "SPINDLE IMPENDING FAILURE SPINDLE DETECTED"; + case 0x59: + return "SPINDLE IMPENDING FAILURE THROUGHPUT PERFORMANCE"; + case 0x5A: + return "SPINDLE IMPENDING FAILURE SEEK TIME PERFORMANCE"; + case 0x5B: + return "SPINDLE IMPENDING FAILURE SPIN-UP RETRY COUNT"; + case 0x5C: + return "SPINDLE IMPENDING FAILURE DRIVE CALIBRATION RETRY COUNT"; + case 0x60: + return "FIRMWARE IMPENDING FAILURE GENERAL HARD DRIVE FAILURE"; + case 0x61: + return "FIRMWARE IMPENDING FAILURE DRIVE ERROR RATE TOO HIGH"; + case 0x62: + return "FIRMWARE IMPENDING FAILURE DATA ERROR RATE TOO HIGH"; + case 0x63: + return "FIRMWARE IMPENDING FAILURE SEEK ERROR RATE TOO HIGH"; + case 0x64: + return "FIRMWARE IMPENDING FAILURE TOO MANY BLOCK REASSIGNS"; + case 0x65: + return "FIRMWARE IMPENDING FAILURE ACCESS TIME TOO HIGH"; + case 0x66: + return "FIRMWARE IMPENDING FAILURE START UNIT TIMES TOO HIGH"; + case 0x67: + return "FIRMWARE IMPENDING FAILURE CHANNEL PARAMETRICS"; + case 0x68: + return "FIRMWARE IMPENDING FAILURE FIRMWARE DETECTED"; + case 0x69: + return "FIRMWARE IMPENDING FAILURE THROUGHPUT PERFORMANCE"; + case 0x6A: + return "FIRMWARE IMPENDING FAILURE SEEK TIME PERFORMANCE"; + case 0x6B: + return "FIRMWARE IMPENDING FAILURE SPIN-UP RETRY COUNT"; + case 0x6C: + return "FIRMWARE IMPENDING FAILURE DRIVE CALIBRATION RETRY COUNT"; + case 0xFF: + return "FAILURE PREDICTION THRESHOLD EXCEEDED (FALSE)"; + } + + break; + case 0x5E: + switch(ASCQ) + { + case 0x00: + return "LOW POWER CONDITION ON"; + case 0x01: + return "IDLE CONDITION ACTIVATED BY TIMER"; + case 0x02: + return "STANDBY CONDITION ACTIVATED BY TIMER"; + case 0x03: + return "IDLE CONDITION ACTIVATED BY COMMAND"; + case 0x04: + return "STANDBY CONDITION ACTIVATED BY COMMAND"; + case 0x05: + return "IDLE_B CONDITION ACTIVATED BY TIMER"; + case 0x06: + return "IDLE_B CONDITION ACTIVATED BY COMMAND"; + case 0x07: + return "IDLE_C CONDITION ACTIVATED BY TIMER"; + case 0x08: + return "IDLE_C CONDITION ACTIVATED BY COMMAND"; + case 0x09: + return "STANDBY_Y CONDITION ACTIVATED BY TIMER"; + case 0x0A: + return "STANDBY_Y CONDITION ACTIVATED BY COMMAND"; + case 0x41: + return "POWER STATE CHANGED TO ACTIVE"; + case 0x42: + return "POWER STATE CHANGED TO IDLE"; + case 0x43: + return "POWER STATE CHANGED TO STANDBY"; + case 0x45: + return "POWER STATE CHANGED TO SLEEP"; + case 0x47: + return "POWER STATE CHANGED TO DEVICE CONTROL"; + } + + break; + case 0x60: + switch(ASCQ) + { + case 0x00: + return "LAMP FAILURE"; + } + + break; + case 0x61: + switch(ASCQ) + { + case 0x00: + return "VIDEO ACQUISITION ERROR"; + case 0x01: + return "UNABLE TO ACQUIRE VIDEO"; + case 0x02: + return "OUT OF FOCUS"; + } + + break; + case 0x62: + switch(ASCQ) + { + case 0x00: + return "SCAN HEAD POSITIONING ERROR"; + } + + break; + case 0x63: + switch(ASCQ) + { + case 0x00: + return "END OF USER AREA ENCOUNTERED ON THIS TRACK"; + case 0x01: + return "PACKET DOES NOT FIT IN AVAILABLE SPACE"; + } + + break; + case 0x64: + switch(ASCQ) + { + case 0x00: + return "ILLEGAL MODE FOR THIS TRACK"; + case 0x01: + return "INVALID PACKET SIZE"; + } + + break; + case 0x65: + switch(ASCQ) + { + case 0x00: + return "VOLTAGE FAULT"; + } + + break; + case 0x66: + switch(ASCQ) + { + case 0x00: + return "AUTOMATIC DOCUMENT FEEDER COVER UP"; + case 0x01: + return "AUTOMATIC DOCUMENT FEEDER LIFT UP"; + case 0x02: + return "DOCUMENT JAM IN AUTOMATIC DOCUMENT FEEDER"; + case 0x03: + return "DOCUMENT MISS FEED AUTOMATIC IN DOCUMENT FEEDER"; + } + + break; + case 0x67: + switch(ASCQ) + { + case 0x00: + return "CONFIGURATION FAILURE"; + case 0x01: + return "CONFIGURATION OF INCAPABLE LOGICAL UNITS FAILED"; + case 0x02: + return "ADD LOGICAL UNIT FAILED"; + case 0x03: + return "MODIFICATION OF LOGICAL UNIT FAILED"; + case 0x04: + return "EXCHANGE OF LOGICAL UNIT FAILED"; + case 0x05: + return "REMOVE OF LOGICAL UNIT FAILED"; + case 0x06: + return "ATTACHMENT OF LOGICAL UNIT FAILED"; + case 0x07: + return "CREATION OF LOGICAL UNIT FAILED"; + case 0x08: + return "ASSIGN FAILURE OCCURRED"; + case 0x09: + return "MULTIPLY ASSIGNED LOGICAL UNIT"; + case 0x0A: + return "SET TARGET PORT GROUPS COMMAND FAILED"; + case 0x0B: + return "ATA DEVICE FEATURE NOT ENABLED"; + } + + break; + case 0x68: + switch(ASCQ) + { + case 0x00: + return "LOGICAL UNIT NOT CONFIGURED"; + case 0x01: + return "SUBSIDIARY LOGICAL UNIT NOT CONFIGURED"; + } + + break; + case 0x69: + switch(ASCQ) + { + case 0x00: + return "DATA LOSS ON LOGICAL UNIT"; + case 0x01: + return "MULTIPLE LOGICAL UNIT FAILURES"; + case 0x02: + return "PARITY/DATA MISMATCH"; + } + + break; + case 0x6A: + switch(ASCQ) + { + case 0x00: + return "INFORMATIONAL, REFER TO LOG"; + } + + break; + case 0x6B: + switch(ASCQ) + { + case 0x00: + return "STATE CHANGE HAS OCCURRED"; + case 0x01: + return "REDUNDANCY LEVEL GOT BETTER"; + case 0x02: + return "REDUNDANCY LEVEL GOT WORSE"; + } + + break; + case 0x6C: + switch(ASCQ) + { + case 0x00: + return "REBUILD FAILURE OCCURRED"; + } + + break; + case 0x6D: + switch(ASCQ) + { + case 0x00: + return "RECALCULATE FAILURE OCCURRED"; + } + + break; + case 0x6E: + switch(ASCQ) + { + case 0x00: + return "COMMAND TO LOGICAL UNIT FAILED"; + } + + break; + case 0x6F: + switch(ASCQ) + { + case 0x00: + return "COPY PROTECTION KEY EXCHANGE FAILURE - AUTHENTICATION FAILURE"; + case 0x01: + return "COPY PROTECTION KEY EXCHANGE FAILURE - KEY NOT PRESENT"; + case 0x02: + return "COPY PROTECTION KEY EXCHANGE FAILURE - KEY NOT ESTABLISHED"; + case 0x03: + return "READ OF SCRAMBLED SECTOR WITHOUT AUTHENTICATION"; + case 0x04: + return "MEDIA REGION CODE IS MISMATCHED TO LOGICAL UNIT REGION"; + case 0x05: + return "DRIVE REGION MUST BE PERMANENT/REGION RESET COUNT ERROR"; + case 0x06: + return "INSUFFICIENT BLOCK COUNT FOR BINDING NONCE RECORDING"; + case 0x07: + return "CONFLICT IN BINDING NONCE RECORDING"; + } + + break; + case 0x70: + return $"DECOMPRESSION EXCEPTION SHORT ALGORITHM ID OF {ASCQ:X2}h"; + case 0x71: + switch(ASCQ) + { + case 0x00: + return "DECOMPRESSION EXCEPTION LONG ALGORITHM ID"; + } + + break; + case 0x72: + switch(ASCQ) + { + case 0x00: + return "SESSION FIXATION ERROR"; + case 0x01: + return "SESSION FIXATION ERROR WRITING LEAD-IN"; + case 0x02: + return "SESSION FIXATION ERROR WRITING LEAD-OUT"; + case 0x03: + return "SESSION FIXATION ERROR - INCOMPLETE TRACK IN SESSION"; + case 0x04: + return "EMPTY OR PARTIALLY WRITTEN RESERVED TRACK"; + case 0x05: + return "NO MORE TRACK RESERVATIONS ALLOWED"; + case 0x06: + return "RMZ EXTENSION IS NOT ALLOWED"; + case 0x07: + return "NO MORE TEST ZONE EXTENSIONS ARE ALLOWED"; + } + + break; + case 0x73: + switch(ASCQ) + { + case 0x00: + return "CD CONTROL ERROR"; + case 0x01: + return "POWER CALIBRATION AREA ALMOST FULL"; + case 0x02: + return "POWER CALIBRATION AREA IS FULL"; + case 0x03: + return "POWER CALIBRATION AREA ERROR"; + case 0x04: + return "PROGRAM MEMORY AREA UPDATE FAILURE"; + case 0x05: + return "PROGRAM MEMORY AREA IS FULL"; + case 0x06: + return "RMA/PMA IS ALMOST FULL"; + case 0x10: + return "CURRENT POWER CALIBRATION AREA ALMOST FULL"; + case 0x11: + return "CURRENT POWER CALIBRATION AREA IS FULL"; + case 0x17: + return "RDZ IS FULL"; + } + + break; + case 0x74: + switch(ASCQ) + { + case 0x00: + return "SECURITY ERROR"; + case 0x01: + return "UNABLE TO DECRYPT DATA"; + case 0x02: + return "UNENCRYPTED DATA ENCOUNTERED WHILE DECRYPTING"; + case 0x03: + return "INCORRECT DATA ENCRYPTION KEY"; + case 0x04: + return "CRYPTOGRAPHIC INTEGRITY VALIDATION FAILED"; + case 0x05: + return "ERROR DECRYPTING DATA"; + case 0x06: + return "UNKNOWN SIGNATURE VERIFICATION KEY"; + case 0x07: + return "ENCRYPTION PARAMETERS NOT USABLE"; + case 0x08: + return "DIGITAL SIGNATURE VALIDATION FAILURE"; + case 0x09: + return "ENCRYPTION MODE MISMATCH ON READ"; + case 0x0A: + return "ENCRYPTED BLOCK NOT RAW READ ENABLED"; + case 0x0B: + return "INCORRECT ENCRYPTION PARAMETERS"; + case 0x0C: + return "UNABLE TO DECRYPT PARAMETER LIST"; + case 0x0D: + return "ENCRYPTION ALGORITHM DISABLED"; + case 0x10: + return "SA CREATION PARAMETER VALUE INVALID"; + case 0x11: + return "SA CREATION PARAMETER VALUE REJECTED"; + case 0x12: + return "INVALID SA USAGE"; + case 0x21: + return "DATA ENCRYPTION CONFIGURATION PREVENTED"; + case 0x30: + return "SA CREATION PARAMETER NOT SUPPORTED"; + case 0x40: + return "AUTHENTICATION FAILED"; + case 0x61: + return "EXTERNAL DATA ENCRYPTION KEY MANAGER ACCESS ERROR"; + case 0x62: + return "EXTERNAL DATA ENCRYPTION KEY MANAGER ERROR"; + case 0x63: + return "EXTERNAL DATA ENCRYPTION KEY NOT FOUND"; + case 0x64: + return "EXTERNAL DATA ENCRYPTION REQUEST NOT AUTHORIZED"; + case 0x6E: + return "EXTERNAL DATA ENCRYPTION CONTROL TIMEOUT"; + case 0x6F: + return "EXTERNAL DATA ENCRYPTION CONTROL ERROR"; + case 0x71: + return "LOGICAL UNIT ACCESS NOT AUTHORIZED"; + case 0x79: + return "SECURITY CONFLICT IN TRANSLATED DEVICE"; + } + + break; + } + + return ASC >= 0x80 + ? + ASCQ >= 0x80 + ? string.Format(Localization.VENDOR_SPECIFIC_ASC_0_WITH_VENDOR_SPECIFIC_ASCQ_1, ASC, ASCQ) + : string.Format(Localization.VENDOR_SPECIFIC_ASC_0_WITH_ASCQ_1, ASC, ASCQ) + : ASCQ >= 0x80 + ? string.Format(Localization.ASC_0_WITH_VENDOR_SPECIFIC_ASCQ_1, ASC, ASCQ) + : string.Format(Localization.ASC_0_WITH_ASCQ_1, ASC, ASCQ); + } +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/Types.cs b/Aaru.Decoders/SCSI/Types.cs new file mode 100644 index 000000000..f828464ac --- /dev/null +++ b/Aaru.Decoders/SCSI/Types.cs @@ -0,0 +1,618 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : Types.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Contains various SCSI type values. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; + +namespace Aaru.Decoders.SCSI; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +public enum MediumTypes : byte +{ + Default = 0x00, + +#region Medium Types defined in ECMA-111 for Direct-Access devices + + /// ECMA-54: 200 mm Flexible Disk Cartridge using Two-Frequency Recording at 13262 ftprad on One Side + ECMA54 = 0x09, + /// + /// ECMA-59 & ANSI X3.121-1984: 200 mm Flexible Disk Cartridge using Two-Frequency Recording at 13262 ftprad + /// on Both Sides + /// + ECMA59 = 0x0A, + /// ECMA-69: 200 mm Flexible Disk Cartridge using MFM Recording at 13262 ftprad on Both Sides + ECMA69 = 0x0B, + /// ECMA-66: 130 mm Flexible Disk Cartridge using Two-Frequency Recording at 7958 ftprad on One Side + ECMA66 = 0x0E, + /// + /// ECMA-70 & ANSI X3.125-1985: 130 mm Flexible Disk Cartridge using MFM Recording at 7958 ftprad on Both + /// Sides; 1,9 Tracks per mm + /// + ECMA70 = 0x12, + /// + /// ECMA-78 & ANSI X3.126-1986: 130 mm Flexible Disk Cartridge using MFM Recording at 7958 ftprad on Both + /// Sides; 3,8 Tracks per mm + /// + ECMA78 = 0x16, + /// + /// ECMA-99 & ISO 8630-1985: 130 mm Flexible Disk Cartridge using MFM Recording at 13262 ftprad on Both Sides; + /// 3,8 Tracks per mm + /// + ECMA99 = 0x1A, + /// + /// ECMA-100 & ANSI X3.137: 90 mm Flexible Disk Cartridge using MFM Recording at 7859 ftprad on Both Sides; + /// 5,3 Tracks per mm + /// + ECMA100 = 0x1E, + +#endregion Medium Types defined in ECMA-111 for Direct-Access devices + +#region Medium Types defined in SCSI-2 for Direct-Access devices + + /// Unspecified single sided flexible disk + Unspecified_SS = 0x01, + /// Unspecified double sided flexible disk + Unspecified_DS = 0x02, + /// ANSI X3.73-1980: 200 mm, 6631 ftprad, 1,9 Tracks per mm, 1 side + X3_73 = 0x05, + /// ANSI X3.73-1980: 200 mm, 6631 ftprad, 1,9 Tracks per mm, 2 sides + X3_73_DS = 0x06, + /// ANSI X3.80-1980: 130 mm, 3979 ftprad, 1,9 Tracks per mm, 1 side + X3_82 = 0x0D, + /// 6,3 mm tape with 12 tracks at 394 ftpmm + Tape12 = 0x40, + /// 6,3 mm tape with 24 tracks at 394 ftpmm + Tape24 = 0x44, + +#endregion Medium Types defined in SCSI-2 for Direct-Access devices + +#region Medium Types defined in SCSI-3 SBC-1 for Optical devices + + /// Read-only medium + ReadOnly = 0x01, + /// Write-once Read-many medium + WORM = 0x02, + /// Erasable medium + Erasable = 0x03, + /// Combination of read-only and write-once medium + RO_WORM = 0x04, + /// Combination of read-only and erasable medium + RO_RW = 0x05, + /// Combination of write-once and erasable medium + WORM_RW = 0x06, + +#endregion Medium Types defined in SCSI-3 SBC-1 for Optical devices + +#region Medium Types defined in SCSI-2 for MultiMedia devices + + /// 120 mm CD-ROM + CDROM = 0x01, + /// 120 mm Compact Disc Digital Audio + CDDA = 0x02, + /// 120 mm Compact Disc with data and audio + MixedCD = 0x03, + /// 80 mm CD-ROM + CDROM_80 = 0x05, + /// 80 mm Compact Disc Digital Audio + CDDA_80 = 0x06, + /// 80 mm Compact Disc with data and audio + MixedCD_80 = 0x07, + +#endregion Medium Types defined in SCSI-2 for MultiMedia devices + +#region Medium Types defined in SFF-8020i + + /// Unknown medium type + Unknown_CD = 0x00, + /// 120 mm Hybrid disc (Photo CD) + HybridCD = 0x04, + /// Unknown size CD-R + Unknown_CDR = 0x10, + /// 120 mm CD-R with data only + CDR = 0x11, + /// 120 mm CD-R with audio only + CDR_DA = 0x12, + /// 120 mm CD-R with data and audio + CDR_Mixed = 0x13, + /// 120 mm Hybrid CD-R (Photo CD) + HybridCDR = 0x14, + /// 80 mm CD-R with data only + CDR_80 = 0x15, + /// 80 mm CD-R with audio only + CDR_DA_80 = 0x16, + /// 80 mm CD-R with data and audio + CDR_Mixed_80 = 0x17, + /// 80 mm Hybrid CD-R (Photo CD) + HybridCDR_80 = 0x18, + /// Unknown size CD-RW + Unknown_CDRW = 0x20, + /// 120 mm CD-RW with data only + CDRW = 0x21, + /// 120 mm CD-RW with audio only + CDRW_DA = 0x22, + /// 120 mm CD-RW with data and audio + CDRW_Mixed = 0x23, + /// 120 mm Hybrid CD-RW (Photo CD) + HybridCDRW = 0x24, + /// 80 mm CD-RW with data only + CDRW_80 = 0x25, + /// 80 mm CD-RW with audio only + CDRW_DA_80 = 0x26, + /// 80 mm CD-RW with data and audio + CDRW_Mixed_80 = 0x27, + /// 80 mm Hybrid CD-RW (Photo CD) + HybridCDRW_80 = 0x28, + /// Unknown size HD disc + Unknown_HD = 0x30, + /// 120 mm HD disc + HD = 0x31, + /// 80 mm HD disc + HD_80 = 0x35, + /// No disc inserted, tray closed or caddy inserted + NoDisc = 0x70, + /// Tray open or no caddy inserted + TrayOpen = 0x71, + /// Tray closed or caddy inserted but medium error + MediumError = 0x72, + +#endregion Medium Types defined in SFF-8020i + +#region Medium Types defined in USB Mass Storage Class - UFI Command Specification + + /// 3.5-inch, 135 tpi, 12362 bits/radian, double-sided MFM (aka 1.25Mb) + Type3Floppy = 0x93, + /// 3.5-inch, 135 tpi, 15916 bits/radian, double-sided MFM (aka 1.44Mb) + HDFloppy = 0x94, + +#endregion Medium Types defined in USB Mass Storage Class - UFI Command Specification + +#region Medium Types defined in INF-8070 + + /// Unknown type block device + UnknownBlockDevice = 0x40, + /// Read-only block device + ReadOnlyBlockDevice = 0x41, + /// Read/Write block device + ReadWriteBlockDevice = 0x42, + +#endregion Medium Types defined in INF-8070 + +#region Medium Types found in vendor documents + + /// LTO WORM as reported by HP drives + LTOWORM = 0x01, + /// LTO cleaning cartridge as reported by Certance/Seagate drives + LTOCleaning = 0x01, + /// Direct-overwrite magneto-optical + DOW = 0x07, + /// LTO Ultrium + LTO = 0x18, + /// LTO Ultrium-2 + LTO2 = 0x28, + /// DC-2900SL + DC2900SL = 0x31, + /// MLR-1 + MLR1 = 0x33, + /// DDS-3 + DDS3 = 0x33, + /// DC-9200 + DC9200 = 0x34, + /// DDS-4 + DDS4 = 0x34, + /// DAT-72 + DAT72 = 0x35, + /// LTO Ultrium-3 + LTO3 = 0x38, + /// LTO Ultrium-3 WORM + LTO3WORM = 0x3C, + /// DDS cleaning cartridge + DDSCleaning = 0x3F, + /// DC-9250 + DC9250 = 0x40, + /// SLR-32 + SLR32 = 0x43, + /// MLR-1SL + MLR1SL = 0x44, + /// SLRtape-50 + SLRtape50 = 0x47, + /// LTO Ultrium-4 + LTO4 = 0x48, + /// LTO Ultrium-4 WORM + LTO4WORM = 0x4C, + /// SLRtape-50SL + SLRtape50SL = 0x50, + /// SLR-32SL + SLR32SL = 0x54, + /// SLR-5 + SLR5 = 0x55, + /// SLR-5SL + SLR5SL = 0x56, + /// LTO Ultrium-5 + LTO5 = 0x58, + /// LTO Ultrium-5 WORM + LTO5WORM = 0x5C, + /// SLRtape-7 + SLRtape7 = 0x63, + /// SLRtape-7SL + SLRtape7SL = 0x64, + /// SLRtape-24 + SLRtape24 = 0x65, + /// SLRtape-24SL + SLRtape24SL = 0x66, + /// LTO Ultrium-6 + LTO6 = 0x68, + /// LTO Ultrium-6 WORM + LTO6WORM = 0x6C, + /// SLRtape-140 + SLRtape140 = 0x70, + /// SLRtape-40 + SLRtape40 = 0x73, + /// SLRtape-60 + SLRtape60 = 0x74, + /// SLRtape-75 + SLRtape75 = 0x74, + /// SLRtape-100 + SLRtape100 = 0x75, + /// SLR-40 or SLR-60 or SLR-100 + SLR40_60_100 = 0x76, + /// LTO Ultrium-7 + LTO7 = 0x78, + /// LTO Ultrium-7 WORM + LTO7WORM = 0x7C, + /// HP LTO emulating a CD + LTOCD = 0x80, + /// Exatape 15m + Exatape15m = 0x81, + /// IBM MagStar + MagStar = 0x81, + /// VXA + VXA = 0x81, + /// CompactTape I + CT1 = 0x82, + /// Exatape 28m + Exatape28m = 0x82, + /// CompactTape II + CT2 = 0x82, + /// VXA-2 + VXA2 = 0x82, + /// VXA-3 + VXA3 = 0x82, + /// Exatape 54m + Exatape54m = 0x83, + /// DLTtape III + DLTtapeIII = 0x83, + /// Exatape 80m + Exatape80m = 0x84, + /// DLTtape IIIxt + DLTtapeIIIxt = 0x84, + /// Exatape 106m + Exatape106m = 0x85, + /// DLTtape IV + DLTtapeIV = 0x85, + /// Travan 5 + Travan5 = 0x85, + /// Exatape 106m XL + Exatape106mXL = 0x86, + /// SuperDLT I + SDLT1 = 0x86, + /// SuperDLT II + SDLT2 = 0x87, + /// VStape I + VStapeI = 0x90, + /// DLTtape S4 + DLTtapeS4 = 0x91, + /// Travan 7 + Travan7 = 0x95, + /// Exatape 22m + Exatape22m = 0xC1, + /// Exatape 40m + Exatape40m = 0xC2, + /// Exatape 76m + Exatape76m = 0xC3, + /// Exatape 112m + Exatape112m = 0xC4, + /// Exatape 22m AME + Exatape22mAME = 0xD1, + /// Exatape 170m + Exatape170m = 0xD2, + /// Exatape 125m + Exatape125m = 0xD3, + /// Exatape 45m + Exatape45m = 0xD4, + /// Exatape 225m + Exatape225m = 0xD5, + /// Exatape 150m + Exatape150m = 0xD6, + /// Exatape 75m + Exatape75m = 0xD7, + +#endregion Medium Types found in vendor documents + +#region Medium Types found testing a Hi-MD drive + + /// Hi-MD + HiMD = 0x44, + +#endregion Medium Types found testing a Hi-MD drive +} + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +public enum DensityType : byte +{ + Default = 0x00, + +#region Density Types defined in ECMA-111 for Direct-Access devices + + /// 7958 flux transitions per radian + Flux7958 = 0x01, + /// 13262 flux transitions per radian + Flux13262 = 0x02, + /// 15916 flux transitions per radian + Flux15916 = 0x03, + +#endregion Density Types defined in ECMA-111 for Direct-Access devices + +#region Density Types defined in ECMA-111 for Sequential-Access devices + + /// ECMA-62 & ANSI X3.22-1983: 12,7 mm 9-Track Magnetic Tape, 32 ftpmm, NRZI, 32 cpmm + ECMA62 = 0x01, + /// ECMA-62 & ANSI X3.39-1986: 12,7 mm 9-Track Magnetic Tape, 126 ftpmm, Phase Encoding, 63 cpmm + ECMA62_Phase = 0x02, + /// ECMA-62 & ANSI X3.54-1986: 12,7 mm 9-Track Magnetic Tape, 356 ftpmm, NRZI, 245 cpmm GCR + ECMA62_GCR = 0x03, + /// ECMA-79 & ANSI X3.116-1986: 6,30 mm Magnetic Tape Cartridge using MFM Recording at 252 ftpmm + ECMA79 = 0x07, + /// + /// Draft ECMA & ANSI X3B5/87-099: 12,7 mm Magnetic Tape Cartridge using IFM Recording on 18 Tracks at 1944 + /// ftpmm, GCR (IBM 3480, 3490, 3490E) + /// + IBM3480 = 0x09, + /// ECMA-46 & ANSI X3.56-1986: 6,30 mm Magnetic Tape Cartridge, Phase Encoding, 63 bpmm + ECMA46 = 0x0B, + /// ECMA-98: 6,30 mm Magnetic Tape Cartridge, NRZI Recording, 394 ftpmm + ECMA98 = 0x0E, + +#endregion Density Types defined in ECMA-111 for Sequential-Access devices + +#region Density Types defined in SCSI-2 for Sequential-Access devices + + /// ANXI X3.136-1986: 6,35 mm 4 or 9-Track Magnetic Tape Cartridge, 315 bpmm, GCR (QIC-24) + X3_136 = 0x05, + /// ANXI X3.157-1987: 12,7 mm 9-Track Magnetic Tape, 126 bpmm, Phase Encoding + X3_157 = 0x06, + /// ANXI X3.158-1987: 3,81 mm 4-Track Magnetic Tape Cassette, 315 bpmm, GCR + X3_158 = 0x08, + /// ANXI X3B5/86-199: 12,7 mm 22-Track Magnetic Tape Cartridge, 262 bpmm, MFM + X3B5_86 = 0x0A, + /// HI-TC1: 12,7 mm 24-Track Magnetic Tape Cartridge, 500 bpmm, GCR + HiTC1 = 0x0C, + /// HI-TC2: 12,7 mm 24-Track Magnetic Tape Cartridge, 999 bpmm, GCR + HiTC2 = 0x0D, + /// QIC-120: 6,3 mm 15-Track Magnetic Tape Cartridge, 394 bpmm, GCR + QIC120 = 0x0F, + /// QIC-150: 6,3 mm 18-Track Magnetic Tape Cartridge, 394 bpmm, GCR + QIC150 = 0x10, + /// QIC-320: 6,3 mm 26-Track Magnetic Tape Cartridge, 630 bpmm, GCR + QIC320 = 0x11, + /// QIC-1350: 6,3 mm 30-Track Magnetic Tape Cartridge, 2034 bpmm, RLL + QIC1350 = 0x12, + /// ANXI X3B5/88-185A: 3,81 mm Magnetic Tape Cassette, 2400 bpmm, DDS + X3B5_88 = 0x13, + /// ANXI X3.202-1991: 8 mm Magnetic Tape Cassette, 1703 bpmm, RLL + X3_202 = 0x14, + /// ECMA TC17: 8 mm Magnetic Tape Cassette, 1789 bpmm, RLL + ECMA_TC17 = 0x15, + /// ANXI X3.193-1990: 12,7 mm 48-Track Magnetic Tape Cartridge, 394 bpmm, MFM + X3_193 = 0x16, + /// ANXI X3B5/97-174: 12,7 mm 48-Track Magnetic Tape Cartridge, 1673 bpmm, MFM + X3B5_91 = 0x17, + +#endregion Density Types defined in SCSI-2 for Sequential-Access devices + +#region Density Types defined in SCSI-2 for MultiMedia devices + + /// User data only + User = 0x01, + /// User data plus auxiliary data field + UserAuxiliary = 0x02, + /// 4-byt tag field, user data plus auxiliary data + UserAuxiliaryTag = 0x03, + /// Audio information only + Audio = 0x04, + +#endregion Density Types defined in SCSI-2 for MultiMedia devices + +#region Density Types defined in SCSI-2 for Optical devices + + /// ISO/IEC 10090: 86 mm Read/Write single-sided optical disc with 12500 tracks + ISO10090 = 0x01, + /// 89 mm Read/Write double-sided optical disc with 12500 tracks + D581 = 0x02, + /// ANSI X3.212: 130 mm Read/Write double-sided optical disc with 18750 tracks + X3_212 = 0x03, + /// ANSI X3.191: 130 mm Write-Once double-sided optical disc with 30000 tracks + X3_191 = 0x04, + /// ANSI X3.214: 130 mm Write-Once double-sided optical disc with 20000 tracks + X3_214 = 0x05, + /// ANSI X3.211: 130 mm Write-Once double-sided optical disc with 18750 tracks + X3_211 = 0x06, + /// 200 mm optical disc + D407 = 0x07, + /// ISO/IEC 13614: 300 mm double-sided optical disc + ISO13614 = 0x08, + /// ANSI X3.200: 356 mm double-sided optical disc with 56350 tracks + X3_200 = 0x09, + +#endregion Density Types defined in SCSI-2 for Optical devices + +#region Density Types found in vendor documents + + /// QIC-11 + QIC11 = 0x04, + /// CompactTape I + CT1 = 0x0A, + /// Exabyte 8200 format + Ex8200 = 0x14, + /// Exabyte 8500 format + Ex8500 = 0x15, + /// CompactTape II + CT2 = 0x16, + /// DLTtape III 42500 bpi + DLT3_42k = 0x17, + /// DLTtape III 56 track + DLT3_56t = 0x18, + /// DLTtape III 62500 bpi + DLT3_62k = 0x19, + /// DLTtape IV + DLT4 = 0x1A, + /// DLTtape IV 85937 bpi + DLT4_85k = 0x1B, + /// DDS-2 + DDS2 = 0x24, + /// DDS-3 + DDS3 = 0x25, + /// DDS-4 + DDS4 = 0x26, + /// Exabyte Mammoth + Mammoth = 0x27, + /// IBM 3490 & 3490E + IBM3490E = 0x28, + /// Exabyte Mammoth-2 + Mammoth2 = 0x28, + /// IBM 3590 + IBM3590 = 0x29, + /// IBM 3590E + IBM3590E = 0x2A, + /// AIT-1 + AIT1 = 0x30, + /// AIT-2 + AIT2 = 0x31, + /// AIT-3 + AIT3 = 0x32, + /// DLTtape IV 123090 bpi + DLT4_123k = 0x40, + /// Ultrium-1 + LTO1 = 0x40, + /// Super AIT-1 + SAIT1 = 0x40, + /// DLTtape IV 85937 bpi + DLT4_98k = 0x41, + /// Ultrium-2 as reported by the Certance drive + LTO2Old = 0x41, + /// Ultrium-2 + LTO2 = 0x42, + /// T9840 + T9840 = 0x42, + /// T9940 + T9940 = 0x43, + /// Ultrium- + LTO3 = 0x44, + /// T9840C + T9840C = 0x45, + /// Travan 5 + Travan5 = 0x46, + /// Ultrium-4 + LTO4 = 0x46, + /// T9840D + T9840D = 0x46, + /// DAT-72 + DAT72 = 0x47, + /// Super DLTtape I 133000 bpi + SDLT1_133k = 0x48, + /// Super DLTtape I + SDLT1 = 0x49, + /// T10000A + T10000A = 0x4A, + /// Super DLTtape II + SDLT2 = 0x4A, + /// DLTtape S4 + DLTS4 = 0x4B, + /// T10000B + T10000B = 0x4B, + /// T10000C + T10000C = 0x4C, + /// T10000D + T10000D = 0x4D, + /// VStape I + VStape1 = 0x40, + /// Ultrium-5 + LTO5 = 0x58, + /// Ultrium-6 + LTO6 = 0x5A, + /// Ultrium-7 + LTO7 = 0x5C, + /// DLTtape III 62500 bpi secondary code + DLT3_62kAlt = 0x80, + /// VXA-1 + VXA1 = 0x80, + /// DLTtape III compressed + DLT3c = 0x81, + /// VXA-2 + VXA2 = 0x81, + /// DLTtape IV secondary code + DLT4Alt = 0x82, + /// VXA-3 + VXA3 = 0x82, + /// DLTtape IV compressed + DLT4c = 0x83, + /// DLTtape IV 85937 bpi secondary code + DLT4_85kAlt = 0x84, + /// DLTtape IV 85937 bpi compressed + DLT4c_85k = 0x85, + /// DLTtape IV 123090 bpi secondary code + DLT4_123kAlt = 0x86, + /// DLTtape IV 123090 bpi compressed + DLT4c_123k = 0x87, + /// DLTtape IV 98250 bpi secondary code + DLT4_98kAlt = 0x88, + /// DLTtape IV 98250 bpi compressed + DLT4c_98k = 0x89, + /// Exabyte compressed 8200 format + Ex8500c = 0x8C, + /// Exabyte compressed 8500 format + Ex8200c = 0x90, + /// Super DLTtape I secondary code + SDLT1Alt = 0x90, + /// Super DLTtape I compressed + SDLT1c = 0x91, + /// Super DLTtape I 133000 bpi secondary code + SDLT1_133kAlt = 0x92, + /// Super DLTtape I 133000 bpi compressed + SDLT1c_133k = 0x93, + /// VStape I secondary code + VStape1Alt = 0x98, + /// VStape I compressed + VStape1c = 0x99, + +#endregion Density Types found in vendor documents +} \ No newline at end of file diff --git a/Aaru.Decoders/SCSI/VendorString.cs b/Aaru.Decoders/SCSI/VendorString.cs new file mode 100644 index 000000000..359d45a51 --- /dev/null +++ b/Aaru.Decoders/SCSI/VendorString.cs @@ -0,0 +1,866 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : VendorString.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Contains SCSI vendor strings. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System.Diagnostics.CodeAnalysis; + +namespace Aaru.Decoders.SCSI; + +public static class VendorString +{ + [SuppressMessage("ReSharper", "StringLiteralTypo")] + public static string Prettify(string scsiVendorString) => scsiVendorString switch + { + "0B4C" => "MOOSIK Ltd.", + "13FE" => "PHISON", + "2AI" => "2AI (Automatisme et Avenir Informatique)", + "3M" => "3M Company", + "3nhtech" => "3NH Technologies", + "3PARdata" => "3PARdata, Inc.", + "A-Max" => "A-Max Technology Co., Ltd", + "ABSOLUTE" => "Absolute Analysis", + "ACARD" => "ACARD Technology Corp.", + "Accusys" => "Accusys INC.", + "Acer" => "Acer, Inc.", + "ACL" => "Automated Cartridge Librarys, Inc.", + "Actifio" => "Actifio", + "Acuid" => "Acuid Corporation Ltd.", + "AcuLab" => "AcuLab, Inc. (Tulsa, OK)", + "ADAPTEC" => "Adaptec", + "ADIC" => "Advanced Digital Information Corporation", + "ADSI" => + "Adaptive Data Systems, Inc. (a Western Digital subsidiary)", + "ADTX" => "ADTX Co., Ltd.", + "ADVA" => "ADVA Optical Networking AG", + "AEM" => "AEM Performance Electronics", + "AERONICS" => "Aeronics, Inc.", + "AGFA" => "AGFA", + "Agilent" => "Agilent Technologies", + "AIC" => "Advanced Industrial Computer, Inc.", + "AIPTEK" => "AIPTEK International Inc.", + "Alcohol" => "Alcohol Soft", + "ALCOR" => "Alcor Micro, Corp.", + "AMCC" => "Applied Micro Circuits Corporation", + "AMCODYNE" => "Amcodyne", + "Amgeon" => "Amgeon LLC", + "AMI" => "American Megatrends, Inc.", + "AMPEX" => "Ampex Data Systems", + "Amphenol" => "Amphenol", + "Amtl" => "Tenlon Technology Co.,Ltd", + "ANAMATIC" => "Anamartic Limited (England)", + "Ancor" => "Ancor Communications, Inc.", + "ANCOT" => "ANCOT Corp.", + "ANDATACO" => "Andataco", + "andiamo" => "Andiamo Systems, Inc.", + "ANOBIT" => "Anobit", + "ANRITSU" => "Anritsu Corporation", + "ANTONIO" => + "Antonio Precise Products Manufactory Ltd.", + "AoT" => "Art of Technology AG", + "APPLE" => "Apple Computer, Inc.", + "ARCHIVE" => "Archive", + "ARDENCE" => "Ardence Inc", + "Areca" => "Areca Technology Corporation", + "Arena" => "MaxTronic International Co., Ltd.", + "Argent" => "Argent Data Systems, Inc.", + "ARIO" => "Ario Data Networks, Inc.", + "ARISTOS" => "Aristos Logic Corp.", + "ARK" => "ARK Research Corporation", + "ARL:UT@A" => + "Applied Research Laboratories : University of Texas at Austin", + "ARTECON" => "Artecon Inc.", + "Artistic" => "Artistic Licence (UK) Ltd", + "ARTON" => "Arton Int.", + "ASACA" => "ASACA Corp.", + "ASC" => "Advanced Storage Concepts, Inc.", + "ASPEN" => "Aspen Peripherals", + "AST" => "AST Research", + "ASTEK" => "Astek Corporation", + "ASTK" => "Alcatel STK A/S", + "AStor" => "AccelStor, Inc.", + "ASTUTE" => "Astute Networks, Inc.", + "AT&T" => "AT&T", + "ATA" => + "SCSI / ATA Translator Software (Organization Not Specified)", + "ATARI" => "Atari Corporation", + "ATech" => "ATech electronics", + "ATG CYG" => "ATG Cygnet Inc.", + "ATL" => "Quantum|ATL Products", + "ATTO" => "ATTO Technology Inc.", + "ATTRATEC" => "Attratech Ltd liab. Co", + "ATX" => "Alphatronix", + "AURASEN" => "Aurasen Limited", + "Avago" => "Avago Technologies", + "AVC" => "AVC Technology Ltd", + "AVIDVIDR" => "AVID Technologies, Inc.", + "AVR" => "Advanced Vision Research", + "AXSTOR" => "AXSTOR", + "Axxana" => "Axxana Ltd.", + "B*BRIDGE" => "Blockbridge Networks LLC", + "BALLARD" => "Ballard Synergy Corp.", + "Barco" => "Barco", + "BAROMTEC" => "Barom Technologies Co., Ltd.", + "Bassett" => "Bassett Electronic Systems Ltd", + "BC Hydro" => "BC Hydro", + "BDT" => "BDT AG", + "BECEEM" => "Beceem Communications, Inc", + "BENQ" => "BENQ Corporation.", + "BERGSWD" => "Berg Software Design", + "BEZIER" => "Bezier Systems, Inc.", + "BHTi" => "Breece Hill Technologies", + "biodata" => "Biodata Devices SL", + "BIOS" => "BIOS Corporation", + "BIR" => "Bio-Imaging Research, Inc.", + "BiT" => "BiT Microsystems", + "BITMICRO" => "BiT Microsystems, Inc.", + "Blendlgy" => "Blendology Limited", + "BLOOMBAS" => "Bloombase Technologies Limited", + "BlueArc" => "BlueArc Corporation", + "bluecog" => "bluecog", + "BME-HVT" => + "Broadband Infocommunicatons and Electromagnetic Theory Department", + "BNCHMARK" => "Benchmark Tape Systems Corporation", + "Bosch" => "Robert Bosch GmbH", + "Botman" => "Botmanfamily Electronics", + "BoxHill" => "Box Hill Systems Corporation", + "BRDGWRKS" => "Bridgeworks Ltd.", + "BREA" => "BREA Technologies, Inc.", + "BREECE" => "Breece Hill LLC", + "BreqLabs" => "BreqLabs Inc.", + "Broadcom" => "Broadcom Corporation", + "BROCADE" => + "Brocade Communications Systems, Incorporated", + "BUFFALO" => "BUFFALO INC.", + "BULL" => "Bull Peripherals Corp.", + "BUSLOGIC" => "BusLogic Inc.", + "BVIRTUAL" => "B-Virtual N.V.", + "CACHEIO" => "CacheIO LLC", + "CalComp" => "CalComp, A Lockheed Company", + "CALCULEX" => "CALCULEX, Inc.", + "CALIPER" => "Caliper (California Peripheral Corp.)", + "CAMBEX" => "Cambex Corporation", + "CAMEOSYS" => "Cameo Systems Inc.", + "CANDERA" => "Candera Inc.", + "CAPTION" => "CAPTION BANK", + "CAST" => "Advanced Storage Tech", + "CATALYST" => "Catalyst Enterprises", + "CCDISK" => "iSCSI Cake", + "CDC" => "Control Data or MPI", + "CDP" => "Columbia Data Products", + "Celsia" => "A M Bromley Limited", + "CenData" => "Central Data Corporation", + "Cereva" => "Cereva Networks Inc.", + "CERTANCE" => "Certance", + "Chantil" => "Chantil Technology", + "CHEROKEE" => "Cherokee Data Systems", + "CHINON" => "Chinon", + "CHRISTMA" => + "Christmann Informationstechnik + Medien GmbH & Co KG", + "CIE&YED" => "YE Data, C.Itoh Electric Corp.", + "CIPHER" => "Cipher Data Products", + "Ciprico" => "Ciprico, Inc.", + "CIRRUSL" => "Cirrus Logic Inc.", + "CISCO" => "Cisco Systems, Inc.", + "CLEARSKY" => "ClearSky Data, Inc.", + "CLOVERLF" => "Cloverleaf Communications, Inc", + "CLS" => "Celestica", + "CMD" => "CMD Technology Inc.", + "CMTechno" => "CMTech", + "CNGR SFW" => "Congruent Software, Inc.", + "CNSi" => "Chaparral Network Storage, Inc.", + "CNT" => "Computer Network Technology", + "COBY" => "Coby Electronics Corporation, USA", + "COGITO" => "Cogito", + "COMAY" => "Corerise Electronics", + "COMPAQ" => "Compaq Computer Corporation", + "COMPELNT" => "Compellent Technologies, Inc.", + "COMPORT" => "Comport Corp.", + "COMPSIG" => "Computer Signal Corporation", + "COMPTEX" => "Comptex Pty Limited", + "CONNER" => "Conner Peripherals", + "COPANSYS" => "COPAN SYSTEMS INC", + "CORAID" => "Coraid, Inc", + "CORE" => "Core International, Inc.", + "CORERISE" => "Corerise Electronics", + "COVOTE" => "Covote GmbH & Co KG", + "COWON" => "COWON SYSTEMS, Inc.", + "CPL" => "Cross Products Ltd", + "CPU TECH" => "CPU Technology, Inc.", + "CREO" => "Creo Products Inc.", + "CROSFLD" => "Crosfield Electronics", + "CROSSRDS" => "Crossroads Systems, Inc.", + "crosswlk" => "Crosswalk, Inc.", + "CSCOVRTS" => "Cisco - Veritas", + "CSM, INC" => "Computer SM, Inc.", + "Cunuqui" => "CUNUQUI SLU", + "CYBERNET" => "Cybernetics", + "Cygnal" => "Dekimo", + "CYPRESS" => "Cypress Semiconductor Corp.", + "D Bit" => "Digby's Bitpile, Inc. DBA D Bit", + "DALSEMI" => "Dallas Semiconductor", + "DANEELEC" => "Dane-Elec", + "DANGER" => "Danger Inc.", + "DAT-MG" => "DAT Manufacturers Group", + "Data Com" => + "Data Com Information Systems Pty. Ltd.", + "DATABOOK" => "Databook, Inc.", + "DATACOPY" => "Datacopy Corp.", + "DataCore" => "DataCore Software Corporation", + "DataG" => "DataGravity", + "DATAPT" => "Datapoint Corp.", + "DATARAM" => "Dataram Corporation", + "DATC" => "Datum Champion Technology Co., Ltd", + "DAVIS" => "Daviscomms (S) Pte Ltd", + "DCS" => "ShenZhen DCS Group Co.,Ltd", + "DDN" => "DataDirect Networks, Inc.", + "DDRDRIVE" => "DDRdrive LLC", + "DE" => "Dimension Engineering LLC", + "DEC" => "Digital Equipment Corporation", + "DEI" => "Digital Engineering, Inc.", + "DELL" => "Dell, Inc.", + "Dell(tm)" => "Dell, Inc", + "DELPHI" => + "Delphi Data Div. of Sparks Industries, Inc.", + "DENON" => "Denon/Nippon Columbia", + "DenOptix" => "DenOptix, Inc.", + "DEST" => "DEST Corp.", + "DFC" => "DavioFranke.com", + "DFT" => "Data Fault Tolerance System CO.,LTD.", + "DGC" => "Data General Corp.", + "DIGIDATA" => "Digi-Data Corporation", + "DigiIntl" => "Digi International", + "Digital" => "Digital Equipment Corporation", + "DILOG" => "Distributed Logic Corp.", + "DISC" => "Document Imaging Systems Corp.", + "DiscSoft" => "Disc Soft Ltd", + "DLNET" => "Driveline", + "DNS" => "Data and Network Security", + "DNUK" => "Digital Networks Uk Ltd", + "DotHill" => "Dot Hill Systems Corp.", + "DP" => "Dell, Inc.", + "DPT" => "Distributed Processing Technology", + "Drewtech" => "Drew Technologies, Inc.", + "DROBO" => "Data Robotics, Inc.", + "DSC" => "DigitalStream Corporation", + "DSI" => "Data Spectrum, Inc.", + "DSM" => + "Deterner Steuerungs- und Maschinenbau GmbH & Co.", + "DSNET" => "Cleversafe, Inc.", + "DT" => "Double-Take Software, INC.", + "DTC QUME" => "Data Technology Qume", + "DXIMAGIN" => "DX Imaging", + "E-Motion" => "E-Motion LLC", + "EARTHLAB" => "EarthLabs", + "EarthLCD" => "Earth Computer Technologies, Inc.", + "ECCS" => "ECCS, Inc.", + "ECMA" => + "European Computer Manufacturers Association", + "EDS" => "Embedded Data Systems", + "EIM" => "InfoCore", + "ELE Intl" => "ELE International", + "ELEGANT" => "Elegant Invention, LLC", + "Elektron" => "Elektron Music Machines MAV AB", + "elipsan" => "Elipsan UK Ltd.", + "Elms" => "Elms Systems Corporation", + "ELSE" => "ELSE Ltd.", + "ELSEC" => "Littlemore Scientific", + "EMASS" => "EMASS, Inc.", + "EMC" => "EMC Corp.", + "EMiT" => "EMiT Conception Eletronique", + "EMTEC" => "EMTEC Magnetics", + "EMULEX" => "Emulex", + "ENERGY-B" => "Energybeam Corporation", + "ENGENIO" => "Engenio Information Technologies, Inc.", + "ENMOTUS" => "Enmotus Inc", + "Entacore" => "Entacore", + "EPOS" => "EPOS Technologies Ltd.", + "EPSON" => "Epson", + "EQLOGIC" => "EqualLogic", + "Eris/RSI" => "RSI Systems, Inc.", + "ETERNE" => + "EterneData Technology Co.,Ltd.(China PRC.)", + "EuroLogc" => "Eurologic Systems Limited", + "evolve" => "Evolution Technologies, Inc", + "EXABYTE" => "Exabyte Corp.", + "EXATEL" => "Exatelecom Co., Ltd.", + "EXAVIO" => "Exavio, Inc.", + "Exsequi" => "Exsequi Ltd", + "Exxotest" => "Annecy Electronique", + "FAIRHAVN" => "Fairhaven Health, LLC", + "FALCON" => "FalconStor, Inc.", + "FDS" => "Formation Data Systems", + "FFEILTD" => "FujiFilm Electonic Imaging Ltd", + "Fibxn" => "Fiberxon, Inc.", + "FID" => "First International Digital, Inc.", + "FILENET" => "FileNet Corp.", + "FirmFact" => "Firmware Factory Ltd", + "FLYFISH" => "Flyfish Technologies", + "FOXCONN" => "Foxconn Technology Group", + "FRAMDRV" => "FRAMEDRIVE Corp.", + "FREECION" => "Nable Communications, Inc.", + "FRESHDTK" => "FreshDetect GmbH", + "FSC" => "Fujitsu Siemens Computers", + "FTPL" => "Frontline Technologies Pte Ltd", + "FUJI" => "Fuji Electric Co., Ltd. (Japan)", + "FUJIFILM" => "Fuji Photo Film, Co., Ltd.", + "FUJITSU" => "Fujitsu", + "FUNAI" => "Funai Electric Co., Ltd.", + "FUSIONIO" => "Fusion-io Inc.", + "FUTURED" => "Future Domain Corp.", + "G&D" => "Giesecke & Devrient GmbH", + "G.TRONIC" => + "Globaltronic - Electronica e Telecomunicacoes, S.A.", + "Gadzoox" => "Gadzoox Networks, Inc.", + "Gammaflx" => "Gammaflux L.P.", + "GDI" => "Generic Distribution International", + "GEMALTO" => "gemalto", + "Gen_Dyn" => "General Dynamics", + "Generic" => "Generic Technology Co., Ltd.", + "GENSIG" => "General Signal Networks", + "GEO" => "Green Energy Options Ltd", + "GIGATAPE" => "GIGATAPE GmbH", + "GIGATRND" => "GigaTrend Incorporated", + "Global" => "Global Memory Test Consortium", + "Gnutek" => "Gnutek Ltd.", + "Goidelic" => "Goidelic Precision, Inc.", + "GoldKey" => "GoldKey Security Corporation", + "GoldStar" => "LG Electronics Inc.", + "GOOGLE" => "Google, Inc.", + "GORDIUS" => "Gordius", + "GOULD" => "Gould", + "HAGIWARA" => "Hagiwara Sys-Com Co., Ltd.", + "HAPP3" => "Inventec Multimedia and Telecom co., ltd", + "HDS" => "Horizon Data Systems, Inc.", + "Helldyne" => "Helldyne, Inc", + "Heydays" => "Mazo Technology Co., Ltd.", + "HGST" => "HGST a Western Digital Company", + "HI-TECH" => "HI-TECH Software Pty. Ltd.", + "HITACHI" => + "Hitachi America Ltd or Nissei Sangyo America Ltd", + "HL-DT-ST" => "Hitachi-LG Data Storage, Inc.", + "HONEYWEL" => "Honeywell Inc.", + "Hoptroff" => "HexWax Ltd", + "HORIZONT" => "Horizontigo Software", + "HP" => "Hewlett Packard", + "HPE" => "Hewlett Packard Enterprise", + "HPI" => "HP Inc.", + "HPQ" => "Hewlett Packard", + "HUALU" => "CHINA HUALU GROUP CO., LTD", + "HUASY" => "Huawei Symantec Technologies Co., Ltd.", + "HYLINX" => "Hylinx Ltd.", + "HYUNWON" => "HYUNWON inc", + "i-cubed" => "i-cubed ltd.", + "IBM" => "International Business Machines", + "Icefield" => "Icefield Tools Corporation", + "Iceweb" => "Iceweb Storage Corp", + "ICL" => "ICL", + "ICP" => "ICP vortex Computersysteme GmbH", + "IDE" => "International Data Engineering, Inc.", + "IDG" => "Interface Design Group", + "IET" => "ISCSI ENTERPRISE TARGET", + "IFT" => "Infortrend Technology, Inc.", + "IGR" => "Intergraph Corp.", + "IMAGINE" => "Imagine Communications Corp.", + "IMAGO" => "IMAGO SOFTWARE SL", + "IMATION" => "Imation", + "IMPLTD" => "Integrated Micro Products Ltd.", + "IMPRIMIS" => "Imprimis Technology Inc.", + "INCIPNT" => "Incipient Technologies Inc.", + "INCITS" => + "InterNational Committee for Information Technology", + "INDCOMP" => "Industrial Computing Limited", + "Indigita" => "Indigita Corporation", + "INFOCORE" => "InfoCore", + "INITIO" => "Initio Corporation", + "INRANGE" => "INRANGE Technologies Corporation", + "Insight" => "L-3 Insight Technology Inc", + "INSITE" => "Insite Peripherals", + "integrix" => "Integrix, Inc.", + "INTEL" => "Intel Corporation", + "Intransa" => "Intransa, Inc.", + "IOC" => "I/O Concepts, Inc.", + "iofy" => "iofy Corporation", + "IOMEGA" => "Iomega", + "IOT" => "IO Turbine, Inc.", + "iPaper" => "intelliPaper, LLC", + "iqstor" => "iQstor Networks, Inc.", + "iQue" => "iQue", + "ISi" => "Information Storage inc.", + "Isilon" => "Isilon Systems, Inc.", + "ISO" => "International Standards Organization", + "iStor" => "iStor Networks, Inc.", + "ITC" => "International Tapetronics Corporation", + "iTwin" => "iTwin Pte Ltd", + "IVIVITY" => "iVivity, Inc.", + "IVMMLTD" => "InnoVISION Multimedia Ltd.", + "JABIL001" => "Jabil Circuit", + "JETWAY" => "Jetway Information Co., Ltd", + "JMR" => "JMR Electronics Inc.", + "JOFEMAR" => "Jofemar", + "JOLLYLOG" => "Jolly Logic", + "JPC Inc." => "JPC Inc.", + "JSCSI" => "jSCSI Project", + "Juniper" => "Juniper Networks", + "JVC" => "JVC Information Products Co.", + "KASHYA" => "Kashya, Inc.", + "KENNEDY" => "Kennedy Company", + "KENWOOD" => "KENWOOD Corporation", + "KEWL" => "Shanghai KEWL Imp&Exp Co., Ltd.", + "Key Tech" => "Key Technologies, Inc", + "KMNRIO" => "Kaminario Technologies Ltd.", + "KODAK" => "Eastman Kodak", + "KONAN" => "Konan", + "koncepts" => "koncepts International Ltd.", + "KONICA" => "Konica Japan", + "KOVE" => "KOVE", + "KSCOM" => "KSCOM Co. Ltd.,", + "KUDELSKI" => "Nagravision SA - Kudelski Group", + "Kyocera" => "Kyocera Corporation", + "Lapida" => "Gonmalo Electronics", + "LAPINE" => "Lapine Technology", + "LASERDRV" => "LaserDrive Limited", + "LASERGR" => "Lasergraphics, Inc.", + "LeapFrog" => "LeapFrog Enterprises, Inc.", + "LEFTHAND" => "LeftHand Networks", + "Leica" => "Leica Camera AG", + "Lexar" => "Lexar Media, Inc.", + "LEYIO" => "LEYIO", + "LG" => "LG Electronics Inc.", + "LGE" => "LG Electronics Inc.", + "LIBNOVA" => + "LIBNOVA, SL Digital Preservation Systems", + "LION" => "Lion Optics Corporation", + "LMS" => + "Laser Magnetic Storage International Company", + "LoupTech" => "Loup Technologies, Inc.", + "LSI" => "LSI Corp. (was LSI Logic Corp.)", + "LSILOGIC" => "LSI Logic Storage Systems, Inc.", + "LTO-CVE" => + "Linear Tape - Open, Compliance Verification Entity", + "LUXPRO" => "Luxpro Corporation", + "MacroSAN" => "MacroSAN Technologies Co., Ltd.", + "Malakite" => + "Malachite Technologies (New VID is: Sandial)", + "MarcBoon" => "marcboon.com", + "Marner" => "Marner Storage Technologies, Inc.", + "MARVELL" => "Marvell Semiconductor, Inc.", + "Matrix" => "Matrix Orbital Corp.", + "MATSHITA" => "Matsushita", + "MAXELL" => "Hitachi Maxell, Ltd.", + "MAXIM-IC" => "Maxim Integrated Products", + "MaxOptix" => "Maxoptix Corp.", + "MAXSTRAT" => "Maximum Strategy, Inc.", + "MAXTOR" => "Maxtor Corp.", + "MaXXan" => "MaXXan Systems, Inc.", + "MAYCOM" => "maycom Co., Ltd.", + "MBEAT" => "K-WON C&C Co.,Ltd", + "MCC" => "Measurement Computing Corporation", + "McDATA" => "McDATA Corporation", + "MCUBE" => "Mcube Technology Co., Ltd.", + "MDI" => "Micro Design International, Inc.", + "MEADE" => "Meade Instruments Corporation", + "mediamat" => "mediamatic", + "MegaElec" => "Mega Electronics Ltd", + "MEII" => "Mountain Engineering II, Inc.", + "MELA" => "Mitsubishi Electronics America", + "MELCO" => "Mitsubishi Electric (Japan)", + "mellanox" => "Mellanox Technologies Ltd.", + "MEMOREX" => "Memorex Telex Japan Ltd.", + "MEMREL" => "Memrel Corporation", + "MEMTECH" => "MemTech Technology", + "Mendocin" => "Mendocino Software", + "MendoCno" => "Mendocino Software", + "MERIDATA" => "Oy Meridata Finland Ltd", + "METHODEI" => "Methode Electronics India pvt ltd", + "METRUM" => "Metrum, Inc.", + "MHTL" => "Matsunichi Hi-Tech Limited", + "MICROBTX" => "Microbotics Inc.", + "Microchp" => "Microchip Technology, Inc.", + "MICROLIT" => "Microlite Corporation", + "MICRON" => "Micron Technology, Inc.", + "MICROP" => "Micropolis", + "MICROTEK" => "Microtek Storage Corp", + "Minitech" => "Minitech (UK) Limited", + "Minolta" => "Minolta Corporation", + "MINSCRIB" => "Miniscribe", + "MiraLink" => "MiraLink Corporation", + "Mirifica" => "Mirifica s.r.l.", + "MITSUMI" => "Mitsumi Electric Co., Ltd.", + "MKM" => "Mitsubishi Kagaku Media Co., LTD.", + "Mobii" => "Mobii Systems (Pty.) Ltd.", + "MOL" => "Petrosoft Sdn. Bhd.", + "MOSAID" => "Mosaid Technologies Inc.", + "MOTOROLA" => "Motorola", + "MP-400" => "Daiwa Manufacturing Limited", + "MPC" => "MPC Corporation", + "MPCCORP" => "MPC Computers", + "MPEYE" => "Touchstone Technology Co., Ltd", + "MPIO" => "DKT Co.,Ltd", + "MPM" => "Mitsubishi Paper Mills, Ltd.", + "MPMan" => "MPMan.com, Inc.", + "MSFT" => "Microsoft Corporation", + "MSI" => "Micro-Star International Corp.", + "MST" => "Morning Star Technologies, Inc.", + "MSystems" => "M-Systems Flash Disk Pioneers", + "MTI" => "MTI Technology Corporation", + "MTNGATE" => "MountainGate Data Systems", + "MXI" => "Memory Experts International", + "nac" => "nac Image Technology Inc.", + "NAGRA" => "Nagravision SA - Kudelski Group", + "NAI" => "North Atlantic Industries", + "NAKAMICH" => "Nakamichi Corporation", + "NatInst" => "National Instruments", + "NatSemi" => "National Semiconductor Corp.", + "NCITS" => + "InterNational Committee for Information Technology Standards (INCITS)", + "NCL" => "NCL America", + "NCR" => "NCR Corporation", + "NDBTECH" => "NDB Technologie Inc.", + "Neartek" => "Neartek, Inc.", + "NEC" => "NEC", + "NETAPP" => "NetApp, Inc. (was Network Appliance)", + "NetBSD" => "The NetBSD Foundation", + "Netcom" => "Netcom Storage", + "NETENGIN" => "NetEngine, Inc.", + "NEWISYS" => "Newisys Data Storage", + "Newtech" => "Newtech Co., Ltd.", + "NEXSAN" => "Nexsan Technologies, Ltd.", + "NFINIDAT" => "Infinidat Ltd.", + "NHR" => "NH Research, Inc.", + "Nike" => "Nike, Inc.", + "Nimble" => "Nimble Storage", + "NISCA" => "NISCA Inc.", + "NISHAN" => "Nishan Systems Inc.", + "Nitz" => "Nitz Associates, Inc.", + "NKK" => "NKK Corp.", + "NRC" => "Nakamichi Research Corporation", + "NSD" => "Nippon Systems Development Co.,Ltd.", + "NSM" => "NSM Jukebox GmbH", + "nStor" => "nStor Technologies, Inc.", + "NT" => "Northern Telecom", + "NUCONNEX" => "NuConnex", + "NUSPEED" => "NuSpeed, Inc.", + "NVIDIA" => "NVIDIA Corporation", + "NVMe" => "NVM Express Working Group", + "OAI" => "Optical Access International", + "OCE" => "Oce Graphics", + "ODS" => "ShenZhen DCS Group Co.,Ltd", + "OHDEN" => "Ohden Co., Ltd.", + "OKI" => "OKI Electric Industry Co.,Ltd (Japan)", + "Olidata" => "Olidata S.p.A.", + "OMI" => "Optical Media International", + "OMNIFI" => "Rockford Corporation - Omnifi Media", + "OMNIS" => "OMNIS Company (FRANCE)", + "Ophidian" => "Ophidian Designs", + "opslag" => "Tyrone Systems", + "Optelec" => "Optelec BV", + "Optiarc" => "Sony Optiarc Inc.", + "OPTIMEM" => "Cipher/Optimem", + "OPTOTECH" => "Optotech", + "ORACLE" => "Oracle Corporation", + "ORANGE" => "Orange Micro, Inc.", + "ORCA" => "Orca Technology", + "Origin" => "Origin Energy", + "OSI" => "Optical Storage International", + "OSNEXUS" => "OS NEXUS, Inc.", + "OTL" => "OTL Engineering", + "OVERLAND" => "Overland Storage Inc.", + "pacdigit" => "Pacific Digital Corp", + "Packard" => "Parkard Bell", + "Panasas" => "Panasas, Inc.", + "PARALAN" => "Paralan Corporation", + "PASCOsci" => "Pasco Scientific", + "PATHLGHT" => "Pathlight Technology, Inc.", + "PCS" => "Pro Charging Systems, LLC", + "PerStor" => "Perstor", + "PERTEC" => "Pertec Peripherals Corporation", + "PFTI" => "Performance Technology Inc.", + "PFU" => "PFU Limited", + "Phigment" => "Phigment Technologies", + "PHILIPS" => "Philips Electronics", + "PICO" => "Packard Instrument Company", + "PIK" => "TECHNILIENT & MCS", + "Pillar" => "Pillar Data Systems", + "PIONEER" => "Pioneer Electronic Corp.", + "Pirus" => "Pirus Networks", + "PIVOT3" => "Pivot3, Inc.", + "PLASMON" => "Plasmon Data", + "Pliant" => "Pliant Technology, Inc.", + "PMCSIERA" => "PMC-Sierra", + "PME" => "Precision Measurement Engineering", + "PNNMed" => "PNN Medical SA", + "POKEN" => "Poken SA", + "POLYTRON" => "PT. HARTONO ISTANA TEKNOLOGI", + "PRAIRIE" => "PrairieTek", + "PREPRESS" => "PrePRESS Solutions", + "PRESOFT" => "PreSoft Architects", + "PRESTON" => "Preston Scientific", + "PRIAM" => "Priam", + "PRIMAGFX" => "Primagraphics Ltd", + "PRIMOS" => "Primos", + "PROCOM" => "Procom Technology", + "PROLIFIC" => "Prolific Technology Inc.", + "PROMISE" => "PROMISE TECHNOLOGY, Inc", + "PROSTOR" => "ProStor Systems, Inc.", + "PROSUM" => "PROSUM", + "PROWARE" => "Proware Technology Corp.", + "PTI" => "Peripheral Technology Inc.", + "PTICO" => "Pacific Technology International", + "PURE" => "PURE Storage", + "Qi-Hardw" => "Qi Hardware", + "QIC" => + "Quarter-Inch Cartridge Drive Standards, Inc.", + "QLogic" => "QLogic Corporation", + "QNAP" => "QNAP Systems", + "Qsan" => "QSAN Technology, Inc.", + "QUALSTAR" => "Qualstar", + "QUANTEL" => "Quantel Ltd.", + "QUANTUM" => "Quantum Corp.", + "QUIX" => "Quix Computerware AG", + "R-BYTE" => "R-Byte, Inc.", + "RACALREC" => "Racal Recorders", + "RADITEC" => "Radikal Technologies Deutschland GmbH", + "RADSTONE" => "Radstone Technology", + "RAIDINC" => "RAID Inc.", + "RASSYS" => "Rasilient Systems Inc.", + "RASVIA" => "Rasvia Systems, Inc.", + "rave-mp" => "Go Video", + "RDKMSTG" => "MMS Dipl. Ing. Rolf-Dieter Klein", + "RDStor" => "Rorke China", + "Readboy" => "Readboy Ltd Co.", + "Realm" => "Realm Systems", + "realtek" => "Realtek Semiconductor Corp.", + "REDUXIO" => "Reduxio Systems Ltd.", + "rehanltd" => "Rehan Electronics Ltd", + "REKA" => "REKA HEALTH PTE LTD", + "RELDATA" => "RELDATA Inc", + "RENAGmbH" => "RENA GmbH", + "ReThinkM" => "RETHINK MEDICAL, INC", + "Revivio" => "Revivio, Inc.", + "RGBLaser" => "RGB Lasersysteme GmbH", + "RGI" => "Raster Graphics, Inc.", + "RHAPSODY" => "Rhapsody Networks, Inc.", + "RHS" => "Racal-Heim Systems GmbH", + "RICOH" => "Ricoh", + "RODIME" => "Rodime", + "Rorke" => "RD DATA Technology (ShenZhen) Limited", + "Royaltek" => "RoyalTek company Ltd.", + "RPS" => "RPS", + "RTI" => "Reference Technology", + "S-D" => "Sauer-Danfoss", + "S-flex" => "Storageflex Inc", + "S-SYSTEM" => "S-SYSTEM", + "S1" => "storONE", + "SAMSUNG" => "Samsung Electronics Co., Ltd.", + "SAN" => "Storage Area Networks, Ltd.", + "Sandial" => "Sandial Systems, Inc.", + "SanDisk" => "SanDisk Corporation", + "SANKYO" => "Sankyo Seiki", + "SANRAD" => "SANRAD Inc.", + "SANYO" => "SANYO Electric Co., Ltd.", + "SC.Net" => "StorageConnections.Net", + "SCALE" => "Scale Computing, Inc.", + "SCIENTEK" => "SCIENTEK CORP", + "SCInc." => "Storage Concepts, Inc.", + "SCREEN" => "Dainippon Screen Mfg. Co., Ltd.", + "SDI" => "Storage Dimensions, Inc.", + "SDS" => "Solid Data Systems", + "SEAC" => "SeaChange International, Inc.", + "SEAGATE" => "Seagate", + "SEAGRAND" => "SEAGRAND In Japan", + "Seanodes" => "Seanodes", + "Sec. Key" => "SecureKey Technologies Inc.", + "SEQUOIA" => "Sequoia Advanced Technologies, Inc.", + "SGI" => "Silicon Graphics International", + "Shannon" => "Shannon Systems Co., Ltd.", + "Shinko" => "Shinko Electric Co., Ltd.", + "SIEMENS" => "Siemens", + "SigmaTel" => "SigmaTel, Inc.", + "SII" => "Seiko Instruments Inc.", + "SIMPLE" => "SimpleTech, Inc.", + "SIVMSD" => "IMAGO SOFTWARE SL", + "SKhynix" => "SK hynix Inc.", + "SLCNSTOR" => "SiliconStor, Inc.", + "SLI" => "Sierra Logic, Inc.", + "SMCI" => "Super Micro Computer, Inc.", + "SmrtStor" => "Smart Storage Systems", + "SMS" => "Scientific Micro Systems/OMTI", + "SMSC" => "SMSC Storage, Inc.", + "SMX" => "Smartronix, Inc.", + "SNYSIDE" => "Sunnyside Computing Inc.", + "SoftLock" => "Softlock Digital Security Provider", + "SolidFir" => "SolidFire, Inc.", + "SONIC" => "Sonic Solutions", + "SoniqCas" => "SoniqCast", + "SONY" => "Sony Corporation Japan", + "SOUL" => "Soul Storage Technology (Wuxi) Co., Ltd", + "SPD" => "Storage Products Distribution, Inc.", + "SPECIAL" => "Special Computing Co.", + "SPECTRA" => + "Spectra Logic, a Division of Western Automation Labs, Inc.", + "SPERRY" => "Sperry", + "Spintso" => "Spintso International AB", + "STARBORD" => "Starboard Storage Systems, Inc.", + "STARWIND" => "StarWind Software, Inc.", + "STEC" => "STEC, Inc.", + "Sterling" => "Sterling Diagnostic Imaging, Inc.", + "STK" => "Storage Technology Corporation", + "STNWOOD" => "Stonewood Group", + "STONEFLY" => "StoneFly Networks, Inc.", + "STOR" => "StorageNetworks, Inc.", + "STORAPP" => "StorageApps, Inc.", + "STORCIUM" => "Intelligent Systems Services Inc.", + "STORCOMP" => "Storage Computer Corporation", + "STORM" => "Storm Technology, Inc.", + "StorMagc" => "StorMagic", + "Stratus" => "Stratus Technologies", + "StrmLgc" => "StreamLogic Corp.", + "SUMITOMO" => "Sumitomo Electric Industries, Ltd.", + "SUN" => "Sun Microsystems, Inc.", + "SUNCORP" => "SunCorporation", + "suntx" => "Suntx System Co., Ltd", + "SUSE" => "SUSE Linux", + "Swinxs" => "Swinxs BV", + "SYMANTEC" => "Symantec Corporation", + "SYMBIOS" => "Symbios Logic Inc.", + "SYMWAVE" => "Symwave, Inc.", + "SYNCSORT" => "Syncsort Incorporated", + "SYNERWAY" => "Synerway", + "SYNOLOGY" => "Synology, Inc.", + "SyQuest" => "SyQuest Technology, Inc.", + "SYSGEN" => "Sysgen", + "T-MITTON" => "Transmitton England", + "T-MOBILE" => "T-Mobile USA, Inc.", + "T11" => "INCITS Technical Committee T11", + "TALARIS" => "Talaris Systems, Inc.", + "TALLGRAS" => "Tallgrass Technologies", + "TANDBERG" => "Tandberg Data A/S", + "TANDEM" => "Tandem", + "TANDON" => "Tandon", + "TCL" => "TCL Shenzhen ASIC MIcro-electronics Ltd", + "TDK" => "TDK Corporation", + "TEAC" => "TEAC Japan", + "TECOLOTE" => "Tecolote Designs", + "TEGRA" => "Tegra Varityper", + "Teilch" => "Teilch", + "Tek" => "Tektronix", + "TELLERT" => "Tellert Elektronik GmbH", + "TENTIME" => "Laura Technologies, Inc.", + "TFDATACO" => "TimeForge", + "TGEGROUP" => "TGE Group Co.,LTD.", + "Thecus" => "Thecus Technology Corp.", + "TI-DSG" => "Texas Instruments", + "TiGi" => "TiGi Corporation", + "TILDESGN" => "Tildesign bv", + "Tite" => "Tite Technology Limited", + "TKS Inc." => "TimeKeeping Systems, Inc.", + "TLMKS" => "Telemakus LLC", + "TMS" => "Texas Memory Systems, Inc.", + "TMS100" => "TechnoVas", + "TOLISGRP" => "The TOLIS Group", + "TOSHIBA" => "Toshiba Japan", + "TOYOU" => "TOYOU FEIJI ELECTRONICS CO.,LTD.", + "Tracker" => "Tracker, LLC", + "TRIOFLEX" => "Trioflex Oy", + "TRIPACE" => "Tripace", + "TRLogger" => "TrueLogger Ltd.", + "TROIKA" => "Troika Networks, Inc.", + "TRULY" => "TRULY Electronics MFG. LTD.", + "TRUSTED" => "Trusted Data Corporation", + "TSSTcorp" => + "Toshiba Samsung Storage Technology Corporation", + "TZM" => "TZ Medical", + "UD-DVR" => "Bigstone Project.", + "UDIGITAL" => "United Digital Limited", + "UIT" => "United Infomation Technology", + "ULTRA" => "UltraStor Corporation", + "UNISTOR" => "Unistor Networks, Inc.", + "UNISYS" => "Unisys", + "USCORE" => "Underscore, Inc.", + "USDC" => "US Design Corp.", + "Top VASCO" => "Vasco Data Security", + "VDS" => "Victor Data Systems Co., Ltd.", + "VELDANA" => "VELDANA MEDICAL SA", + "VENTANA" => "Ventana Medical Systems", + "Verari" => "Verari Systems, Inc.", + "VERBATIM" => "Verbatim Corporation", + "Vercet" => "Vercet LLC", + "VERITAS" => "VERITAS Software Corporation", + "Vexata" => "Vexata Inc", + "VEXCEL" => "VEXCEL IMAGING GmbH", + "VICOMSL1" => "Vicom Systems, Inc.", + "VicomSys" => "Vicom Systems, Inc.", + "VIDEXINC" => "Videx, Inc.", + "VIOLIN" => "Violin Memory, Inc.", + "VIRIDENT" => "Virident Systems, Inc.", + "VITESSE" => "Vitesse Semiconductor Corporation", + "VIXEL" => "Vixel Corporation", + "VLS" => "Van Lent Systems BV", + "VMAX" => "VMAX Technologies Corp.", + "VMware" => "VMware Inc.", + "Vobis" => "Vobis Microcomputer AG", + "VOLTAIRE" => "Voltaire Ltd.", + "VRC" => "Vermont Research Corp.", + "VRugged" => "Vanguard Rugged Storage", + "VTGadget" => "Vermont Gadget Company", + "Waitec" => "Waitec NV", + "WangDAT" => "WangDAT", + "WANGTEK" => "Wangtek", + "Wasabi" => "Wasabi Systems", + "WAVECOM" => "Wavecom", + "WD" => "Western Digital Corporation", + "WDC" => "Western Digital Corporation", + "WDIGTL" => "Western Digital", + "WDTI" => "Western Digital Technologies, Inc.", + "WEARNES" => "Wearnes Technology Corporation", + "WeeraRes" => "Weera Research Pte Ltd", + "Wildflwr" => "Wildflower Technologies, Inc.", + "WSC0001" => "Wisecom, Inc.", + "X3" => + "InterNational Committee for Information Technology Standards (INCITS)", + "XEBEC" => "Xebec Corporation", + "XENSRC" => "XenSource, Inc.", + "Xerox" => "Xerox Corporation", + "XIOtech" => "XIOtech Corporation", + "XIRANET" => "Xiranet Communications GmbH", + "XIV" => "XIV", + "XtremIO" => "XtremIO", + "XYRATEX" => "Xyratex", + "YINHE" => "NUDT Computer Co.", + "YIXUN" => "Yixun Electronic Co.,Ltd.", + "YOTTA" => "YottaYotta, Inc.", + "Zarva" => "Zarva Digital Technology Co., Ltd.", + "ZETTA" => "Zetta Systems, Inc.", + "ZTE" => "ZTE Corporation", + "ZVAULT" => "Zetavault", + _ => scsiVendorString + }; +} \ No newline at end of file diff --git a/Aaru.Decoders/SecureDigital/CID.cs b/Aaru.Decoders/SecureDigital/CID.cs new file mode 100644 index 000000000..dd368aeb5 --- /dev/null +++ b/Aaru.Decoders/SecureDigital/CID.cs @@ -0,0 +1,133 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : CID.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SecureDigital CID. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Text; +using Aaru.Helpers; + +namespace Aaru.Decoders.SecureDigital; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public class CID +{ + public string ApplicationID; + public byte CRC; + public byte Manufacturer; + public ushort ManufacturingDate; + public string ProductName; + public byte ProductRevision; + public uint ProductSerialNumber; +} + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +public static partial class Decoders +{ + public static CID DecodeCID(uint[] response) + { + if(response?.Length != 4) + return null; + + var data = new byte[16]; + + byte[] tmp = BitConverter.GetBytes(response[0]); + Array.Copy(tmp, 0, data, 0, 4); + tmp = BitConverter.GetBytes(response[1]); + Array.Copy(tmp, 0, data, 4, 4); + tmp = BitConverter.GetBytes(response[2]); + Array.Copy(tmp, 0, data, 8, 4); + tmp = BitConverter.GetBytes(response[3]); + Array.Copy(tmp, 0, data, 12, 4); + + return DecodeCID(data); + } + + public static CID DecodeCID(byte[] response) + { + if(response?.Length != 16) + return null; + + var cid = new CID + { + Manufacturer = response[0], + ProductRevision = response[8], + ProductSerialNumber = Swapping.Swap(BitConverter.ToUInt32(response, 9)), + ManufacturingDate = (ushort)(((response[13] & 0x0F) << 8) + response[14]), + CRC = (byte)((response[15] & 0xFE) >> 1) + }; + + var tmp = new byte[2]; + Array.Copy(response, 1, tmp, 0, 2); + cid.ApplicationID = StringHandlers.CToString(tmp); + tmp = new byte[5]; + Array.Copy(response, 3, tmp, 0, 5); + cid.ProductName = StringHandlers.CToString(tmp); + + return cid; + } + + public static string PrettifyCID(CID cid) + { + if(cid == null) + return null; + + var sb = new StringBuilder(); + + sb.AppendLine(Localization.SecureDigital_Device_Identification_Register); + sb.AppendFormat(Localization.Manufacturer_0, VendorString.Prettify(cid.Manufacturer)).AppendLine(); + sb.AppendFormat(Localization.Application_ID_0, cid.ApplicationID).AppendLine(); + sb.AppendFormat(Localization.Product_name_0, cid.ProductName).AppendLine(); + + sb.AppendFormat(Localization.Product_revision_0_1, (cid.ProductRevision & 0xF0) >> 4, + cid.ProductRevision & 0x0F). + AppendLine(); + + sb.AppendFormat(Localization.Product_serial_number_0, cid.ProductSerialNumber).AppendLine(); + + sb.AppendFormat(Localization.Device_manufactured_month_0_of_1, (cid.ManufacturingDate & 0xF00) >> 8, + (cid.ManufacturingDate & 0xFF) + 2000). + AppendLine(); + + sb.AppendFormat(Localization.CID_CRC_0, cid.CRC).AppendLine(); + + return sb.ToString(); + } + + public static string PrettifyCID(uint[] response) => PrettifyCID(DecodeCID(response)); + + public static string PrettifyCID(byte[] response) => PrettifyCID(DecodeCID(response)); +} \ No newline at end of file diff --git a/Aaru.Decoders/SecureDigital/CSD.cs b/Aaru.Decoders/SecureDigital/CSD.cs new file mode 100644 index 000000000..a561245bf --- /dev/null +++ b/Aaru.Decoders/SecureDigital/CSD.cs @@ -0,0 +1,600 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : CSD.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SecureDigital CSD. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SecureDigital; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public class CSD +{ + public ushort Classes; + public bool Copy; + public byte CRC; + public bool DSRImplemented; + public bool EraseBlockEnable; + public byte EraseSectorSize; + public byte FileFormat; + public bool FileFormatGroup; + public byte NSAC; + public bool PermanentWriteProtect; + public byte ReadBlockLength; + public byte ReadCurrentAtVddMax; + public byte ReadCurrentAtVddMin; + public bool ReadMisalignment; + public bool ReadsPartialBlocks; + public uint Size; + public byte SizeMultiplier; + public byte Speed; + public byte Structure; + public byte TAAC; + public bool TemporaryWriteProtect; + public byte WriteBlockLength; + public byte WriteCurrentAtVddMax; + public byte WriteCurrentAtVddMin; + public bool WriteMisalignment; + public bool WriteProtectGroupEnable; + public byte WriteProtectGroupSize; + public bool WritesPartialBlocks; + public byte WriteSpeedFactor; +} + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +public static partial class Decoders +{ + public static CSD DecodeCSD(uint[] response) + { + if(response?.Length != 4) + return null; + + var data = new byte[16]; + + byte[] tmp = BitConverter.GetBytes(response[0]); + Array.Copy(tmp, 0, data, 0, 4); + tmp = BitConverter.GetBytes(response[1]); + Array.Copy(tmp, 0, data, 4, 4); + tmp = BitConverter.GetBytes(response[2]); + Array.Copy(tmp, 0, data, 8, 4); + tmp = BitConverter.GetBytes(response[3]); + Array.Copy(tmp, 0, data, 12, 4); + + return DecodeCSD(data); + } + + public static CSD DecodeCSD(byte[] response) + { + if(response?.Length != 16) + return null; + + var csd = new CSD + { + Structure = (byte)((response[0] & 0xC0) >> 6), + TAAC = response[1], + NSAC = response[2], + Speed = response[3], + Classes = (ushort)((response[4] << 4) + ((response[5] & 0xF0) >> 4)), + ReadBlockLength = (byte)(response[5] & 0x0F), + ReadsPartialBlocks = (response[6] & 0x80) == 0x80, + WriteMisalignment = (response[6] & 0x40) == 0x40, + ReadMisalignment = (response[6] & 0x20) == 0x20, + DSRImplemented = (response[6] & 0x10) == 0x10, + EraseBlockEnable = (response[10] & 0x40) == 0x40, + EraseSectorSize = (byte)(((response[10] & 0x3F) << 1) + ((response[11] & 0x80) >> 7)), + WriteProtectGroupSize = (byte)(response[11] & 0x7F), + WriteProtectGroupEnable = (response[12] & 0x80) == 0x80, + WriteSpeedFactor = (byte)((response[12] & 0x1C) >> 2), + WriteBlockLength = (byte)(((response[12] & 0x03) << 2) + ((response[13] & 0xC0) >> 6)), + WritesPartialBlocks = (response[13] & 0x20) == 0x20, + FileFormatGroup = (response[14] & 0x80) == 0x80, + Copy = (response[14] & 0x40) == 0x40, + PermanentWriteProtect = (response[14] & 0x20) == 0x20, + TemporaryWriteProtect = (response[14] & 0x10) == 0x10, + FileFormat = (byte)((response[14] & 0x0C) >> 2), + CRC = (byte)((response[15] & 0xFE) >> 1) + }; + + if(csd.Structure == 0) + { + csd.Size = (ushort)(((response[6] & 0x03) << 10) + (response[7] << 2) + ((response[8] & 0xC0) >> 6)); + + csd.ReadCurrentAtVddMin = (byte)((response[8] & 0x38) >> 3); + csd.ReadCurrentAtVddMax = (byte)(response[8] & 0x07); + csd.WriteCurrentAtVddMin = (byte)((response[9] & 0xE0) >> 5); + csd.WriteCurrentAtVddMax = (byte)((response[9] & 0x1C) >> 2); + csd.SizeMultiplier = (byte)(((response[9] & 0x03) << 1) + ((response[10] & 0x80) >> 7)); + } + else + csd.Size = (uint)(((response[7] & 0x3F) << 16) + (response[8] << 8) + response[9]); + + return csd; + } + + public static string PrettifyCSD(CSD csd) + { + if(csd == null) + return null; + + double unitFactor = 0; + double multiplier = 0; + var unit = ""; + + var sb = new StringBuilder(); + sb.AppendLine(Localization.SecureDigital_Device_Specific_Data_Register); + + switch(csd.Structure) + { + case 0: + sb.AppendLine("\t" + Localization.Register_version_1_0); + + break; + case 1: + sb.AppendLine("\t" + Localization.Register_version_2_0); + + break; + } + + switch(csd.TAAC & 0x07) + { + case 0: + unit = Localization.unit_ns; + unitFactor = 1; + + break; + case 1: + unit = Localization.unit_ns; + unitFactor = 10; + + break; + case 2: + unit = Localization.unit_ns; + unitFactor = 100; + + break; + case 3: + unit = Localization.unit_μs; + unitFactor = 1; + + break; + case 4: + unit = Localization.unit_μs; + unitFactor = 10; + + break; + case 5: + unit = Localization.unit_μs; + unitFactor = 100; + + break; + case 6: + unit = Localization.unit_ms; + unitFactor = 1; + + break; + case 7: + unit = Localization.unit_ms; + unitFactor = 10; + + break; + } + + multiplier = ((csd.TAAC & 0x78) >> 3) switch + { + 0 => 0, + 1 => 1, + 2 => 1.2, + 3 => 1.3, + 4 => 1.5, + 5 => 2, + 6 => 2.5, + 7 => 3, + 8 => 3.5, + 9 => 4, + 10 => 4.5, + 11 => 5, + 12 => 5.5, + 13 => 6, + 14 => 7, + 15 => 8, + _ => multiplier + }; + + double result = unitFactor * multiplier; + sb.AppendFormat("\t" + Localization.Asynchronous_data_access_time_is_0_1, result, unit).AppendLine(); + + sb.AppendFormat("\t" + Localization.Clock_dependent_part_of_data_access_is_0_clock_cycles, csd.NSAC * 100). + AppendLine(); + + unit = Localization.MBit_s; + + switch(csd.Speed & 0x07) + { + case 0: + unitFactor = 0.1; + + break; + case 1: + unitFactor = 1; + + break; + case 2: + unitFactor = 10; + + break; + case 3: + unitFactor = 100; + + break; + default: + unit = Localization.unit_unknown; + unitFactor = 0; + + break; + } + + multiplier = ((csd.Speed & 0x78) >> 3) switch + { + 0 => 0, + 1 => 1, + 2 => 1.2, + 3 => 1.3, + 4 => 1.5, + 5 => 2, + 6 => 2.6, + 7 => 3, + 8 => 3.5, + 9 => 4, + 10 => 4.5, + 11 => 5.2, + 12 => 5.5, + 13 => 6, + 14 => 7, + 15 => 8, + _ => multiplier + }; + + result = unitFactor * multiplier; + sb.AppendFormat("\t" + Localization.Device_transfer_speed_0_1, result, unit).AppendLine(); + + unit = ""; + + for(int cl = 0, mask = 1; cl <= 11; cl++, mask <<= 1) + { + if((csd.Classes & mask) == mask) + unit += $" {cl}"; + } + + sb.AppendFormat("\t" + Localization.Device_support_command_classes_0, unit).AppendLine(); + + sb.AppendFormat("\t" + Localization.Read_block_length_is_0_bytes, Math.Pow(2, csd.ReadBlockLength)). + AppendLine(); + + if(csd.ReadsPartialBlocks) + sb.AppendLine("\t" + Localization.Device_allows_reading_partial_blocks); + + if(csd.WriteMisalignment) + sb.AppendLine("\t" + Localization.Write_commands_can_cross_physical_block_boundaries); + + if(csd.ReadMisalignment) + sb.AppendLine("\t" + Localization.Read_commands_can_cross_physical_block_boundaries); + + if(csd.DSRImplemented) + sb.AppendLine("\t" + Localization.Device_implements_configurable_driver_stage); + + if(csd.Structure == 0) + { + result = (csd.Size + 1) * Math.Pow(2, csd.SizeMultiplier + 2); + sb.AppendFormat("\t" + Localization.Device_has_0_blocks, (int)result).AppendLine(); + + result = (csd.Size + 1) * Math.Pow(2, csd.SizeMultiplier + 2) * Math.Pow(2, csd.ReadBlockLength); + + switch(result) + { + case > 1073741824: + sb.AppendFormat("\t" + Localization.Device_has_0_GiB, result / 1073741824.0).AppendLine(); + + break; + case > 1048576: + sb.AppendFormat("\t" + Localization.Device_has_0_MiB, result / 1048576.0).AppendLine(); + + break; + case > 1024: + sb.AppendFormat("\t" + Localization.Device_has_0_KiB, result / 1024.0).AppendLine(); + + break; + default: + sb.AppendFormat("\t" + Localization.Device_has_0_bytes, result).AppendLine(); + + break; + } + } + else + { + sb.AppendFormat("\t" + Localization.Device_has_0_blocks, (csd.Size + 1) * 1024).AppendLine(); + result = ((ulong)csd.Size + 1) * 1024 * 512; + + switch(result) + { + case > 1099511627776: + sb.AppendFormat("\t" + Localization.Device_has_0_TiB, result / 1099511627776.0).AppendLine(); + + break; + case > 1073741824: + sb.AppendFormat("\t" + Localization.Device_has_0_GiB, result / 1073741824.0).AppendLine(); + + break; + case > 1048576: + sb.AppendFormat("\t" + Localization.Device_has_0_MiB, result / 1048576.0).AppendLine(); + + break; + case > 1024: + sb.AppendFormat("\t" + Localization.Device_has_0_KiB, result / 1024.0).AppendLine(); + + break; + default: + sb.AppendFormat("\t" + Localization.Device_has_0_bytes, result).AppendLine(); + + break; + } + } + + if(csd.Structure == 0) + { + switch(csd.ReadCurrentAtVddMin & 0x07) + { + case 0: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_0_5mA_for_reading_at_minimum_voltage); + + break; + case 1: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_1mA_for_reading_at_minimum_voltage); + + break; + case 2: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_5mA_for_reading_at_minimum_voltage); + + break; + case 3: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_10mA_for_reading_at_minimum_voltage); + + break; + case 4: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_25mA_for_reading_at_minimum_voltage); + + break; + case 5: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_35mA_for_reading_at_minimum_voltage); + + break; + case 6: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_60mA_for_reading_at_minimum_voltage); + + break; + case 7: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_100mA_for_reading_at_minimum_voltage); + + break; + } + + switch(csd.ReadCurrentAtVddMax & 0x07) + { + case 0: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_1mA_for_reading_at_maximum_voltage); + + break; + case 1: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_5mA_for_reading_at_maximum_voltage); + + break; + case 2: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_10mA_for_reading_at_maximum_voltage); + + break; + case 3: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_25mA_for_reading_at_maximum_voltage); + + break; + case 4: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_35mA_for_reading_at_maximum_voltage); + + break; + case 5: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_45mA_for_reading_at_maximum_voltage); + + break; + case 6: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_80mA_for_reading_at_maximum_voltage); + + break; + case 7: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_200mA_for_reading_at_maximum_voltage); + + break; + } + + switch(csd.WriteCurrentAtVddMin & 0x07) + { + case 0: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_0_5mA_for_writing_at_minimum_voltage); + + break; + case 1: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_1mA_for_writing_at_minimum_voltage); + + break; + case 2: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_5mA_for_writing_at_minimum_voltage); + + break; + case 3: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_10mA_for_writing_at_minimum_voltage); + + break; + case 4: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_25mA_for_writing_at_minimum_voltage); + + break; + case 5: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_35mA_for_writing_at_minimum_voltage); + + break; + case 6: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_60mA_for_writing_at_minimum_voltage); + + break; + case 7: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_100mA_for_writing_at_minimum_voltage); + + break; + } + + switch(csd.WriteCurrentAtVddMax & 0x07) + { + case 0: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_1mA_for_writing_at_maximum_voltage); + + break; + case 1: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_5mA_for_writing_at_maximum_voltage); + + break; + case 2: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_10mA_for_writing_at_maximum_voltage); + + break; + case 3: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_25mA_for_writing_at_maximum_voltage); + + break; + case 4: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_35mA_for_writing_at_maximum_voltage); + + break; + case 5: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_45mA_for_writing_at_maximum_voltage); + + break; + case 6: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_80mA_for_writing_at_maximum_voltage); + + break; + case 7: + sb.AppendLine("\t" + Localization.Device_uses_a_maximum_of_200mA_for_writing_at_maximum_voltage); + + break; + } + + if(csd.EraseBlockEnable) + sb.AppendLine("\t" + Localization.Device_can_erase_multiple_blocks); + + // TODO: Check specification + sb.AppendFormat("\t" + Localization.Device_must_erase_a_minimum_of_0_blocks_at_a_time, + Convert.ToUInt32(csd.EraseSectorSize) + 1). + AppendLine(); + + if(csd.WriteProtectGroupEnable) + { + sb.AppendLine("\t" + Localization.Device_can_write_protect_regions); + + // TODO: Check specification + // unitFactor = Convert.ToDouble(csd.WriteProtectGroupSize); + + sb.AppendFormat("\t" + Localization.Device_can_write_protect_a_minimum_of_0_blocks_at_a_time, + (int)(result + 1)). + AppendLine(); + } + else + sb.AppendLine("\t" + Localization.Device_cant_write_protect_regions); + } + + sb.AppendFormat("\t" + Localization.Writing_is_0_times_slower_than_reading, Math.Pow(2, csd.WriteSpeedFactor)). + AppendLine(); + + sb.AppendFormat("\t" + Localization.Write_block_length_is_0_bytes, Math.Pow(2, csd.WriteBlockLength)). + AppendLine(); + + if(csd.WritesPartialBlocks) + sb.AppendLine("\t" + Localization.Device_allows_writing_partial_blocks); + + if(!csd.Copy) + sb.AppendLine("\t" + Localization.Device_contents_are_original); + + if(csd.PermanentWriteProtect) + sb.AppendLine("\t" + Localization.Device_is_permanently_write_protected); + + if(csd.TemporaryWriteProtect) + sb.AppendLine("\t" + Localization.Device_is_temporarily_write_protected); + + if(!csd.FileFormatGroup) + { + switch(csd.FileFormat) + { + case 0: + sb.AppendLine("\t" + Localization.Device_is_formatted_like_a_hard_disk); + + break; + case 1: + sb.AppendLine("\t" + Localization.Device_is_formatted_like_a_floppy_disk_using_Microsoft_FAT); + + break; + case 2: + sb.AppendLine("\t" + Localization.Device_uses_Universal_File_Format); + + break; + default: + sb.AppendFormat("\t" + Localization.Device_uses_unknown_file_format_code_0, csd.FileFormat). + AppendLine(); + + break; + } + } + else + { + sb.AppendFormat("\t" + Localization.Device_uses_unknown_file_format_code_0_and_file_format_group_1, + csd.FileFormat). + AppendLine(); + } + + sb.AppendFormat("\t" + Localization.CSD_CRC_0, csd.CRC).AppendLine(); + + return sb.ToString(); + } + + public static string PrettifyCSD(uint[] response) => PrettifyCSD(DecodeCSD(response)); + + public static string PrettifyCSD(byte[] response) => PrettifyCSD(DecodeCSD(response)); +} \ No newline at end of file diff --git a/Aaru.Decoders/SecureDigital/OCR.cs b/Aaru.Decoders/SecureDigital/OCR.cs new file mode 100644 index 000000000..651fe46c9 --- /dev/null +++ b/Aaru.Decoders/SecureDigital/OCR.cs @@ -0,0 +1,147 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : OCR.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SecureDigital OCR. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Text; +using Aaru.Helpers; + +namespace Aaru.Decoders.SecureDigital; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "UnassignedField.Global")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +public class OCR +{ + public bool CCS; + public bool LowPower; + public bool OneEight; + public bool PowerUp; + public bool ThreeFive; + public bool ThreeFour; + public bool ThreeOne; + public bool ThreeThree; + public bool ThreeTwo; + public bool ThreeZero; + public bool TwoEight; + public bool TwoNine; + public bool TwoSeven; + public bool UHS; +} + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +public static partial class Decoders +{ + public static OCR DecodeOCR(uint response) + { + response = Swapping.Swap(response); + + return new OCR + { + PowerUp = (response & 0x80000000) == 0x80000000, + CCS = (response & 0x40000000) == 0x40000000, + UHS = (response & 0x20000000) == 0x20000000, + OneEight = (response & 0x01000000) == 0x01000000, + ThreeFive = (response & 0x00800000) == 0x00800000, + ThreeFour = (response & 0x00400000) == 0x00400000, + ThreeThree = (response & 0x00200000) == 0x00200000, + ThreeTwo = (response & 0x00100000) == 0x00100000, + ThreeOne = (response & 0x00080000) == 0x00080000, + ThreeZero = (response & 0x00040000) == 0x00040000, + TwoNine = (response & 0x00020000) == 0x00020000, + TwoEight = (response & 0x00010000) == 0x00010000, + TwoSeven = (response & 0x00008000) == 0x00008000, + LowPower = (response & 0x00000080) == 0x00000080 + }; + } + + public static OCR DecodeOCR(byte[] response) => + response?.Length != 4 ? null : DecodeOCR(BitConverter.ToUInt32(response, 0)); + + public static string PrettifyOCR(OCR ocr) + { + if(ocr == null) + return null; + + var sb = new StringBuilder(); + sb.AppendLine(Localization.SecureDigital_Operation_Conditions_Register); + + if(!ocr.PowerUp) + sb.AppendLine("\t" + Localization.Device_is_powering_up); + + if(ocr.CCS) + sb.AppendLine("\t" + Localization.Device_is_SDHC_SDXC_or_higher); + + if(ocr.UHS) + sb.AppendLine("\t" + Localization.Device_is_UHS_II_or_higher); + + if(ocr.ThreeFive) + sb.AppendLine("\t" + Localization.Device_can_work_with_supply_3_5_3_6V); + + if(ocr.ThreeFour) + sb.AppendLine("\t" + Localization.Device_can_work_with_supply_3_4_3_5V); + + if(ocr.ThreeThree) + sb.AppendLine("\t" + Localization.Device_can_work_with_supply_3_3_3_4V); + + if(ocr.ThreeTwo) + sb.AppendLine("\t" + Localization.Device_can_work_with_supply_3_2_3_3V); + + if(ocr.ThreeOne) + sb.AppendLine("\t" + Localization.Device_can_work_with_supply_3_1_3_2V); + + if(ocr.TwoNine) + sb.AppendLine("\t" + Localization.Device_can_work_with_supply_2_9_3_0V); + + if(ocr.TwoEight) + sb.AppendLine("\t" + Localization.Device_can_work_with_supply_2_8_2_9V); + + if(ocr.TwoSeven) + sb.AppendLine("\t" + Localization.Device_can_work_with_supply_2_7_2_8V); + + if(ocr.OneEight) + sb.AppendLine("\t" + Localization.Device_can_switch_to_work_with_1_8V_supply); + + if(ocr.LowPower) + sb.AppendLine("\t" + Localization.Device_is_in_low_power_mode); + + return sb.ToString(); + } + + public static string PrettifyOCR(byte[] response) => PrettifyOCR(DecodeOCR(response)); + + public static string PrettifyOCR(uint response) => PrettifyOCR(DecodeOCR(response)); +} \ No newline at end of file diff --git a/Aaru.Decoders/SecureDigital/SCR.cs b/Aaru.Decoders/SecureDigital/SCR.cs new file mode 100644 index 000000000..d2f832431 --- /dev/null +++ b/Aaru.Decoders/SecureDigital/SCR.cs @@ -0,0 +1,252 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : SCR.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SecureDigital SCR. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Text; + +namespace Aaru.Decoders.SecureDigital; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +public class SCR +{ + public BusWidth BusWidth; + public CommandSupport CommandSupport; + public bool DataStatusAfterErase; + public byte ExtendedSecurity; + public byte[] ManufacturerReserved; + public byte Security; + public byte Spec; + public bool Spec3; + public bool Spec4; + public byte SpecX; + public byte Structure; +} + +[Flags] +public enum BusWidth : byte +{ + OneBit = 1 << 0, + FourBit = 1 << 2 +} + +[Flags] +public enum CommandSupport : byte +{ + SpeedClassControl = 1 << 0, + SetBlockCount = 1 << 1, + ExtensionRegisterSingleBlock = 1 << 2, + ExtensionRegisterMultiBlock = 1 << 3 +} + +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "UnusedMember.Global")] +public static partial class Decoders +{ + public static SCR DecodeSCR(uint[] response) + { + if(response?.Length != 2) + return null; + + var data = new byte[8]; + + byte[] tmp = BitConverter.GetBytes(response[0]); + Array.Copy(tmp, 0, data, 0, 4); + tmp = BitConverter.GetBytes(response[1]); + Array.Copy(tmp, 0, data, 4, 4); + + return DecodeSCR(data); + } + + public static SCR DecodeSCR(byte[] response) + { + if(response?.Length != 8) + return null; + + var scr = new SCR + { + Structure = (byte)((response[0] & 0xF0) >> 4), + Spec = (byte)(response[0] & 0x0F), + DataStatusAfterErase = (response[1] & 0x80) == 0x80, + Security = (byte)((response[1] & 0x70) >> 4), + BusWidth = (BusWidth)(response[1] & 0x0F), + Spec3 = (response[2] & 0x80) == 0x80, + ExtendedSecurity = (byte)((response[2] & 0x78) >> 3), + Spec4 = (response[2] & 0x04) == 0x04, + SpecX = (byte)(((response[2] & 0x03) << 2) + ((response[3] & 0xC0) >> 6)), + CommandSupport = (CommandSupport)(response[3] & 0x0F), + ManufacturerReserved = new byte[4] + }; + + Array.Copy(response, 4, scr.ManufacturerReserved, 0, 4); + + return scr; + } + + public static string PrettifySCR(SCR scr) + { + if(scr == null) + return null; + + var sb = new StringBuilder(); + sb.AppendLine(Localization.SecureDigital_Device_Configuration_Register); + + if(scr.Structure != 0) + sb.AppendFormat("\t" + Localization.Unknown_register_version_0, scr.Structure).AppendLine(); + + switch(scr.Spec) + { + case 0 when scr.Spec3 == false && scr.Spec4 == false && scr.SpecX == 0: + sb.AppendLine("\t" + + Localization.Device_follows_SecureDigital_Physical_Layer_Specification_version_1_0x); + + break; + case 1 when scr.Spec3 == false && scr.Spec4 == false && scr.SpecX == 0: + sb.AppendLine("\t" + + Localization.Device_follows_SecureDigital_Physical_Layer_Specification_version_1_10); + + break; + case 2 when scr.Spec3 == false && scr.Spec4 == false && scr.SpecX == 0: + sb.AppendLine("\t" + + Localization.Device_follows_SecureDigital_Physical_Layer_Specification_version_2_00); + + break; + case 2 when scr.Spec3 && scr.Spec4 == false && scr.SpecX == 0: + sb.AppendLine("\t" + + Localization.Device_follows_SecureDigital_Physical_Layer_Specification_version_3_0x); + + break; + case 2 when scr.Spec3 && scr.Spec4 && scr.SpecX == 0: + sb.AppendLine("\t" + + Localization.Device_follows_SecureDigital_Physical_Layer_Specification_version_4_xx); + + break; + case 2 when scr.Spec3: + switch(scr.SpecX) + { + case 1: + sb.AppendLine("\t" + + Localization. + Device_follows_SecureDigital_Physical_Layer_Specification_version_5_xx); + + break; + case 2: + sb.AppendLine("\t" + + Localization. + Device_follows_SecureDigital_Physical_Layer_Specification_version_6_xx); + + break; + case 3: + sb.AppendLine("\t" + + Localization. + Device_follows_SecureDigital_Physical_Layer_Specification_version_7_xx); + + break; + case 4: + sb.AppendLine("\t" + + Localization. + Device_follows_SecureDigital_Physical_Layer_Specification_version_8_xx); + + break; + } + + break; + default: + sb. + AppendFormat("\t" + Localization.Device_follows_SecureDigital_Physical_Layer_Specification_with_unknown_version_0_1_2_3, + scr.Spec, scr.Spec3, scr.Spec4, scr.SpecX). + AppendLine(); + + break; + } + + switch(scr.Security) + { + case 0: + sb.AppendLine("\t" + Localization.Device_does_not_support_CPRM); + + break; + case 1: + sb.AppendLine("\t" + Localization.Device_does_not_use_CPRM); + + break; + case 2: + sb.AppendLine("\t" + Localization.Device_uses_CPRM_according_to_specification_version_1_01); + + break; + case 3: + sb.AppendLine("\t" + Localization.Device_uses_CPRM_according_to_specification_version_2_00); + + break; + case 4: + sb.AppendLine("\t" + Localization.Device_uses_CPRM_according_to_specification_version_3_xx); + + break; + default: + sb.AppendFormat("\t" + Localization.Device_uses_unknown_CPRM_specification_with_code_0, scr.Security). + AppendLine(); + + break; + } + + if(scr.BusWidth.HasFlag(BusWidth.OneBit)) + sb.AppendLine("\t" + Localization.Device_supports_1_bit_data_bus); + + if(scr.BusWidth.HasFlag(BusWidth.FourBit)) + sb.AppendLine("\t" + Localization.Device_supports_4_bit_data_bus); + + if(scr.ExtendedSecurity != 0) + sb.AppendLine("\t" + Localization.Device_supports_extended_security); + + if(scr.CommandSupport.HasFlag(CommandSupport.ExtensionRegisterMultiBlock)) + sb.AppendLine("\t" + Localization.Device_supports_extension_register_multi_block_commands); + + if(scr.CommandSupport.HasFlag(CommandSupport.ExtensionRegisterSingleBlock)) + sb.AppendLine("\t" + Localization.Device_supports_extension_register_single_block_commands); + + if(scr.CommandSupport.HasFlag(CommandSupport.SetBlockCount)) + sb.AppendLine("\t" + Localization.Device_supports_set_block_count_command); + + if(scr.CommandSupport.HasFlag(CommandSupport.SpeedClassControl)) + sb.AppendLine("\t" + Localization.Device_supports_speed_class_control_command); + + return sb.ToString(); + } + + public static string PrettifySCR(uint[] response) => PrettifySCR(DecodeSCR(response)); + + public static string PrettifySCR(byte[] response) => PrettifySCR(DecodeSCR(response)); +} \ No newline at end of file diff --git a/Aaru.Decoders/SecureDigital/VendorString.cs b/Aaru.Decoders/SecureDigital/VendorString.cs new file mode 100644 index 000000000..70faf6844 --- /dev/null +++ b/Aaru.Decoders/SecureDigital/VendorString.cs @@ -0,0 +1,51 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : VendorString.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SecureDigital vendor code. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +namespace Aaru.Decoders.SecureDigital; + +/// Decodes SecureDigital vendors +public static class VendorString +{ + /// Converts the byte value of a SecureDigital vendor ID to the manufacturer's name string + /// SD vendor ID + /// Manufacturer + public static string Prettify(byte sdVendorId) => sdVendorId switch + { + 0x41 => "Kingston", + 0x02 => "Kingston", + 0x03 => "Sandisk", + 0x27 => "CnMemory", + 0xAA => "QEMU", + _ => string.Format(Localization.Unknown_manufacturer_ID_0, + sdVendorId) + }; +} \ No newline at end of file diff --git a/Aaru.Decoders/Sega/CD.cs b/Aaru.Decoders/Sega/CD.cs new file mode 100644 index 000000000..f64c76a80 --- /dev/null +++ b/Aaru.Decoders/Sega/CD.cs @@ -0,0 +1,391 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : CD.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes Sega CD (aka Mega CD) IP.BIN. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Globalization; +using System.Runtime.InteropServices; +using System.Text; +using Aaru.Console; +using Aaru.Localization; +using Marshal = Aaru.Helpers.Marshal; + +namespace Aaru.Decoders.Sega; + +/// Represents the IP.BIN from a SEGA CD / MEGA CD +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static class CD +{ + const string MODULE_NAME = "SegaCD IP.BIN Decoder"; + + /// Decodes an IP.BIN sector in SEGA CD / MEGA CD format + /// IP.BIN sector + /// Decoded IP.BIN + public static IPBin? DecodeIPBin(byte[] ipbin_sector) + { + if(ipbin_sector == null) + return null; + + if(ipbin_sector.Length < 512) + return null; + + IPBin ipbin = Marshal.ByteArrayToStructureLittleEndian(ipbin_sector); + + AaruConsole.DebugWriteLine(MODULE_NAME, "segacd_ipbin.volume_name = \"{0}\"", + Encoding.ASCII.GetString(ipbin.volume_name)); + + AaruConsole.DebugWriteLine(MODULE_NAME, "segacd_ipbin.system_name = \"{0}\"", + Encoding.ASCII.GetString(ipbin.system_name)); + + AaruConsole.DebugWriteLine(MODULE_NAME, "segacd_ipbin.volume_version = \"{0:X}\"", ipbin.volume_version); + + AaruConsole.DebugWriteLine(MODULE_NAME, "segacd_ipbin.volume_type = 0x{0:X8}", ipbin.volume_type); + + AaruConsole.DebugWriteLine(MODULE_NAME, "segacd_ipbin.system_version = 0x{0:X8}", ipbin.system_version); + + AaruConsole.DebugWriteLine(MODULE_NAME, "segacd_ipbin.ip_address = 0x{0:X8}", ipbin.ip_address); + AaruConsole.DebugWriteLine(MODULE_NAME, "segacd_ipbin.ip_loadsize = {0}", ipbin.ip_loadsize); + + AaruConsole.DebugWriteLine(MODULE_NAME, "segacd_ipbin.ip_entry_address = 0x{0:X8}", ipbin.ip_entry_address); + + AaruConsole.DebugWriteLine(MODULE_NAME, "segacd_ipbin.ip_work_ram_size = {0}", ipbin.ip_work_ram_size); + + AaruConsole.DebugWriteLine(MODULE_NAME, "segacd_ipbin.sp_address = 0x{0:X8}", ipbin.sp_address); + AaruConsole.DebugWriteLine(MODULE_NAME, "segacd_ipbin.sp_loadsize = {0}", ipbin.sp_loadsize); + + AaruConsole.DebugWriteLine(MODULE_NAME, "segacd_ipbin.sp_entry_address = 0x{0:X8}", ipbin.sp_entry_address); + + AaruConsole.DebugWriteLine(MODULE_NAME, "segacd_ipbin.sp_work_ram_size = {0}", ipbin.sp_work_ram_size); + + AaruConsole.DebugWriteLine(MODULE_NAME, "segacd_ipbin.release_date = \"{0}\"", + Encoding.ASCII.GetString(ipbin.release_date)); + + AaruConsole.DebugWriteLine(MODULE_NAME, "segacd_ipbin.release_date2 = \"{0}\"", + Encoding.ASCII.GetString(ipbin.release_date2)); + + AaruConsole.DebugWriteLine(MODULE_NAME, "segacd_ipbin.developer_code = \"{0}\"", + Encoding.ASCII.GetString(ipbin.developer_code)); + + AaruConsole.DebugWriteLine(MODULE_NAME, "segacd_ipbin.domestic_title = \"{0}\"", + Encoding.ASCII.GetString(ipbin.domestic_title)); + + AaruConsole.DebugWriteLine(MODULE_NAME, "segacd_ipbin.overseas_title = \"{0}\"", + Encoding.ASCII.GetString(ipbin.overseas_title)); + + AaruConsole.DebugWriteLine(MODULE_NAME, "segacd_ipbin.product_code = \"{0}\"", + Encoding.ASCII.GetString(ipbin.product_code)); + + AaruConsole.DebugWriteLine(MODULE_NAME, "segacd_ipbin.peripherals = \"{0}\"", + Encoding.ASCII.GetString(ipbin.peripherals)); + + AaruConsole.DebugWriteLine(MODULE_NAME, "segacd_ipbin.region_codes = \"{0}\"", + Encoding.ASCII.GetString(ipbin.region_codes)); + + string id = Encoding.ASCII.GetString(ipbin.SegaHardwareID); + + return id is "SEGADISCSYSTEM " or "SEGADATADISC " or "SEGAOS " ? ipbin : null; + } + + /// Pretty prints a decoded IP.BIN in SEGA CD / MEGA CD format + /// Decoded IP.BIN + /// Description of the IP.BIN contents + public static string Prettify(IPBin? decoded) + { + if(decoded == null) + return null; + + IPBin ipbin = decoded.Value; + + var IPBinInformation = new StringBuilder(); + + IPBinInformation.AppendLine("--------------------------------"); + IPBinInformation.AppendLine(Localization.SEGA_IP_BIN_INFORMATION); + IPBinInformation.AppendLine("--------------------------------"); + + // Decoding all data + DateTime ipbindate = DateTime.MinValue; + CultureInfo provider = CultureInfo.InvariantCulture; + + try + { + ipbindate = DateTime.ParseExact(Encoding.ASCII.GetString(ipbin.release_date), "MMddyyyy", provider); + } + catch + { + try + { + ipbindate = DateTime.ParseExact(Encoding.ASCII.GetString(ipbin.release_date2), "yyyy.MMM", provider); + } + #pragma warning disable RECS0022 // A catch clause that catches System.Exception and has an empty body + catch + { + // ignored + } + #pragma warning restore RECS0022 // A catch clause that catches System.Exception and has an empty body + } + + /* + switch (Encoding.ASCII.GetString(application_type)) + { + case "GM": + IPBinInformation.AppendLine("Disc is a game."); + break; + case "AI": + IPBinInformation.AppendLine("Disc is an application."); + break; + default: + IPBinInformation.AppendLine("Disc is from unknown type."); + break; + } + */ + + IPBinInformation.AppendFormat(Core.Volume_name_0, Encoding.ASCII.GetString(ipbin.volume_name)).AppendLine(); + + //IPBinInformation.AppendFormat("Volume version: {0}", Encoding.ASCII.GetString(ipbin.volume_version)).AppendLine(); + //IPBinInformation.AppendFormat("{0}", Encoding.ASCII.GetString(ipbin.volume_type)).AppendLine(); + IPBinInformation.AppendFormat(Localization.System_name_0, Encoding.ASCII.GetString(ipbin.system_name)). + AppendLine(); + + //IPBinInformation.AppendFormat("System version: {0}", Encoding.ASCII.GetString(ipbin.system_version)).AppendLine(); + IPBinInformation.AppendFormat(Localization.Initial_program_address_0, ipbin.ip_address).AppendLine(); + IPBinInformation.AppendFormat(Localization.Initial_program_load_size_0, ipbin.ip_loadsize).AppendLine(); + + IPBinInformation.AppendFormat(Localization.Initial_program_entry_address_0, ipbin.ip_entry_address). + AppendLine(); + + IPBinInformation.AppendFormat(Localization.Initial_program_work_RAM_0, ipbin.ip_work_ram_size).AppendLine(); + IPBinInformation.AppendFormat(Localization.System_program_address_0, ipbin.sp_address).AppendLine(); + IPBinInformation.AppendFormat(Localization.System_program_load_size_0, ipbin.sp_loadsize).AppendLine(); + + IPBinInformation.AppendFormat(Localization.System_program_entry_address_0, ipbin.sp_entry_address).AppendLine(); + + IPBinInformation.AppendFormat(Localization.System_program_work_RAM_0, ipbin.sp_work_ram_size).AppendLine(); + + if(ipbindate != DateTime.MinValue) + IPBinInformation.AppendFormat(Localization.Release_date_0, ipbindate).AppendLine(); + + //IPBinInformation.AppendFormat("Release date (other format): {0}", Encoding.ASCII.GetString(release_date2)).AppendLine(); + IPBinInformation.AppendFormat(Localization.Hardware_ID_0, Encoding.ASCII.GetString(ipbin.hardware_id)). + AppendLine(); + + IPBinInformation.AppendFormat(Localization.Developer_code_0, Encoding.ASCII.GetString(ipbin.developer_code)). + AppendLine(); + + IPBinInformation.AppendFormat(Localization.Domestic_title_0, Encoding.ASCII.GetString(ipbin.domestic_title)). + AppendLine(); + + IPBinInformation.AppendFormat(Localization.Overseas_title_0, Encoding.ASCII.GetString(ipbin.overseas_title)). + AppendLine(); + + IPBinInformation.AppendFormat(Localization.Product_code_0, Encoding.ASCII.GetString(ipbin.product_code)). + AppendLine(); + + IPBinInformation.AppendFormat(Localization.Peripherals).AppendLine(); + + foreach(byte peripheral in ipbin.peripherals) + { + switch((char)peripheral) + { + case 'A': + IPBinInformation.AppendLine(Localization.Game_supports_analog_controller); + + break; + case 'B': + IPBinInformation.AppendLine(Localization.Game_supports_trackball); + + break; + case 'G': + IPBinInformation.AppendLine(Localization.Game_supports_light_gun); + + break; + case 'J': + IPBinInformation.AppendLine(Localization.Game_supports_JoyPad); + + break; + case 'K': + IPBinInformation.AppendLine(Localization.Game_supports_keyboard); + + break; + case 'M': + IPBinInformation.AppendLine(Localization.Game_supports_mouse); + + break; + case 'O': + IPBinInformation.AppendLine(Localization.Game_supports_Master_System_JoyPad); + + break; + case 'P': + IPBinInformation.AppendLine(Localization.Game_supports_printer_interface); + + break; + case 'R': + IPBinInformation.AppendLine(Localization.Game_supports_serial_RS_232C_interface); + + break; + case 'T': + IPBinInformation.AppendLine(Localization.Game_supports_tablet_interface); + + break; + case 'V': + IPBinInformation.AppendLine(Localization.Game_supports_paddle_controller); + + break; + case ' ': + break; + default: + IPBinInformation.AppendFormat(Localization.Game_supports_unknown_peripheral_0, peripheral). + AppendLine(); + + break; + } + } + + IPBinInformation.AppendLine(Localization.Regions_supported); + + foreach(byte region in ipbin.region_codes) + { + switch((char)region) + { + case 'J': + IPBinInformation.AppendLine(Localization.Japanese_NTSC); + + break; + case 'U': + IPBinInformation.AppendLine(Localization.USA_NTSC); + + break; + case 'E': + IPBinInformation.AppendLine(Localization.Europe_PAL); + + break; + case ' ': + break; + default: + IPBinInformation.AppendFormat(Localization.Game_supports_unknown_region_0, region).AppendLine(); + + break; + } + } + + return IPBinInformation.ToString(); + } + +#region Nested type: IPBin + + // TODO: Check if it is big or little endian + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct IPBin + { + /// Must be "SEGADISCSYSTEM " or "SEGADATADISC " or "SEGAOS " + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] SegaHardwareID; + /// 0x010, Varies + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)] + public byte[] volume_name; + /// 0x01B, 0x00 + public byte spare_space1; + /// 0x01C, Volume version in BCD. <100 = Prerelease. + public ushort volume_version; + /// 0x01E, Bit 0 = 1 => CD-ROM. Rest should be 0. + public ushort volume_type; + /// 0x020, Unknown, varies! + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)] + public byte[] system_name; + /// 0x02B, 0x00 + public byte spare_space2; + /// 0x02C, Should be 1 + public ushort system_version; + /// 0x02E, 0x0000 + public ushort spare_space3; + /// 0x030, Initial program address + public uint ip_address; + /// 0x034, Load size of initial program + public uint ip_loadsize; + /// 0x038, Initial program entry address + public uint ip_entry_address; + /// 0x03C, Initial program work RAM size in bytes + public uint ip_work_ram_size; + /// 0x040, System program address + public uint sp_address; + /// 0x044, Load size of system program + public uint sp_loadsize; + /// 0x048, System program entry address + public uint sp_entry_address; + /// 0x04C, System program work RAM size in bytes + public uint sp_work_ram_size; + /// 0x050, MMDDYYYY + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] + public byte[] release_date; + /// 0x058, Seems to be all 0x20s + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)] + public byte[] unknown1; + /// 0x05F, 0x00 ? + public byte spare_space4; + /// 0x060, System Reserved Area + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 160)] + public byte[] system_reserved; + /// 0x100, Hardware ID + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] hardware_id; + /// 0x113 or 0x110, "SEGA" or "T-xx" + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] + public byte[] developer_code; + /// 0x118, Another release date, this with month in letters? + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] + public byte[] release_date2; + /// 0x120, Domestic version of the game title + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 48)] + public byte[] domestic_title; + /// 0x150, Overseas version of the game title + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 48)] + public byte[] overseas_title; + /// 0x180, Official product code + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 13)] + public byte[] product_code; + /// 0x190, Supported peripherals, see above + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] peripherals; + /// 0x1A0, 0x20 + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] spare_space6; + /// 0x1B0, Inside here should be modem information, but I need to get a modem-enabled game + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)] + public byte[] spare_space7; + /// 0x1F0, Region codes, space-filled + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] region_codes; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/Sega/Dreamcast.cs b/Aaru.Decoders/Sega/Dreamcast.cs new file mode 100644 index 000000000..2ae6abd94 --- /dev/null +++ b/Aaru.Decoders/Sega/Dreamcast.cs @@ -0,0 +1,332 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : Dreamcast.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes Sega Dreamcast IP.BIN. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Globalization; +using System.Runtime.InteropServices; +using System.Text; +using Aaru.Console; +using Marshal = Aaru.Helpers.Marshal; + +namespace Aaru.Decoders.Sega; + +/// Represents the IP.BIN from a SEGA Dreamcast +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static class Dreamcast +{ + const string MODULE_NAME = "Dreamcast IP.BIN Decoder"; + + /// Decodes an IP.BIN sector in Dreamcast format + /// IP.BIN sector + /// Decoded IP.BIN + public static IPBin? DecodeIPBin(byte[] ipbin_sector) + { + if(ipbin_sector == null) + return null; + + if(ipbin_sector.Length < 512) + return null; + + IPBin ipbin = Marshal.ByteArrayToStructureLittleEndian(ipbin_sector); + + AaruConsole.DebugWriteLine(MODULE_NAME, "dreamcast_ipbin.maker_id = \"{0}\"", + Encoding.ASCII.GetString(ipbin.maker_id)); + + AaruConsole.DebugWriteLine(MODULE_NAME, "dreamcast_ipbin.spare_space1 = \"{0}\"", (char)ipbin.spare_space1); + + AaruConsole.DebugWriteLine(MODULE_NAME, "dreamcast_ipbin.dreamcast_media = \"{0}\"", + Encoding.ASCII.GetString(ipbin.dreamcast_media)); + + AaruConsole.DebugWriteLine(MODULE_NAME, "dreamcast_ipbin.disc_no = {0}", (char)ipbin.disc_no); + + AaruConsole.DebugWriteLine(MODULE_NAME, "dreamcast_ipbin.disc_no_separator = \"{0}\"", + (char)ipbin.disc_no_separator); + + AaruConsole.DebugWriteLine(MODULE_NAME, "dreamcast_ipbin.disc_total_nos = \"{0}\"", (char)ipbin.disc_total_nos); + + AaruConsole.DebugWriteLine(MODULE_NAME, "dreamcast_ipbin.spare_space2 = \"{0}\"", + Encoding.ASCII.GetString(ipbin.spare_space2)); + + AaruConsole.DebugWriteLine(MODULE_NAME, "dreamcast_ipbin.region_codes = \"{0}\"", + Encoding.ASCII.GetString(ipbin.region_codes)); + + AaruConsole.DebugWriteLine(MODULE_NAME, "dreamcast_ipbin.peripherals = \"{0}\"", + Encoding.ASCII.GetString(ipbin.peripherals)); + + AaruConsole.DebugWriteLine(MODULE_NAME, "dreamcast_ipbin.product_no = \"{0}\"", + Encoding.ASCII.GetString(ipbin.product_no)); + + AaruConsole.DebugWriteLine(MODULE_NAME, "dreamcast_ipbin.product_version = \"{0}\"", + Encoding.ASCII.GetString(ipbin.product_version)); + + AaruConsole.DebugWriteLine(MODULE_NAME, "dreamcast_ipbin.release_date = \"{0}\"", + Encoding.ASCII.GetString(ipbin.release_date)); + + AaruConsole.DebugWriteLine(MODULE_NAME, "dreamcast_ipbin.spare_space3 = \"{0}\"", (char)ipbin.spare_space3); + + AaruConsole.DebugWriteLine(MODULE_NAME, "dreamcast_ipbin.boot_filename = \"{0}\"", + Encoding.ASCII.GetString(ipbin.boot_filename)); + + AaruConsole.DebugWriteLine(MODULE_NAME, "dreamcast_ipbin.producer = \"{0}\"", + Encoding.ASCII.GetString(ipbin.producer)); + + AaruConsole.DebugWriteLine(MODULE_NAME, "dreamcast_ipbin.product_name = \"{0}\"", + Encoding.ASCII.GetString(ipbin.product_name)); + + return Encoding.ASCII.GetString(ipbin.SegaHardwareID) == "SEGA SEGAKATANA " ? ipbin : null; + } + + /// Pretty prints a decoded IP.BIN in Dreamcast format + /// Decoded IP.BIN + /// Description of the IP.BIN contents + public static string Prettify(IPBin? decoded) + { + if(decoded == null) + return null; + + IPBin ipbin = decoded.Value; + + var IPBinInformation = new StringBuilder(); + + IPBinInformation.AppendLine("--------------------------------"); + IPBinInformation.AppendLine(Localization.SEGA_IP_BIN_INFORMATION); + IPBinInformation.AppendLine("--------------------------------"); + + // Decoding all data + CultureInfo provider = CultureInfo.InvariantCulture; + var ipbindate = DateTime.ParseExact(Encoding.ASCII.GetString(ipbin.release_date), "yyyyMMdd", provider); + + IPBinInformation.AppendFormat(Localization.Product_name_0, Encoding.ASCII.GetString(ipbin.product_name)). + AppendLine(); + + IPBinInformation.AppendFormat(Localization.Product_version_0, Encoding.ASCII.GetString(ipbin.product_version)). + AppendLine(); + + IPBinInformation.AppendFormat(Localization.Product_CRC_0, ipbin.dreamcast_crc).AppendLine(); + IPBinInformation.AppendFormat(Localization.Producer_0, Encoding.ASCII.GetString(ipbin.producer)).AppendLine(); + + IPBinInformation.AppendFormat(Localization.Disc_media_0, Encoding.ASCII.GetString(ipbin.dreamcast_media)). + AppendLine(); + + IPBinInformation.AppendFormat(Localization.Disc_number_0_of_1, (char)ipbin.disc_no, (char)ipbin.disc_total_nos). + AppendLine(); + + IPBinInformation.AppendFormat(Localization.Release_date_0, ipbindate).AppendLine(); + + switch(Encoding.ASCII.GetString(ipbin.boot_filename)) + { + case "1ST_READ.BIN": + IPBinInformation.AppendLine(Localization.Disc_boots_natively); + + break; + case "0WINCE.BIN ": + IPBinInformation.AppendLine(Localization.Disc_boots_using_Windows_CE); + + break; + default: + IPBinInformation.AppendFormat(Localization.Disc_boots_using_unknown_loader_0, + Encoding.ASCII.GetString(ipbin.boot_filename)). + AppendLine(); + + break; + } + + IPBinInformation.AppendLine(Localization.Regions_supported); + + foreach(byte region in ipbin.region_codes) + { + switch((char)region) + { + case 'J': + IPBinInformation.AppendLine(Localization.Japanese_NTSC); + + break; + case 'U': + IPBinInformation.AppendLine(Localization.North_America_NTSC); + + break; + case 'E': + IPBinInformation.AppendLine(Localization.Europe_PAL); + + break; + case ' ': + break; + default: + IPBinInformation.AppendFormat(Localization.Game_supports_unknown_region_0, region).AppendLine(); + + break; + } + } + + var iPeripherals = int.Parse(Encoding.ASCII.GetString(ipbin.peripherals), NumberStyles.HexNumber); + + if((iPeripherals & 0x00000001) == 0x00000001) + IPBinInformation.AppendLine(Localization.Game_uses_Windows_CE); + + IPBinInformation.AppendFormat(Localization.Peripherals).AppendLine(); + + if((iPeripherals & 0x00000010) == 0x00000010) + IPBinInformation.AppendLine(Localization.Game_supports_the_VGA_Box); + + if((iPeripherals & 0x00000100) == 0x00000100) + IPBinInformation.AppendLine(Localization.Game_supports_other_expansion); + + if((iPeripherals & 0x00000200) == 0x00000200) + IPBinInformation.AppendLine(Localization.Game_supports_Puru_Puru_pack); + + if((iPeripherals & 0x00000400) == 0x00000400) + IPBinInformation.AppendLine(Localization.Game_supports_Mike_Device); + + if((iPeripherals & 0x00000800) == 0x00000800) + IPBinInformation.AppendLine(Localization.Game_supports_Memory_Card); + + if((iPeripherals & 0x00001000) == 0x00001000) + IPBinInformation.AppendLine(Localization.Game_requires_A_B_Start_buttons_and_D_Pad); + + if((iPeripherals & 0x00002000) == 0x00002000) + IPBinInformation.AppendLine(Localization.Game_requires_C_button); + + if((iPeripherals & 0x00004000) == 0x00004000) + IPBinInformation.AppendLine(Localization.Game_requires_D_button); + + if((iPeripherals & 0x00008000) == 0x00008000) + IPBinInformation.AppendLine(Localization.Game_requires_X_button); + + if((iPeripherals & 0x00010000) == 0x00010000) + IPBinInformation.AppendLine(Localization.Game_requires_Y_button); + + if((iPeripherals & 0x00020000) == 0x00020000) + IPBinInformation.AppendLine(Localization.Game_requires_Z_button); + + if((iPeripherals & 0x00040000) == 0x00040000) + IPBinInformation.AppendLine(Localization.Game_requires_expanded_direction_buttons); + + if((iPeripherals & 0x00080000) == 0x00080000) + IPBinInformation.AppendLine(Localization.Game_requires_analog_R_trigger); + + if((iPeripherals & 0x00100000) == 0x00100000) + IPBinInformation.AppendLine(Localization.Game_requires_analog_L_trigger); + + if((iPeripherals & 0x00200000) == 0x00200000) + IPBinInformation.AppendLine(Localization.Game_requires_analog_horizontal_controller); + + if((iPeripherals & 0x00400000) == 0x00400000) + IPBinInformation.AppendLine(Localization.Game_requires_analog_vertical_controller); + + if((iPeripherals & 0x00800000) == 0x00800000) + IPBinInformation.AppendLine(Localization.Game_requires_expanded_analog_horizontal_controller); + + if((iPeripherals & 0x01000000) == 0x01000000) + IPBinInformation.AppendLine(Localization.Game_requires_expanded_analog_vertical_controller); + + if((iPeripherals & 0x02000000) == 0x02000000) + IPBinInformation.AppendLine(Localization.Game_supports_Gun); + + if((iPeripherals & 0x04000000) == 0x04000000) + IPBinInformation.AppendLine(Localization.Game_supports_keyboard); + + if((iPeripherals & 0x08000000) == 0x08000000) + IPBinInformation.AppendLine(Localization.Game_supports_mouse); + + if((iPeripherals & 0xEE) != 0) + IPBinInformation.AppendFormat(Localization.Game_supports_unknown_peripherals_mask_0, iPeripherals & 0xEE); + + return IPBinInformation.ToString(); + } + +#region Nested type: IPBin + + /// SEGA IP.BIN format for Dreamcast + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct IPBin + { + /// Must be "SEGA SEGAKATANA " + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] SegaHardwareID; + /// 0x010, "SEGA ENTERPRISES" + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] maker_id; + /// 0x020, CRC of product_no and product_version + public uint dreamcast_crc; + /// 0x024, " " + public byte spare_space1; + /// 0x025, "GD-ROM" + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] + public byte[] dreamcast_media; + /// 0x02B, Disc number + public byte disc_no; + /// 0x02C, '/' + public byte disc_no_separator; + /// 0x02D, Total number of discs + public byte disc_total_nos; + /// 0x02E, " " + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] + public byte[] spare_space2; + /// 0x030, Region codes, space-filled + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] + public byte[] region_codes; + /// 0x038, Supported peripherals, bitwise + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)] + public byte[] peripherals; + /// 0x03F, ' ' + public byte spare_space3; + /// 0x040, Product number + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] + public byte[] product_no; + /// 0x04A, Product version + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] + public byte[] product_version; + /// 0x050, YYYYMMDD + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] + public byte[] release_date; + /// 0x058, " " + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] + public byte[] spare_space4; + /// 0x060, Usually "1ST_READ.BIN" or "0WINCE.BIN " + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] + public byte[] boot_filename; + /// 0x06C, " " + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] + public byte[] spare_space5; + /// 0x070, Game producer, space-filled + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] producer; + /// 0x080, Game name, space-filled + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] + public byte[] product_name; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/Sega/Saturn.cs b/Aaru.Decoders/Sega/Saturn.cs new file mode 100644 index 000000000..31225effe --- /dev/null +++ b/Aaru.Decoders/Sega/Saturn.cs @@ -0,0 +1,255 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : Saturn.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes Sega Saturn IP.BIN. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Globalization; +using System.Runtime.InteropServices; +using System.Text; +using Aaru.Console; +using Marshal = Aaru.Helpers.Marshal; + +namespace Aaru.Decoders.Sega; + +/// Represents the IP.BIN from a SEGA Saturn +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +public static class Saturn +{ + const string MODULE_NAME = "Saturn IP.BIN Decoder"; + + /// Decodes an IP.BIN sector in Saturn format + /// IP.BIN sector + /// Decoded IP.BIN + public static IPBin? DecodeIPBin(byte[] ipbin_sector) + { + if(ipbin_sector == null) + return null; + + if(ipbin_sector.Length < 512) + return null; + + IPBin ipbin = Marshal.ByteArrayToStructureLittleEndian(ipbin_sector); + + AaruConsole.DebugWriteLine(MODULE_NAME, "saturn_ipbin.maker_id = \"{0}\"", + Encoding.ASCII.GetString(ipbin.maker_id)); + + AaruConsole.DebugWriteLine(MODULE_NAME, "saturn_ipbin.product_no = \"{0}\"", + Encoding.ASCII.GetString(ipbin.product_no)); + + AaruConsole.DebugWriteLine(MODULE_NAME, "saturn_ipbin.product_version = \"{0}\"", + Encoding.ASCII.GetString(ipbin.product_version)); + + AaruConsole.DebugWriteLine(MODULE_NAME, "saturn_ipbin.release_date = \"{0}\"", + Encoding.ASCII.GetString(ipbin.release_date)); + + AaruConsole.DebugWriteLine(MODULE_NAME, "saturn_ipbin.saturn_media = \"{0}\"", + Encoding.ASCII.GetString(ipbin.saturn_media)); + + AaruConsole.DebugWriteLine(MODULE_NAME, "saturn_ipbin.disc_no = {0}", (char)ipbin.disc_no); + + AaruConsole.DebugWriteLine(MODULE_NAME, "saturn_ipbin.disc_no_separator = \"{0}\"", + (char)ipbin.disc_no_separator); + + AaruConsole.DebugWriteLine(MODULE_NAME, "saturn_ipbin.disc_total_nos = {0}", (char)ipbin.disc_total_nos); + + AaruConsole.DebugWriteLine(MODULE_NAME, "saturn_ipbin.release_date = \"{0}\"", + Encoding.ASCII.GetString(ipbin.release_date)); + + AaruConsole.DebugWriteLine(MODULE_NAME, "saturn_ipbin.spare_space1 = \"{0}\"", + Encoding.ASCII.GetString(ipbin.spare_space1)); + + AaruConsole.DebugWriteLine(MODULE_NAME, "saturn_ipbin.region_codes = \"{0}\"", + Encoding.ASCII.GetString(ipbin.region_codes)); + + AaruConsole.DebugWriteLine(MODULE_NAME, "saturn_ipbin.peripherals = \"{0}\"", + Encoding.ASCII.GetString(ipbin.peripherals)); + + AaruConsole.DebugWriteLine(MODULE_NAME, "saturn_ipbin.product_name = \"{0}\"", + Encoding.ASCII.GetString(ipbin.product_name)); + + return Encoding.ASCII.GetString(ipbin.SegaHardwareID) == "SEGA SEGASATURN " ? ipbin : null; + } + + /// Pretty prints a decoded IP.BIN in Saturn format + /// Decoded IP.BIN + /// Description of the IP.BIN contents + public static string Prettify(IPBin? decoded) + { + if(decoded == null) + return null; + + IPBin ipbin = decoded.Value; + + var IPBinInformation = new StringBuilder(); + + IPBinInformation.AppendLine("--------------------------------"); + IPBinInformation.AppendLine(Localization.SEGA_IP_BIN_INFORMATION); + IPBinInformation.AppendLine("--------------------------------"); + + // Decoding all data + CultureInfo provider = CultureInfo.InvariantCulture; + var ipbindate = DateTime.ParseExact(Encoding.ASCII.GetString(ipbin.release_date), "yyyyMMdd", provider); + + IPBinInformation.AppendFormat(Localization.Product_name_0, Encoding.ASCII.GetString(ipbin.product_name)). + AppendLine(); + + IPBinInformation.Append($"Product number: {Encoding.ASCII.GetString(ipbin.product_no)}").AppendLine(); + + IPBinInformation.AppendFormat(Localization.Product_version_0, Encoding.ASCII.GetString(ipbin.product_version)). + AppendLine(); + + IPBinInformation.AppendFormat(Localization.Release_date_0, ipbindate).AppendLine(); + + IPBinInformation.AppendFormat(Localization.Disc_number_0_of_1, (char)ipbin.disc_no, (char)ipbin.disc_total_nos). + AppendLine(); + + IPBinInformation.AppendFormat(Localization.Peripherals).AppendLine(); + + foreach(byte peripheral in ipbin.peripherals) + { + switch((char)peripheral) + { + case 'A': + IPBinInformation.AppendLine(Localization.Game_supports_analog_controller); + + break; + case 'J': + IPBinInformation.AppendLine(Localization.Game_supports_JoyPad); + + break; + case 'K': + IPBinInformation.AppendLine(Localization.Game_supports_keyboard); + + break; + case 'M': + IPBinInformation.AppendLine(Localization.Game_supports_mouse); + + break; + case 'S': + IPBinInformation.AppendLine(Localization.Game_supports_analog_steering_controller); + + break; + case 'T': + IPBinInformation.AppendLine(Localization.Game_supports_multitap); + + break; + case ' ': + break; + default: + IPBinInformation.AppendFormat(Localization.Game_supports_unknown_peripheral_0, peripheral). + AppendLine(); + + break; + } + } + + IPBinInformation.AppendLine(Localization.Regions_supported); + + foreach(byte region in ipbin.region_codes) + { + switch((char)region) + { + case 'J': + IPBinInformation.AppendLine(Localization.Japanese_NTSC); + + break; + case 'U': + IPBinInformation.AppendLine(Localization.North_America_NTSC); + + break; + case 'E': + IPBinInformation.AppendLine(Localization.Europe_PAL); + + break; + case 'T': + IPBinInformation.AppendLine(Localization.Asia_NTSC); + + break; + case ' ': + break; + default: + IPBinInformation.AppendFormat(Localization.Game_supports_unknown_region_0, region).AppendLine(); + + break; + } + } + + return IPBinInformation.ToString(); + } + +#region Nested type: IPBin + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct IPBin + { + /// Must be "SEGA SEGASATURN " + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] SegaHardwareID; + /// 0x010, "SEGA ENTERPRISES" + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] maker_id; + /// 0x020, Product number + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] + public byte[] product_no; + /// 0x02A, Product version + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] + public byte[] product_version; + /// 0x030, YYYYMMDD + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] + public byte[] release_date; + /// 0x038, "CD-" + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] saturn_media; + /// 0x03B, Disc number + public byte disc_no; + /// // 0x03C, '/' + public byte disc_no_separator; + /// // 0x03D, Total number of discs + public byte disc_total_nos; + /// 0x03E, " " + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] + public byte[] spare_space1; + /// 0x040, Region codes, space-filled + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] region_codes; + /// 0x050, Supported peripherals, see above + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] peripherals; + /// 0x060, Game name, space-filled + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 112)] + public byte[] product_name; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/Xbox/DMI.cs b/Aaru.Decoders/Xbox/DMI.cs new file mode 100644 index 000000000..262fa13dd --- /dev/null +++ b/Aaru.Decoders/Xbox/DMI.cs @@ -0,0 +1,293 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : DMI.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes Xbox discs DMI structure. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Text; +using Aaru.Helpers; + +namespace Aaru.Decoders.Xbox; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +public static class DMI +{ + public static bool IsXbox(byte[] dmi) + { + if(dmi?.Length != 2052) + return false; + + // Version is 1 + if(BitConverter.ToUInt32(dmi, 4) != 1) + return false; + + // Catalogue number is two letters, five numbers, one letter + for(var i = 12; i < 14; i++) + { + if(dmi[i] < 0x41 || dmi[i] > 0x5A) + return false; + } + + for(var i = 14; i < 19; i++) + { + if(dmi[i] < 0x30 || dmi[i] > 0x39) + return false; + } + + if(dmi[19] < 0x41 || dmi[19] > 0x5A) + return false; + + var timestamp = BitConverter.ToInt64(dmi, 20); + + // Game cannot exist before the Xbox + return timestamp >= 0x1BD164833DFC000; + } + + public static bool IsXbox360(byte[] dmi) + { + if(dmi?.Length != 2052) + return false; + + var signature = BitConverter.ToUInt32(dmi, 0x7EC); + + // "XBOX" swapped as .NET is little endian + return signature == 0x584F4258; + } + + public static XboxDMI? DecodeXbox(byte[] response) + { + bool isXbox = IsXbox(response); + + if(!isXbox) + return null; + + var dmi = new XboxDMI + { + DataLength = (ushort)((response[0] << 8) + response[1]), + Reserved1 = response[2], + Reserved2 = response[3], + Version = BitConverter.ToUInt32(response, 4), + Timestamp = BitConverter.ToInt64(response, 20) + }; + + var tmp = new byte[8]; + Array.Copy(response, 12, tmp, 0, 8); + dmi.CatalogNumber = StringHandlers.CToString(tmp); + + return dmi; + } + + public static Xbox360DMI? DecodeXbox360(byte[] response) + { + bool isX360 = IsXbox360(response); + + if(!isX360) + return null; + + var dmi = new Xbox360DMI + { + DataLength = (ushort)((response[0] << 8) + response[1]), + Reserved1 = response[2], + Reserved2 = response[3], + Version = BitConverter.ToUInt32(response, 4), + Timestamp = BitConverter.ToInt64(response, 20), + MediaID = new byte[16] + }; + + Array.Copy(response, 36, dmi.MediaID, 0, 16); + var tmp = new byte[16]; + Array.Copy(response, 68, tmp, 0, 16); + dmi.CatalogNumber = StringHandlers.CToString(tmp); + + return dmi.CatalogNumber == null || dmi.CatalogNumber.Length < 13 ? null : dmi; + } + + public static string PrettifyXbox(XboxDMI? dmi) + { + if(dmi == null) + return null; + + XboxDMI decoded = dmi.Value; + var sb = new StringBuilder(); + + sb.Append(Localization.Catalogue_number); + + for(var i = 0; i < 2; i++) + sb.Append($"{decoded.CatalogNumber[i]}"); + + sb.Append("-"); + + for(var i = 2; i < 7; i++) + sb.Append($"{decoded.CatalogNumber[i]}"); + + sb.Append("-"); + sb.Append($"{decoded.CatalogNumber[7]}"); + sb.AppendLine(); + + sb.AppendFormat(Localization.Timestamp_0, DateTime.FromFileTimeUtc(decoded.Timestamp)).AppendLine(); + + return sb.ToString(); + } + + public static string PrettifyXbox360(Xbox360DMI? dmi) + { + if(dmi == null) + return null; + + Xbox360DMI decoded = dmi.Value; + var sb = new StringBuilder(); + + sb.Append(Localization.Catalogue_number); + + for(var i = 0; i < 2; i++) + sb.Append($"{decoded.CatalogNumber[i]}"); + + sb.Append("-"); + + for(var i = 2; i < 6; i++) + sb.Append($"{decoded.CatalogNumber[i]}"); + + sb.Append("-"); + + for(var i = 6; i < 8; i++) + sb.Append($"{decoded.CatalogNumber[i]}"); + + sb.Append("-"); + + switch(decoded.CatalogNumber.Length) + { + case 13: + for(var i = 8; i < 10; i++) + sb.Append($"{decoded.CatalogNumber[i]}"); + + sb.Append("-"); + + for(var i = 10; i < 13; i++) + sb.Append($"{decoded.CatalogNumber[i]}"); + + break; + case 14: + for(var i = 8; i < 11; i++) + sb.Append($"{decoded.CatalogNumber[i]}"); + + sb.Append("-"); + + for(var i = 11; i < 14; i++) + sb.Append($"{decoded.CatalogNumber[i]}"); + + break; + default: + for(var i = 8; i < decoded.CatalogNumber.Length - 3; i++) + sb.Append($"{decoded.CatalogNumber[i]}"); + + sb.Append("-"); + + for(int i = decoded.CatalogNumber.Length - 3; i < decoded.CatalogNumber.Length; i++) + sb.Append($"{decoded.CatalogNumber[i]}"); + + break; + } + + sb.AppendLine(); + + sb.Append(Localization.Media_ID); + + for(var i = 0; i < 12; i++) + sb.Append($"{decoded.MediaID[i]:X2}"); + + sb.Append("-"); + + for(var i = 12; i < 16; i++) + sb.Append($"{decoded.MediaID[i]:X2}"); + + sb.AppendLine(); + + sb.AppendFormat(Localization.Timestamp_0, DateTime.FromFileTimeUtc(decoded.Timestamp)).AppendLine(); + + return sb.ToString(); + } + + public static string PrettifyXbox(byte[] response) => PrettifyXbox(DecodeXbox(response)); + + public static string PrettifyXbox360(byte[] response) => PrettifyXbox360(DecodeXbox360(response)); + +#region Nested type: Xbox360DMI + + public struct Xbox360DMI + { + /// Bytes 0 to 1 Data length + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + + /// Bytes 4 to 7 0x02 in XGD2 and XGD3 + public uint Version; + + /// Bytes 20 to 27 DMI timestamp + public long Timestamp; + + /// Bytes 36 to 51 Media ID in hex XXXXXXXXXXXX-XXXXXXXX + public byte[] MediaID; + + /// Bytes 68 to 83 Catalogue number in XX-XXXX-XX-XXY-XXX, Y not always exists + public string CatalogNumber; + } + +#endregion + +#region Nested type: XboxDMI + + public struct XboxDMI + { + /// Bytes 0 to 1 Data length + public ushort DataLength; + /// Byte 2 Reserved + public byte Reserved1; + /// Byte 3 Reserved + public byte Reserved2; + + /// Bytes 4 to 7 0x01 in XGD + public uint Version; + + /// Bytes 12 to 16 Catalogue number in XX-XXXXX-X + public string CatalogNumber; + + /// Bytes 20 to 27 DMI timestamp + public long Timestamp; + } + +#endregion +} \ No newline at end of file diff --git a/Aaru.Decoders/Xbox/SS.cs b/Aaru.Decoders/Xbox/SS.cs new file mode 100644 index 000000000..539e78448 --- /dev/null +++ b/Aaru.Decoders/Xbox/SS.cs @@ -0,0 +1,431 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : SS.cs +// Author(s) : Natalia Portillo +// +// Component : Device structures decoders. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes Xbox security sectors +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2023 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Text; +using Aaru.Decoders.DVD; + +namespace Aaru.Decoders.Xbox; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBeInternal")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +[SuppressMessage("ReSharper", "NotAccessedField.Global")] +public static class SS +{ + public static SecuritySector? Decode(byte[] response) + { + if(response == null) + return null; + + if(response.Length < 2048) + return null; + + var ss = new SecuritySector + { + DiskCategory = (DiskCategory)((response[0] & 0xF0) >> 4), + PartVersion = (byte)(response[0] & 0x0F), + DiscSize = (DVDSize)((response[1] & 0xF0) >> 4), + MaximumRate = (MaximumRateField)(response[1] & 0x0F), + Reserved3 = (response[2] & 0x80) == 0x80, + Layers = (byte)((response[2] & 0x60) >> 5), + TrackPath = (response[2] & 0x08) == 0x08, + LayerType = (LayerTypeFieldMask)(response[2] & 0x07), + LinearDensity = (LinearDensityField)((response[3] & 0xF0) >> 4), + TrackDensity = (TrackDensityField)(response[3] & 0x0F), + DataAreaStartPSN = (uint)((response[4] << 24) + (response[5] << 16) + (response[6] << 8) + response[7]), + DataAreaEndPSN = (uint)((response[8] << 24) + (response[9] << 16) + (response[10] << 8) + response[11]), + Layer0EndPSN = (uint)((response[12] << 24) + (response[13] << 16) + (response[14] << 8) + response[15]), + Unknown1 = response[27], + Unknown2 = new byte[28], + Unknown3 = new byte[436], + Unknown4 = new byte[4], + Unknown5 = new byte[43], + ChallengeTableVersion = response[768], + NoChallengeEntries = response[769], + ChallengeEntries = new ChallengeEntry[23], + Unknown6 = response[1023], + Unknown7 = new byte[48], + Unknown8 = new byte[16], + Unknown9 = new byte[16], + Unknown10 = new byte[303], + Unknown11 = new byte[104], + Extents = new SecuritySectorExtent[23], + ExtentsCopy = new SecuritySectorExtent[23] + }; + + Array.Copy(response, 256, ss.Unknown2, 0, 28); + Array.Copy(response, 284, ss.Unknown3, 0, 436); + Array.Copy(response, 720, ss.Unknown4, 0, 4); + Array.Copy(response, 724, ss.Unknown5, 0, 43); + + for(var i = 0; i < 23; i++) + { + ss.ChallengeEntries[i] = new ChallengeEntry + { + Level = response[770 + i * 11 + 0], + ChallengeId = response[770 + i * 11 + 1], + ChallengeValue = (uint)((response[770 + i * 11 + 2] << 24) + + (response[770 + i * 11 + 3] << 16) + + (response[770 + i * 11 + 4] << 8) + + response[770 + i * 11 + 5]), + ResponseModifier = response[770 + i * 11 + 6], + ResponseValue = (uint)((response[770 + i * 11 + 7] << 24) + + (response[770 + i * 11 + 8] << 16) + + (response[770 + i * 11 + 9] << 8) + + response[770 + i * 11 + 10]) + }; + } + + Array.Copy(response, 1052, ss.Unknown7, 0, 48); + Array.Copy(response, 1120, ss.Unknown8, 0, 16); + Array.Copy(response, 1180, ss.Unknown9, 0, 16); + Array.Copy(response, 1208, ss.Unknown10, 0, 303); + Array.Copy(response, 1528, ss.Unknown11, 0, 104); + + for(var i = 0; i < 23; i++) + { + ss.Extents[i] = new SecuritySectorExtent + { + Unknown = (uint)((response[1633 + i * 9 + 0] << 16) + + (response[1633 + i * 9 + 1] << 8) + + response[1633 + i * 9 + 2]), + StartPSN = (uint)((response[1633 + i * 9 + 3] << 16) + + (response[1633 + i * 9 + 4] << 8) + + response[1633 + i * 9 + 5]), + EndPSN = (uint)((response[1633 + i * 9 + 6] << 16) + + (response[1633 + i * 9 + 7] << 8) + + response[1633 + i * 9 + 8]) + }; + } + + for(var i = 0; i < 23; i++) + { + ss.ExtentsCopy[i] = new SecuritySectorExtent + { + Unknown = (uint)((response[1840 + i * 9 + 0] << 16) + + (response[1840 + i * 9 + 1] << 8) + + response[1840 + i * 9 + 2]), + StartPSN = (uint)((response[1840 + i * 9 + 3] << 16) + + (response[1840 + i * 9 + 4] << 8) + + response[1840 + i * 9 + 5]), + EndPSN = (uint)((response[1840 + i * 9 + 6] << 16) + + (response[1840 + i * 9 + 7] << 8) + + response[1840 + i * 9 + 8]) + }; + } + + return ss; + } + + public static string Prettify(SecuritySector? ss) + { + if(ss == null) + return null; + + SecuritySector decoded = ss.Value; + var sb = new StringBuilder(); + + string sizeString = decoded.DiscSize switch + { + DVDSize.Eighty => Localization._80mm, + DVDSize.OneTwenty => Localization._120mm, + _ => string.Format(Localization.unknown_size_identifier_0, decoded.DiscSize) + }; + + string categorySentence = Localization.Disc_is_a_0_1_version_2; + + switch(decoded.DiskCategory) + { + case DiskCategory.DVDPRWDL: + sb.AppendFormat(categorySentence, sizeString, Localization.Xbox_Game_Disc, decoded.PartVersion). + AppendLine(); + + break; + case DiskCategory.DVDPRDL: + sb.AppendFormat(categorySentence, sizeString, Localization.Xbox_360_Game_Disc, decoded.PartVersion). + AppendLine(); + + break; + default: + sb.AppendFormat(categorySentence, sizeString, Localization.unknown_disc_type, decoded.PartVersion). + AppendLine(); + + break; + } + + switch(decoded.MaximumRate) + { + case MaximumRateField.TwoMbps: + sb.AppendLine(Localization.Disc_maximum_transfer_rate_is_2_52_Mbit_sec); + + break; + case MaximumRateField.FiveMbps: + sb.AppendLine(Localization.Disc_maximum_transfer_rate_is_5_04_Mbit_sec); + + break; + case MaximumRateField.TenMbps: + sb.AppendLine(Localization.Disc_maximum_transfer_rate_is_10_08_Mbit_sec); + + break; + case MaximumRateField.TwentyMbps: + sb.AppendLine(Localization.Disc_maximum_transfer_rate_is_20_16_Mbit_sec); + + break; + case MaximumRateField.ThirtyMbps: + sb.AppendLine(Localization.Disc_maximum_transfer_rate_is_30_24_Mbit_sec); + + break; + case MaximumRateField.Unspecified: + sb.AppendLine(Localization.Disc_maximum_transfer_rate_is_unspecified); + + break; + default: + sb.AppendFormat(Localization.Disc_maximum_transfer_rate_is_specified_by_unknown_key_0, + decoded.MaximumRate). + AppendLine(); + + break; + } + + sb.AppendFormat(Localization.Disc_has_0_layers, decoded.Layers + 1).AppendLine(); + + switch(decoded.TrackPath) + { + case true when decoded.Layers == 1: + sb.AppendLine(Localization.Layers_are_in_parallel_track_path); + + break; + case false when decoded.Layers == 1: + sb.AppendLine(Localization.Layers_are_in_opposite_track_path); + + break; + } + + switch(decoded.LinearDensity) + { + case LinearDensityField.TwoSix: + sb.AppendLine(Localization.Pitch_size_is_0_267_μm_bit); + + break; + case LinearDensityField.TwoNine: + sb.AppendLine(Localization.Pitch_size_is_0_147_μm_bit); + + break; + case LinearDensityField.FourZero: + sb.AppendLine(Localization.Pitch_size_is_between_0_409_μm_bit_and_0_435_μm_bit); + + break; + case LinearDensityField.TwoEight: + sb.AppendLine(Localization.Pitch_size_is_between_0_140_μm_bit_and_0_148_μm_bit); + + break; + case LinearDensityField.OneFive: + sb.AppendLine(Localization.Pitch_size_is_0_153_μm_bit); + + break; + case LinearDensityField.OneThree: + sb.AppendLine(Localization.Pitch_size_is_between_0_130_μm_bit_and_0_140_μm_bit); + + break; + case LinearDensityField.ThreeFive: + sb.AppendLine(Localization.Pitch_size_is_0_353_μm_bit); + + break; + default: + sb.AppendFormat(Localization.Unknown_pitch_size_key_0, decoded.LinearDensity).AppendLine(); + + break; + } + + switch(decoded.TrackDensity) + { + case TrackDensityField.Seven: + sb.AppendLine(Localization.Track_size_is_0_74_μm); + + break; + case TrackDensityField.Eight: + sb.AppendLine(Localization.Track_size_is_0_80_μm); + + break; + case TrackDensityField.Six: + sb.AppendLine(Localization.Track_size_is_0_615_μm); + + break; + case TrackDensityField.Four: + sb.AppendLine(Localization.Track_size_is_0_40_μm); + + break; + case TrackDensityField.Three: + sb.AppendLine(Localization.Track_size_is_0_34_μm); + + break; + default: + sb.AppendFormat(Localization.Unknown_track_size_key__0_, decoded.LinearDensity).AppendLine(); + + break; + } + + if(decoded.DataAreaStartPSN > 0) + { + if(decoded.DataAreaEndPSN > 0) + { + sb.AppendFormat(Localization.Data_area_starts_at_PSN_0, decoded.DataAreaStartPSN).AppendLine(); + sb.AppendFormat(Localization.Data_area_ends_at_PSN_0, decoded.DataAreaEndPSN).AppendLine(); + + if(decoded is { Layers: 1, TrackPath: false }) + sb.AppendFormat(Localization.Layer_zero_ends_at_PSN_0, decoded.Layer0EndPSN).AppendLine(); + } + else + sb.AppendLine(Localization.Disc_is_empty); + } + else + sb.AppendLine(Localization.Disc_is_empty); + + sb.AppendLine("Challenges:"); + + foreach(ChallengeEntry entry in decoded.ChallengeEntries) + { + sb.AppendFormat("\t" + Localization.Challenge_ID_0, entry.ChallengeId).AppendLine(); + sb.AppendFormat("\t" + Localization.Challenge_level_0, entry.Level).AppendLine(); + sb.AppendFormat("\t" + Localization.Challenge_value_0, entry.ChallengeValue).AppendLine(); + sb.AppendFormat("\t" + Localization.Response_modifier_0, entry.ResponseModifier).AppendLine(); + sb.AppendFormat("\t" + Localization.Response_value_0, entry.ResponseValue).AppendLine(); + } + + for(var i = 0; i < 16; i++) + { + sb.AppendFormat(Localization.Extent_starts_at_PSN_0_and_ends_at_PSN_1, decoded.Extents[i].StartPSN, + decoded.Extents[i].EndPSN). + AppendLine(); + } + + return sb.ToString(); + } + + public static string Prettify(byte[] response) => Prettify(Decode(response)); + +#region Nested type: ChallengeEntry + + public struct ChallengeEntry + { + public byte Level; + public byte ChallengeId; + public uint ChallengeValue; + public byte ResponseModifier; + public uint ResponseValue; + } + +#endregion + +#region Nested type: SecuritySector + + public struct SecuritySector + { + /// Byte 0, bits 7 to 4 Disk category field + public DiskCategory DiskCategory; + /// Byte 0, bits 3 to 0 Media version + public byte PartVersion; + /// Byte 1, bits 7 to 4 120mm if 0, 80mm if 1. If UMD (60mm) 0 also. Reserved rest of values + public DVDSize DiscSize; + /// Byte 1, bits 3 to 0 Maximum data rate + public MaximumRateField MaximumRate; + /// Byte 2, bit 7 Reserved + public bool Reserved3; + /// Byte 2, bits 6 to 5 Number of layers + public byte Layers; + /// Byte 2, bit 4 Track path + public bool TrackPath; + /// Byte 2, bits 3 to 0 Layer type + public LayerTypeFieldMask LayerType; + /// Byte 3, bits 7 to 4 Linear density field + public LinearDensityField LinearDensity; + /// Byte 3, bits 3 to 0 Track density field + public TrackDensityField TrackDensity; + /// Bytes 4 to 7 PSN where Data Area starts + public uint DataAreaStartPSN; + /// Bytes 8 to 11 PSN where Data Area ends + public uint DataAreaEndPSN; + /// Bytes 12 to 15 PSN where Data Area ends in Layer 0 + public uint Layer0EndPSN; + + /// Byte 27 Always 0x06 on XGD3 + public byte Unknown1; + /// Bytes 256 to 283 Unknown, XGD2 and XGD3 + public byte[] Unknown2; + /// Bytes 284 to 719 Unknown, XGD3 + public byte[] Unknown3; + /// Bytes 720 to 723 Unknown + public byte[] Unknown4; + /// Bytes 724 to 767 Unknown, XGD3 + public byte[] Unknown5; + /// Byte 768 Version of challenge table + public byte ChallengeTableVersion; + /// Byte 769 Number of challenge entries + public byte NoChallengeEntries; + /// Bytes 770 to 1022 Unknown + public ChallengeEntry[] ChallengeEntries; + /// Byte 1023 Unknown + public byte Unknown6; + /// Bytes 1052 to 1099 Unknown, XGD1 only + public byte[] Unknown7; + /// Bytes 1120 to 1135 Unknown, XGD2 and XGD3 + public byte[] Unknown8; + /// Bytes 1180 to 1195 Unknown + public byte[] Unknown9; + /// Bytes 1208 to 1511 Unknown + public byte[] Unknown10; + /// Bytes 1528 to 1632 + public byte[] Unknown11; + /// Bytes 1633 to 1839 Security extents, 23 entries of 9 bytes + public SecuritySectorExtent[] Extents; + /// Bytes 1840 to 2047 Copy of the security extents, 23 entries of 9 bytes + public SecuritySectorExtent[] ExtentsCopy; + } + +#endregion + +#region Nested type: SecuritySectorExtent + + public struct SecuritySectorExtent + { + /// Bytes 0 to 2 Unknown + public uint Unknown; + /// Bytes 3 to 5 Start PSN of this security extent + public uint StartPSN; + /// Bytes 6 to 8 End PSN of this security extent + public uint EndPSN; + } + +#endregion +} \ No newline at end of file