mirror of
https://github.com/acidicoala/SmokeAPI.git
synced 2025-12-05 21:15:39 -05:00
Added steamworks sdk v1.62,
This commit is contained in:
13
.clang-format
Normal file
13
.clang-format
Normal file
@@ -0,0 +1,13 @@
|
||||
---
|
||||
Language: Cpp
|
||||
BasedOnStyle: LLVM
|
||||
Standard: c++20
|
||||
BreakBeforeBraces: Attach
|
||||
LineEnding: LF
|
||||
ColumnLimit: 100
|
||||
AlignAfterOpenBracket: BlockIndent
|
||||
IndentWidth: 4
|
||||
ContinuationIndentWidth: 4
|
||||
NamespaceIndentation: All
|
||||
UseTab: Never
|
||||
PointerAlignment: Left
|
||||
522
.editorconfig
522
.editorconfig
@@ -1,522 +0,0 @@
|
||||
[*]
|
||||
charset = utf-8
|
||||
end_of_line = crlf
|
||||
indent_size = 4
|
||||
indent_style = space
|
||||
insert_final_newline = true
|
||||
max_line_length = 120
|
||||
tab_width = 4
|
||||
ij_continuation_indent_size = 8
|
||||
ij_formatter_off_tag = @formatter:off
|
||||
ij_formatter_on_tag = @formatter:on
|
||||
ij_formatter_tags_enabled = false
|
||||
ij_smart_tabs = false
|
||||
ij_visual_guides = none
|
||||
ij_wrap_on_typing = false
|
||||
|
||||
[.editorconfig]
|
||||
ij_editorconfig_align_group_field_declarations = false
|
||||
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
|
||||
|
||||
[{*.ant,*.fxml,*.icls,*.jhm,*.jnlp,*.jrxml,*.rng,*.tld,*.wsdl,*.xml,*.xsd,*.xsl,*.xslt,*.xul}]
|
||||
ij_xml_align_attributes = true
|
||||
ij_xml_align_text = false
|
||||
ij_xml_attribute_wrap = normal
|
||||
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
|
||||
|
||||
[{*.apinotes,*.yaml,*.yml,.clang-format,.clang-tidy,_clang-format}]
|
||||
indent_size = 2
|
||||
ij_yaml_align_values_properties = do_not_align
|
||||
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
|
||||
|
||||
[{*.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 = false
|
||||
ij_shell_use_unix_line_separator = true
|
||||
|
||||
[{*.c,*.c++,*.cc,*.cp,*.cpp,*.cu,*.cuh,*.cxx,*.h,*.h++,*.hh,*.hp,*.hpp,*.hxx,*.i,*.icc,*.ii,*.inl,*.ino,*.ipp,*.m,*.mm,*.pch,*.tcc,*.tpp,version.gen.rc}]
|
||||
ij_visual_guides = 100
|
||||
ij_c_add_brief_tag = false
|
||||
ij_c_add_getter_prefix = true
|
||||
ij_c_add_setter_prefix = true
|
||||
ij_c_align_dictionary_pair_values = false
|
||||
ij_c_align_group_field_declarations = false
|
||||
ij_c_align_init_list_in_columns = true
|
||||
ij_c_align_multiline_array_initializer_expression = false
|
||||
ij_c_align_multiline_assignment = true
|
||||
ij_c_align_multiline_binary_operation = true
|
||||
ij_c_align_multiline_chained_methods = false
|
||||
ij_c_align_multiline_for = true
|
||||
ij_c_align_multiline_ternary_operation = true
|
||||
ij_c_array_initializer_comma_on_next_line = false
|
||||
ij_c_array_initializer_new_line_after_left_brace = false
|
||||
ij_c_array_initializer_right_brace_on_new_line = false
|
||||
ij_c_array_initializer_wrap = normal
|
||||
ij_c_assignment_wrap = off
|
||||
ij_c_binary_operation_sign_on_next_line = false
|
||||
ij_c_binary_operation_wrap = normal
|
||||
ij_c_blank_lines_after_class_header = 0
|
||||
ij_c_blank_lines_after_imports = 0
|
||||
ij_c_blank_lines_around_class = 1
|
||||
ij_c_blank_lines_around_field = 0
|
||||
ij_c_blank_lines_around_field_in_interface = 0
|
||||
ij_c_blank_lines_around_method = 1
|
||||
ij_c_blank_lines_around_method_in_interface = 1
|
||||
ij_c_blank_lines_around_namespace = 0
|
||||
ij_c_blank_lines_around_properties_in_declaration = 0
|
||||
ij_c_blank_lines_around_properties_in_interface = 0
|
||||
ij_c_blank_lines_before_imports = 0
|
||||
ij_c_blank_lines_before_method_body = 0
|
||||
ij_c_block_brace_placement = end_of_line
|
||||
ij_c_block_brace_style = end_of_line
|
||||
ij_c_block_comment_at_first_column = true
|
||||
ij_c_catch_on_new_line = false
|
||||
ij_c_class_brace_style = end_of_line
|
||||
ij_c_class_constructor_init_list_align_multiline = true
|
||||
ij_c_class_constructor_init_list_comma_on_next_line = false
|
||||
ij_c_class_constructor_init_list_new_line_after_colon = never
|
||||
ij_c_class_constructor_init_list_new_line_before_colon = if_long
|
||||
ij_c_class_constructor_init_list_wrap = normal
|
||||
ij_c_copy_is_deep = false
|
||||
ij_c_create_interface_for_categories = true
|
||||
ij_c_declare_generated_methods = true
|
||||
ij_c_description_include_member_names = true
|
||||
ij_c_discharged_short_ternary_operator = false
|
||||
ij_c_do_not_add_breaks = false
|
||||
ij_c_do_while_brace_force = never
|
||||
ij_c_else_on_new_line = false
|
||||
ij_c_enum_constants_comma_on_next_line = false
|
||||
ij_c_enum_constants_wrap = on_every_item
|
||||
ij_c_for_brace_force = never
|
||||
ij_c_for_statement_new_line_after_left_paren = false
|
||||
ij_c_for_statement_right_paren_on_new_line = false
|
||||
ij_c_for_statement_wrap = off
|
||||
ij_c_function_brace_placement = end_of_line
|
||||
ij_c_function_call_arguments_align_multiline = true
|
||||
ij_c_function_call_arguments_align_multiline_pars = false
|
||||
ij_c_function_call_arguments_comma_on_next_line = false
|
||||
ij_c_function_call_arguments_new_line_after_lpar = false
|
||||
ij_c_function_call_arguments_new_line_before_rpar = false
|
||||
ij_c_function_call_arguments_wrap = normal
|
||||
ij_c_function_non_top_after_return_type_wrap = normal
|
||||
ij_c_function_parameters_align_multiline = true
|
||||
ij_c_function_parameters_align_multiline_pars = false
|
||||
ij_c_function_parameters_comma_on_next_line = false
|
||||
ij_c_function_parameters_new_line_after_lpar = false
|
||||
ij_c_function_parameters_new_line_before_rpar = false
|
||||
ij_c_function_parameters_wrap = normal
|
||||
ij_c_function_top_after_return_type_wrap = normal
|
||||
ij_c_generate_additional_eq_operators = true
|
||||
ij_c_generate_additional_rel_operators = true
|
||||
ij_c_generate_class_constructor = true
|
||||
ij_c_generate_comparison_operators_use_std_tie = false
|
||||
ij_c_generate_instance_variables_for_properties = ask
|
||||
ij_c_generate_operators_as_members = true
|
||||
ij_c_header_guard_style_pattern = ${PROJECT_NAME}_${FILE_NAME}_${EXT}
|
||||
ij_c_if_brace_force = never
|
||||
ij_c_in_line_short_ternary_operator = true
|
||||
ij_c_indent_block_comment = true
|
||||
ij_c_indent_c_struct_members = 4
|
||||
ij_c_indent_case_from_switch = true
|
||||
ij_c_indent_class_members = 4
|
||||
ij_c_indent_directive_as_code = false
|
||||
ij_c_indent_implementation_members = 0
|
||||
ij_c_indent_inside_code_block = 4
|
||||
ij_c_indent_interface_members = 0
|
||||
ij_c_indent_interface_members_except_ivars_block = false
|
||||
ij_c_indent_namespace_members = 4
|
||||
ij_c_indent_preprocessor_directive = 0
|
||||
ij_c_indent_visibility_keywords = 0
|
||||
ij_c_insert_override = true
|
||||
ij_c_insert_virtual_with_override = false
|
||||
ij_c_introduce_auto_vars = false
|
||||
ij_c_introduce_const_params = false
|
||||
ij_c_introduce_const_vars = false
|
||||
ij_c_introduce_generate_property = false
|
||||
ij_c_introduce_generate_synthesize = true
|
||||
ij_c_introduce_globals_to_header = true
|
||||
ij_c_introduce_prop_to_private_category = false
|
||||
ij_c_introduce_static_consts = true
|
||||
ij_c_introduce_use_ns_types = false
|
||||
ij_c_ivars_prefix = _
|
||||
ij_c_keep_blank_lines_before_end = 2
|
||||
ij_c_keep_blank_lines_before_right_brace = 2
|
||||
ij_c_keep_blank_lines_in_code = 2
|
||||
ij_c_keep_blank_lines_in_declarations = 2
|
||||
ij_c_keep_case_expressions_in_one_line = false
|
||||
ij_c_keep_control_statement_in_one_line = true
|
||||
ij_c_keep_directive_at_first_column = true
|
||||
ij_c_keep_first_column_comment = true
|
||||
ij_c_keep_line_breaks = true
|
||||
ij_c_keep_nested_namespaces_in_one_line = false
|
||||
ij_c_keep_simple_blocks_in_one_line = true
|
||||
ij_c_keep_simple_methods_in_one_line = true
|
||||
ij_c_keep_structures_in_one_line = false
|
||||
ij_c_lambda_capture_list_align_multiline = false
|
||||
ij_c_lambda_capture_list_align_multiline_bracket = false
|
||||
ij_c_lambda_capture_list_comma_on_next_line = false
|
||||
ij_c_lambda_capture_list_new_line_after_lbracket = false
|
||||
ij_c_lambda_capture_list_new_line_before_rbracket = false
|
||||
ij_c_lambda_capture_list_wrap = off
|
||||
ij_c_line_comment_add_space = false
|
||||
ij_c_line_comment_at_first_column = true
|
||||
ij_c_method_brace_placement = end_of_line
|
||||
ij_c_method_call_arguments_align_by_colons = true
|
||||
ij_c_method_call_arguments_align_multiline = false
|
||||
ij_c_method_call_arguments_special_dictionary_pairs_treatment = true
|
||||
ij_c_method_call_arguments_wrap = off
|
||||
ij_c_method_call_chain_wrap = off
|
||||
ij_c_method_parameters_align_by_colons = true
|
||||
ij_c_method_parameters_align_multiline = false
|
||||
ij_c_method_parameters_wrap = off
|
||||
ij_c_namespace_brace_placement = end_of_line
|
||||
ij_c_parentheses_expression_new_line_after_left_paren = false
|
||||
ij_c_parentheses_expression_right_paren_on_new_line = false
|
||||
ij_c_place_assignment_sign_on_next_line = false
|
||||
ij_c_property_nonatomic = true
|
||||
ij_c_put_ivars_to_implementation = true
|
||||
ij_c_refactor_compatibility_aliases_and_classes = true
|
||||
ij_c_refactor_properties_and_ivars = true
|
||||
ij_c_release_style = ivar
|
||||
ij_c_retain_object_parameters_in_constructor = true
|
||||
ij_c_semicolon_after_method_signature = false
|
||||
ij_c_shift_operation_align_multiline = true
|
||||
ij_c_shift_operation_wrap = normal
|
||||
ij_c_show_non_virtual_functions = false
|
||||
ij_c_space_after_colon = true
|
||||
ij_c_space_after_colon_in_foreach = true
|
||||
ij_c_space_after_colon_in_selector = false
|
||||
ij_c_space_after_comma = true
|
||||
ij_c_space_after_cup_in_blocks = false
|
||||
ij_c_space_after_dictionary_literal_colon = true
|
||||
ij_c_space_after_for_semicolon = true
|
||||
ij_c_space_after_init_list_colon = true
|
||||
ij_c_space_after_method_parameter_type_parentheses = false
|
||||
ij_c_space_after_method_return_type_parentheses = false
|
||||
ij_c_space_after_pointer_in_declaration = true
|
||||
ij_c_space_after_quest = true
|
||||
ij_c_space_after_reference_in_declaration = false
|
||||
ij_c_space_after_reference_in_rvalue = false
|
||||
ij_c_space_after_structures_rbrace = true
|
||||
ij_c_space_after_superclass_colon = true
|
||||
ij_c_space_after_type_cast = true
|
||||
ij_c_space_after_visibility_sign_in_method_declaration = true
|
||||
ij_c_space_before_autorelease_pool_lbrace = true
|
||||
ij_c_space_before_catch_keyword = true
|
||||
ij_c_space_before_catch_left_brace = true
|
||||
ij_c_space_before_catch_parentheses = true
|
||||
ij_c_space_before_category_parentheses = true
|
||||
ij_c_space_before_chained_send_message = true
|
||||
ij_c_space_before_class_left_brace = true
|
||||
ij_c_space_before_colon = true
|
||||
ij_c_space_before_colon_in_foreach = false
|
||||
ij_c_space_before_comma = false
|
||||
ij_c_space_before_dictionary_literal_colon = false
|
||||
ij_c_space_before_do_left_brace = true
|
||||
ij_c_space_before_else_keyword = true
|
||||
ij_c_space_before_else_left_brace = true
|
||||
ij_c_space_before_for_left_brace = true
|
||||
ij_c_space_before_for_parentheses = true
|
||||
ij_c_space_before_for_semicolon = false
|
||||
ij_c_space_before_if_left_brace = true
|
||||
ij_c_space_before_if_parentheses = true
|
||||
ij_c_space_before_init_list = false
|
||||
ij_c_space_before_init_list_colon = true
|
||||
ij_c_space_before_method_call_parentheses = false
|
||||
ij_c_space_before_method_left_brace = true
|
||||
ij_c_space_before_method_parentheses = false
|
||||
ij_c_space_before_namespace_lbrace = true
|
||||
ij_c_space_before_pointer_in_declaration = false
|
||||
ij_c_space_before_property_attributes_parentheses = false
|
||||
ij_c_space_before_protocols_brackets = true
|
||||
ij_c_space_before_quest = true
|
||||
ij_c_space_before_reference_in_declaration = true
|
||||
ij_c_space_before_superclass_colon = true
|
||||
ij_c_space_before_switch_left_brace = true
|
||||
ij_c_space_before_switch_parentheses = true
|
||||
ij_c_space_before_template_call_lt = false
|
||||
ij_c_space_before_template_declaration_lt = false
|
||||
ij_c_space_before_try_left_brace = true
|
||||
ij_c_space_before_while_keyword = true
|
||||
ij_c_space_before_while_left_brace = true
|
||||
ij_c_space_before_while_parentheses = true
|
||||
ij_c_space_between_adjacent_brackets = false
|
||||
ij_c_space_between_operator_and_punctuator = false
|
||||
ij_c_space_within_empty_array_initializer_braces = false
|
||||
ij_c_spaces_around_additive_operators = true
|
||||
ij_c_spaces_around_assignment_operators = true
|
||||
ij_c_spaces_around_bitwise_operators = true
|
||||
ij_c_spaces_around_equality_operators = true
|
||||
ij_c_spaces_around_lambda_arrow = true
|
||||
ij_c_spaces_around_logical_operators = true
|
||||
ij_c_spaces_around_multiplicative_operators = true
|
||||
ij_c_spaces_around_pm_operators = false
|
||||
ij_c_spaces_around_relational_operators = true
|
||||
ij_c_spaces_around_shift_operators = true
|
||||
ij_c_spaces_around_unary_operator = false
|
||||
ij_c_spaces_within_array_initializer_braces = false
|
||||
ij_c_spaces_within_braces = true
|
||||
ij_c_spaces_within_brackets = false
|
||||
ij_c_spaces_within_cast_parentheses = false
|
||||
ij_c_spaces_within_catch_parentheses = false
|
||||
ij_c_spaces_within_category_parentheses = false
|
||||
ij_c_spaces_within_empty_braces = false
|
||||
ij_c_spaces_within_empty_function_call_parentheses = false
|
||||
ij_c_spaces_within_empty_function_declaration_parentheses = false
|
||||
ij_c_spaces_within_empty_lambda_capture_list_bracket = false
|
||||
ij_c_spaces_within_empty_template_call_ltgt = false
|
||||
ij_c_spaces_within_empty_template_declaration_ltgt = false
|
||||
ij_c_spaces_within_for_parentheses = false
|
||||
ij_c_spaces_within_function_call_parentheses = false
|
||||
ij_c_spaces_within_function_declaration_parentheses = false
|
||||
ij_c_spaces_within_if_parentheses = false
|
||||
ij_c_spaces_within_lambda_capture_list_bracket = false
|
||||
ij_c_spaces_within_method_parameter_type_parentheses = false
|
||||
ij_c_spaces_within_method_return_type_parentheses = false
|
||||
ij_c_spaces_within_parentheses = false
|
||||
ij_c_spaces_within_property_attributes_parentheses = false
|
||||
ij_c_spaces_within_protocols_brackets = false
|
||||
ij_c_spaces_within_send_message_brackets = false
|
||||
ij_c_spaces_within_structured_binding_list_bracket = false
|
||||
ij_c_spaces_within_switch_parentheses = false
|
||||
ij_c_spaces_within_template_call_ltgt = false
|
||||
ij_c_spaces_within_template_declaration_ltgt = false
|
||||
ij_c_spaces_within_template_double_gt = true
|
||||
ij_c_spaces_within_while_parentheses = false
|
||||
ij_c_special_else_if_treatment = true
|
||||
ij_c_structured_binding_list_align_multiline = false
|
||||
ij_c_structured_binding_list_align_multiline_bracket = false
|
||||
ij_c_structured_binding_list_comma_on_next_line = false
|
||||
ij_c_structured_binding_list_new_line_after_lbracket = false
|
||||
ij_c_structured_binding_list_new_line_before_rbracket = false
|
||||
ij_c_structured_binding_list_wrap = off
|
||||
ij_c_superclass_list_after_colon = never
|
||||
ij_c_superclass_list_align_multiline = true
|
||||
ij_c_superclass_list_before_colon = if_long
|
||||
ij_c_superclass_list_comma_on_next_line = false
|
||||
ij_c_superclass_list_wrap = on_every_item
|
||||
ij_c_tag_prefix_of_block_comment = at
|
||||
ij_c_tag_prefix_of_line_comment = back_slash
|
||||
ij_c_template_call_arguments_align_multiline = false
|
||||
ij_c_template_call_arguments_align_multiline_pars = false
|
||||
ij_c_template_call_arguments_comma_on_next_line = false
|
||||
ij_c_template_call_arguments_new_line_after_lt = false
|
||||
ij_c_template_call_arguments_new_line_before_gt = false
|
||||
ij_c_template_call_arguments_wrap = off
|
||||
ij_c_template_declaration_function_body_indent = false
|
||||
ij_c_template_declaration_function_wrap = split_into_lines
|
||||
ij_c_template_declaration_struct_body_indent = false
|
||||
ij_c_template_declaration_struct_wrap = split_into_lines
|
||||
ij_c_template_parameters_align_multiline = false
|
||||
ij_c_template_parameters_align_multiline_pars = false
|
||||
ij_c_template_parameters_comma_on_next_line = false
|
||||
ij_c_template_parameters_new_line_after_lt = false
|
||||
ij_c_template_parameters_new_line_before_gt = false
|
||||
ij_c_template_parameters_wrap = off
|
||||
ij_c_ternary_operation_signs_on_next_line = true
|
||||
ij_c_ternary_operation_wrap = normal
|
||||
ij_c_type_qualifiers_placement = before
|
||||
ij_c_use_modern_casts = true
|
||||
ij_c_use_setters_in_constructor = true
|
||||
ij_c_while_brace_force = never
|
||||
ij_c_while_on_new_line = false
|
||||
ij_c_wrap_property_declaration = off
|
||||
|
||||
[{*.cmake,CMakeLists.txt}]
|
||||
ij_cmake_align_multiline_parameters_in_calls = false
|
||||
ij_cmake_force_commands_case = 2
|
||||
ij_cmake_keep_blank_lines_in_code = 2
|
||||
ij_cmake_space_before_for_parentheses = true
|
||||
ij_cmake_space_before_if_parentheses = true
|
||||
ij_cmake_space_before_method_call_parentheses = false
|
||||
ij_cmake_space_before_method_parentheses = false
|
||||
ij_cmake_space_before_while_parentheses = true
|
||||
ij_cmake_spaces_within_for_parentheses = false
|
||||
ij_cmake_spaces_within_if_parentheses = false
|
||||
ij_cmake_spaces_within_method_call_parentheses = false
|
||||
ij_cmake_spaces_within_method_parentheses = false
|
||||
ij_cmake_spaces_within_while_parentheses = false
|
||||
|
||||
[{*.har,*.json,*.jsonc}]
|
||||
indent_size = 2
|
||||
ij_json_keep_blank_lines_in_code = 0
|
||||
ij_json_keep_indents_on_empty_lines = false
|
||||
ij_json_keep_line_breaks = true
|
||||
ij_json_space_after_colon = true
|
||||
ij_json_space_after_comma = true
|
||||
ij_json_space_before_colon = true
|
||||
ij_json_space_before_comma = false
|
||||
ij_json_spaces_within_braces = false
|
||||
ij_json_spaces_within_brackets = false
|
||||
ij_json_wrap_long_lines = false
|
||||
|
||||
[{*.htm,*.html,*.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
|
||||
|
||||
[{*.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_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,build_debug_32.ps1}]
|
||||
max_line_length = 115
|
||||
ij_powershell_align_multiline_binary_operation = false
|
||||
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 = off
|
||||
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 = off
|
||||
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 = off
|
||||
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 = false
|
||||
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 = false
|
||||
ij_powershell_method_annotation_wrap = split_into_lines
|
||||
ij_powershell_method_brace_style = next_line
|
||||
ij_powershell_method_call_chain_wrap = off
|
||||
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 = off
|
||||
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 = true
|
||||
ij_powershell_space_before_catch_keyword = true
|
||||
ij_powershell_space_before_catch_left_brace = true
|
||||
ij_powershell_space_before_class_left_brace = true
|
||||
ij_powershell_space_before_colon = true
|
||||
ij_powershell_space_before_comma = false
|
||||
ij_powershell_space_before_do_left_brace = true
|
||||
ij_powershell_space_before_else_keyword = true
|
||||
ij_powershell_space_before_else_left_brace = true
|
||||
ij_powershell_space_before_finally_keyword = true
|
||||
ij_powershell_space_before_finally_left_brace = true
|
||||
ij_powershell_space_before_for_left_brace = true
|
||||
ij_powershell_space_before_for_parentheses = true
|
||||
ij_powershell_space_before_for_semicolon = false
|
||||
ij_powershell_space_before_if_left_brace = true
|
||||
ij_powershell_space_before_if_parentheses = true
|
||||
ij_powershell_space_before_method_call_parentheses = false
|
||||
ij_powershell_space_before_method_left_brace = true
|
||||
ij_powershell_space_before_method_parentheses = false
|
||||
ij_powershell_space_before_switch_left_brace = true
|
||||
ij_powershell_space_before_switch_parentheses = true
|
||||
ij_powershell_space_before_try_left_brace = true
|
||||
ij_powershell_space_before_while_keyword = true
|
||||
ij_powershell_space_before_while_left_brace = true
|
||||
ij_powershell_space_before_while_parentheses = true
|
||||
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
|
||||
|
||||
[{*.toml,Cargo.lock,Cargo.toml.orig,Gopkg.lock,Pipfile,poetry.lock}]
|
||||
ij_toml_keep_indents_on_empty_lines = false
|
||||
1
.idea/.gitignore
generated
vendored
1
.idea/.gitignore
generated
vendored
@@ -4,3 +4,4 @@
|
||||
# Editor-based HTTP Client requests
|
||||
/httpRequests/
|
||||
vcs.xml
|
||||
/editor.xml
|
||||
7
.idea/codeStyles/Project.xml
generated
7
.idea/codeStyles/Project.xml
generated
@@ -32,13 +32,6 @@
|
||||
</indentOptions>
|
||||
</codeStyleSettings>
|
||||
<codeStyleSettings language="ObjectiveC">
|
||||
<option name="KEEP_FIRST_COLUMN_COMMENT" value="false" />
|
||||
<option name="BLANK_LINES_BEFORE_IMPORTS" value="0" />
|
||||
<option name="BLANK_LINES_AFTER_IMPORTS" value="0" />
|
||||
<option name="BLANK_LINES_AROUND_CLASS" value="0" />
|
||||
<option name="BLANK_LINES_AROUND_METHOD" value="0" />
|
||||
<option name="BLANK_LINES_AROUND_METHOD_IN_INTERFACE" value="0" />
|
||||
<option name="IF_BRACE_FORCE" value="3" />
|
||||
<option name="SOFT_MARGINS" value="120" />
|
||||
<indentOptions>
|
||||
<option name="CONTINUATION_INDENT_SIZE" value="4" />
|
||||
|
||||
7
.idea/dictionaries/project.xml
generated
Normal file
7
.idea/dictionaries/project.xml
generated
Normal file
@@ -0,0 +1,7 @@
|
||||
<component name="ProjectDictionaryState">
|
||||
<dictionary name="project">
|
||||
<words>
|
||||
<w>koalabox</w>
|
||||
</words>
|
||||
</dictionary>
|
||||
</component>
|
||||
1
.idea/inspectionProfiles/Project_Default.xml
generated
1
.idea/inspectionProfiles/Project_Default.xml
generated
@@ -5,5 +5,6 @@
|
||||
<option name="clangTidyChecks" value="-*,cppcoreguidelines-interfaces-global-init,cppcoreguidelines-narrowing-conversions,cppcoreguidelines-pro-type-member-init,cppcoreguidelines-pro-type-static-cast-downcast,cppcoreguidelines-slicing,google-default-arguments,google-explicit-constructor,google-runtime-operator,hicpp-exception-baseclass,hicpp-multiway-paths-covered,modernize-avoid-bind,modernize-concat-nested-namespaces,modernize-deprecated-headers,modernize-deprecated-ios-base-aliases,modernize-loop-convert,modernize-make-shared,modernize-make-unique,modernize-pass-by-value,modernize-raw-string-literal,modernize-redundant-void-arg,modernize-replace-auto-ptr,modernize-replace-disallow-copy-and-assign-macro,modernize-replace-random-shuffle,modernize-return-braced-init-list,modernize-shrink-to-fit,modernize-unary-static-assert,modernize-use-auto,modernize-use-bool-literals,modernize-use-emplace,modernize-use-equals-default,modernize-use-equals-delete,modernize-use-nodiscard,modernize-use-noexcept,modernize-use-nullptr,modernize-use-override,modernize-use-transparent-functors,modernize-use-uncaught-exceptions,mpi-buffer-deref,mpi-type-mismatch,openmp-use-default-none,performance-faster-string-find,performance-for-range-copy,performance-implicit-conversion-in-loop,performance-inefficient-algorithm,performance-inefficient-string-concatenation,performance-inefficient-vector-operation,performance-move-const-arg,performance-move-constructor-init,performance-no-automatic-move,performance-noexcept-move-constructor,performance-trivially-destructible,performance-type-promotion-in-math-fn,performance-unnecessary-copy-initialization,performance-unnecessary-value-param,portability-simd-intrinsics,bugprone-*,abseil-*,cert-*,objc-*,readability-*,clang-analyzer-*,misc-*,-readability-magic-numbers,-bugprone-easily-swappable-parameters,-readability-implicit-bool-conversion,-readability-identifier-length,-readability-named-parameter,-readability-function-cognitive-complexity" />
|
||||
</inspection_tool>
|
||||
<inspection_tool class="ConstantFunctionResult" enabled="true" level="INFORMATION" enabled_by_default="true" editorAttributes="INFORMATION_ATTRIBUTES" />
|
||||
<inspection_tool class="CppDFAConstantParameter" enabled="true" level="WEAK WARNING" enabled_by_default="true" editorAttributes="INFO_ATTRIBUTES" />
|
||||
</profile>
|
||||
</component>
|
||||
3
.idea/misc.xml
generated
3
.idea/misc.xml
generated
@@ -1,5 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="CMakePythonSetting">
|
||||
<option name="pythonIntegrationState" value="NO" />
|
||||
</component>
|
||||
<component name="CMakeWorkspace" PROJECT_DIR="$PROJECT_DIR$" />
|
||||
<component name="CidrRootsConfiguration">
|
||||
<libraryRoots>
|
||||
|
||||
@@ -47,6 +47,7 @@ set(
|
||||
src/core/paths.hpp
|
||||
src/core/types.cpp
|
||||
src/core/types.hpp
|
||||
src/game_mode/exports/steam_api.cpp
|
||||
src/game_mode/exports/steam_api_flat.cpp
|
||||
src/game_mode/exports/steam_api_internal.cpp
|
||||
src/game_mode/exports/steam_api_unversioned.cpp
|
||||
@@ -92,6 +93,7 @@ if (CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||||
src/store_mode/store_api.hpp
|
||||
src/store_mode/store_cache.cpp
|
||||
src/store_mode/store_cache.hpp
|
||||
src/game_mode/exports/steam_api.cpp
|
||||
)
|
||||
endif ()
|
||||
|
||||
@@ -102,3 +104,5 @@ configure_output_name(${STEAMAPI_DLL})
|
||||
configure_include_directories()
|
||||
|
||||
target_link_libraries(SmokeAPI PRIVATE KoalaBox)
|
||||
|
||||
add_subdirectory(tools)
|
||||
|
||||
2
KoalaBox
2
KoalaBox
Submodule KoalaBox updated: 842c83eecf...abcf5b59fa
@@ -2,7 +2,7 @@
|
||||
|
||||
_Legit DLC Unlocker for Steamworks_
|
||||
|
||||
image::https://www.gstatic.com/android/keyboard/emojikitchen/20201001/u1f428/u1f428_u2615.png[,256,align="center"]
|
||||
image::https://www.gstatic.com/android/keyboard/emojikitchen/20201001/u1f428/u1f428_u2615.png[,128,align="center"]
|
||||
|
||||
== ✨ Features
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
"logging": true,
|
||||
"unlock_family_sharing": true,
|
||||
"default_app_status": "unlocked",
|
||||
"override_app_id": 0,
|
||||
"override_app_status": {},
|
||||
"override_dlc_status": {},
|
||||
"auto_inject_inventory": true,
|
||||
|
||||
BIN
res/dll/steamworks_sdk_162/sdk/redistributable_bin/steam_api.dll
Normal file
BIN
res/dll/steamworks_sdk_162/sdk/redistributable_bin/steam_api.dll
Normal file
Binary file not shown.
Binary file not shown.
3412
res/interface_lookup.json
Normal file
3412
res/interface_lookup.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -44,12 +44,16 @@
|
||||
#define DLL_EXPORT(TYPE) extern "C" [[maybe_unused]] __declspec( dllexport ) TYPE __cdecl
|
||||
#define VIRTUAL(TYPE) __declspec(noinline) TYPE __fastcall
|
||||
|
||||
// TODO: Replace with direct call
|
||||
#define GET_ORIGINAL_HOOKED_FUNCTION(FUNC) \
|
||||
static const auto FUNC##_o = koalabox::hook::get_original_hooked_function(#FUNC, FUNC);
|
||||
|
||||
#define GET_ORIGINAL_FUNCTION_STEAMAPI(FUNC) \
|
||||
static const auto FUNC##_o = koalabox::hook::get_original_function(globals::steamapi_module, #FUNC, FUNC);
|
||||
#define ORIGINAL_FUNCTION_STEAMAPI(FUNC) \
|
||||
koalabox::hook::get_original_function(globals::steamapi_module, #FUNC, FUNC)
|
||||
|
||||
// TODO: Rename to DEFINE_ORIGINAL_FUNCTION_STEAMAPI
|
||||
#define GET_ORIGINAL_FUNCTION_STEAMAPI(FUNC) \
|
||||
static const auto FUNC##_o = ORIGINAL_FUNCTION_STEAMAPI(FUNC);
|
||||
|
||||
#define DETOUR_ADDRESS(FUNC, ADDRESS) \
|
||||
koalabox::hook::detour_or_warn(ADDRESS, #FUNC, reinterpret_cast<uintptr_t>(FUNC));
|
||||
@@ -91,7 +95,8 @@ struct SteamItemDetails_t {
|
||||
// results from UserHasLicenseForApp
|
||||
enum EUserHasLicenseForAppResult {
|
||||
k_EUserHasLicenseResultHasLicense = 0, // User has a license for specified app
|
||||
k_EUserHasLicenseResultDoesNotHaveLicense = 1, // User does not have a license for the specified app
|
||||
k_EUserHasLicenseResultDoesNotHaveLicense = 1,
|
||||
// User does not have a license for the specified app
|
||||
k_EUserHasLicenseResultNoAuth = 2, // User has not been authenticated
|
||||
};
|
||||
|
||||
@@ -115,10 +120,12 @@ private:
|
||||
// These 2 names must match the property names from Steam API
|
||||
String appid;
|
||||
String name;
|
||||
|
||||
public:
|
||||
explicit DLC() = default;
|
||||
|
||||
explicit DLC(String appid, String name) : appid{std::move(appid)}, name{std::move(name)} {}
|
||||
explicit DLC(String appid, String name) : appid{std::move(appid)}, name{std::move(name)} {
|
||||
}
|
||||
|
||||
[[nodiscard]] String get_id_str() const {
|
||||
return appid;
|
||||
@@ -134,7 +141,7 @@ public:
|
||||
|
||||
NLOHMANN_DEFINE_TYPE_INTRUSIVE(DLC, appid, name)
|
||||
|
||||
static Vector<DLC> get_dlcs_from_apps(const AppDlcNameMap& apps, AppId_t app_id);
|
||||
static Vector<DLC> get_dlcs_from_apps(const AppDlcNameMap &apps, AppId_t app_id);
|
||||
|
||||
static DlcNameMap get_dlc_map_from_vector(const Vector<DLC>& vector);
|
||||
static DlcNameMap get_dlc_map_from_vector(const Vector<DLC> &vector);
|
||||
};
|
||||
19
src/game_mode/exports/steam_api.cpp
Normal file
19
src/game_mode/exports/steam_api.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
#include <smoke_api/config.hpp>
|
||||
|
||||
// TODO: Detour in hook mode
|
||||
DLL_EXPORT(bool) SteamAPI_RestartAppIfNecessary(
|
||||
[[maybe_unused]] const uint32_t unOwnAppID
|
||||
) {
|
||||
if (smoke_api::config::instance.override_app_id != 0) {
|
||||
LOG_DEBUG("{} -> Preventing app restart", __func__)
|
||||
return false;
|
||||
}
|
||||
|
||||
return ORIGINAL_FUNCTION_STEAMAPI(SteamAPI_RestartAppIfNecessary)(unOwnAppID);
|
||||
}
|
||||
|
||||
DLL_EXPORT(void) SteamAPI_Shutdown() {
|
||||
LOG_INFO("{} -> Game requested shutdown", __func__)
|
||||
|
||||
ORIGINAL_FUNCTION_STEAMAPI(SteamAPI_Shutdown)();
|
||||
}
|
||||
@@ -23,6 +23,7 @@ namespace smoke_api::config {
|
||||
bool logging = false;
|
||||
bool unlock_family_sharing = true;
|
||||
AppStatus default_app_status = AppStatus::UNLOCKED;
|
||||
uint32_t override_app_id = 0;
|
||||
Map<String, AppStatus> override_app_status;
|
||||
Map<String, AppStatus> override_dlc_status;
|
||||
AppDlcNameMap extra_dlcs;
|
||||
@@ -37,6 +38,7 @@ namespace smoke_api::config {
|
||||
logging,
|
||||
unlock_family_sharing,
|
||||
default_app_status,
|
||||
override_app_id,
|
||||
override_app_status,
|
||||
override_dlc_status,
|
||||
extra_dlcs,
|
||||
|
||||
@@ -34,17 +34,39 @@
|
||||
// Given that hooking steam_api has no apparent benefits, but has inherent flaws,
|
||||
// the support for it has been dropped from this project.
|
||||
|
||||
|
||||
void override_app_id() {
|
||||
const auto override_app_id = smoke_api::config::instance.override_app_id;
|
||||
if (override_app_id == 0)
|
||||
return;
|
||||
|
||||
LOG_DEBUG("Overriding app id to {}", override_app_id);
|
||||
|
||||
SetEnvironmentVariable(
|
||||
TEXT("SteamAppId"),
|
||||
std::to_wstring(override_app_id).c_str()
|
||||
);
|
||||
}
|
||||
|
||||
void init_proxy_mode() {
|
||||
LOG_INFO("🔀 Detected proxy mode")
|
||||
|
||||
globals::steamapi_module = koalabox::loader::load_original_library(paths::get_self_path(), STEAMAPI_DLL);
|
||||
override_app_id();
|
||||
|
||||
globals::steamapi_module = koalabox::loader::load_original_library(
|
||||
paths::get_self_path(),
|
||||
STEAMAPI_DLL
|
||||
);
|
||||
}
|
||||
|
||||
void init_hook_mode() {
|
||||
LOG_INFO("🪝 Detected hook mode")
|
||||
|
||||
override_app_id();
|
||||
|
||||
koalabox::dll_monitor::init_listener(
|
||||
STEAMCLIENT_DLL, [](const HMODULE& library) {
|
||||
STEAMCLIENT_DLL,
|
||||
[](const HMODULE &library) {
|
||||
globals::steamclient_module = library;
|
||||
|
||||
DETOUR_STEAMCLIENT(CreateInterface)
|
||||
@@ -54,7 +76,7 @@ void init_hook_mode() {
|
||||
);
|
||||
}
|
||||
|
||||
bool is_valve_steam(const String& exe_name) noexcept {
|
||||
bool is_valve_steam(const String &exe_name) noexcept {
|
||||
try {
|
||||
if (exe_name < not_equals > "steam.exe") {
|
||||
return false;
|
||||
@@ -63,11 +85,12 @@ bool is_valve_steam(const String& exe_name) noexcept {
|
||||
// Verify that it's steam from valve, and not some other executable coincidentally named steam
|
||||
|
||||
const HMODULE steam_handle = koalabox::win_util::get_module_handle_or_throw(nullptr);
|
||||
const auto manifest = koalabox::win_util::get_module_manifest(steam_handle);
|
||||
const auto manifest = koalabox::win_util::get_module_manifest(
|
||||
steam_handle);
|
||||
|
||||
// Steam.exe manifest is expected to contain this string
|
||||
return manifest < contains > "valvesoftware.steam.steam";
|
||||
} catch (const Exception& e) {
|
||||
} catch (const Exception &e) {
|
||||
LOG_ERROR("{} -> {}", __func__, e.what())
|
||||
|
||||
return false;
|
||||
@@ -75,8 +98,8 @@ bool is_valve_steam(const String& exe_name) noexcept {
|
||||
}
|
||||
|
||||
namespace smoke_api {
|
||||
|
||||
void init(HMODULE module_handle) {
|
||||
void init(const HMODULE module_handle) {
|
||||
// FIXME: IMPORTANT! Non ascii paths in directories will result in init errors
|
||||
try {
|
||||
DisableThreadLibraryCalls(module_handle);
|
||||
|
||||
@@ -87,19 +110,28 @@ namespace smoke_api {
|
||||
config::init_config();
|
||||
|
||||
if (config::instance.logging) {
|
||||
koalabox::logger::init_file_logger(paths::get_log_path());
|
||||
koalabox::logger::init_file_logger();
|
||||
}
|
||||
|
||||
// This kind of timestamp is reliable only for CI builds, as it will reflect the compilation
|
||||
// time stamp only when this file gets recompiled.
|
||||
LOG_INFO("🐨 {} v{} | Compiled at '{}'", PROJECT_NAME, PROJECT_VERSION, __TIMESTAMP__)
|
||||
LOG_INFO(
|
||||
"🐨 {} v{} | Compiled at '{}'", PROJECT_NAME,
|
||||
PROJECT_VERSION,
|
||||
__TIMESTAMP__
|
||||
)
|
||||
|
||||
const auto exe_path = Path(koalabox::win_util::get_module_file_name_or_throw(nullptr));
|
||||
const Path exe_path = koalabox::win_util::get_module_file_name_or_throw(nullptr);
|
||||
const auto exe_name = exe_path.filename().string();
|
||||
|
||||
LOG_DEBUG("Process name: '{}' [{}-bit]", exe_name, BITNESS)
|
||||
|
||||
if (koalabox::hook::is_hook_mode(globals::smokeapi_handle, STEAMAPI_DLL)) {
|
||||
const bool is_hook_mode = koalabox::hook::is_hook_mode(
|
||||
globals::smokeapi_handle,
|
||||
STEAMAPI_DLL
|
||||
);
|
||||
|
||||
if (is_hook_mode) {
|
||||
koalabox::hook::init(true);
|
||||
|
||||
if (is_valve_steam(exe_name)) {
|
||||
@@ -115,8 +147,10 @@ namespace smoke_api {
|
||||
}
|
||||
|
||||
LOG_INFO("🚀 Initialization complete")
|
||||
} catch (const Exception& ex) {
|
||||
koalabox::util::panic(fmt::format("Initialization error: {}", ex.what()));
|
||||
} catch (const Exception &ex) {
|
||||
koalabox::util::panic(
|
||||
fmt::format("Initialization error: {}", ex.what())
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -127,9 +161,8 @@ namespace smoke_api {
|
||||
}
|
||||
|
||||
LOG_INFO("💀 Shutdown complete")
|
||||
} catch (const Exception& ex) {
|
||||
} catch (const Exception &ex) {
|
||||
LOG_ERROR("Shutdown error: {}", ex.what())
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -17,15 +17,6 @@ namespace steam_impl {
|
||||
typedef Map<String, Map<int, int>> FunctionOrdinalMap;
|
||||
|
||||
FunctionOrdinalMap steam_client_ordinal_map = { // NOLINT(cert-err58-cpp)
|
||||
{"ISteamClient_GetISteamApps",
|
||||
{
|
||||
{6, 16},
|
||||
{7, 18},
|
||||
{8, 15},
|
||||
{9, 16},
|
||||
{12, 15},
|
||||
}
|
||||
},
|
||||
{"ISteamClient_GetISteamUser",
|
||||
{
|
||||
{6, 6},
|
||||
@@ -45,10 +36,20 @@ namespace steam_impl {
|
||||
{12, 12},
|
||||
}
|
||||
},
|
||||
{"ISteamClient_GetISteamApps",
|
||||
{
|
||||
{6, 16},
|
||||
{7, 18},
|
||||
{8, 15},
|
||||
{9, 16},
|
||||
{12, 15},
|
||||
}
|
||||
},
|
||||
{"ISteamClient_GetISteamInventory",
|
||||
{
|
||||
{17, 34},
|
||||
{18, 35},
|
||||
{21, 33},
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -65,6 +66,7 @@ namespace steam_impl {
|
||||
{12, 15},
|
||||
{13, 16},
|
||||
{15, 17},
|
||||
{23, 18},
|
||||
}}
|
||||
};
|
||||
|
||||
@@ -86,8 +88,8 @@ namespace steam_impl {
|
||||
int extract_version_number(
|
||||
const String& version_string,
|
||||
const String& prefix,
|
||||
int min_version,
|
||||
int max_version
|
||||
const int min_version,
|
||||
const int max_version
|
||||
) {
|
||||
LOG_DEBUG("Hooking interface '{}'", version_string)
|
||||
|
||||
@@ -106,21 +108,31 @@ namespace steam_impl {
|
||||
}
|
||||
|
||||
return version_number;
|
||||
} catch (const std::exception& ex) {
|
||||
koalabox::util::panic("Failed to extract version number from: '{}'", version_string);
|
||||
} catch ([[maybe_unused]] const std::exception& ex) {
|
||||
koalabox::util::panic(
|
||||
"Failed to extract version number from: '{}'. Reason: {}",
|
||||
version_string, ex.what()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
int get_ordinal(const FunctionOrdinalMap& ordinal_map, const String& function_name, int interface_version) {
|
||||
int get_ordinal(
|
||||
const FunctionOrdinalMap& ordinal_map,
|
||||
const String& function_name,
|
||||
int interface_version
|
||||
) {
|
||||
const auto& map = ordinal_map.at(function_name);
|
||||
|
||||
for (auto [version, ordinal]: std::ranges::reverse_view(map)) {
|
||||
for (auto [version, ordinal] : std::ranges::reverse_view(map)) {
|
||||
if (interface_version >= version) {
|
||||
return ordinal;
|
||||
}
|
||||
}
|
||||
|
||||
koalabox::util::panic("Invalid interface version ({}) for function {}", interface_version, function_name);
|
||||
koalabox::util::panic(
|
||||
"Invalid interface version ({}) for function {}",
|
||||
interface_version, function_name
|
||||
);
|
||||
}
|
||||
|
||||
#define HOOK_VIRTUALS(MAP, FUNC) \
|
||||
@@ -152,7 +164,7 @@ namespace steam_impl {
|
||||
const MutexLockGuard guard(section);
|
||||
|
||||
if (version_string.starts_with(STEAM_CLIENT)) {
|
||||
const auto version_number = extract_version_number(version_string, STEAM_CLIENT, 6, 20);
|
||||
const auto version_number = extract_version_number(version_string, STEAM_CLIENT, 6, 21);
|
||||
|
||||
HOOK_STEAM_CLIENT(ISteamClient_GetISteamApps)
|
||||
HOOK_STEAM_CLIENT(ISteamClient_GetISteamUser)
|
||||
@@ -176,13 +188,15 @@ namespace steam_impl {
|
||||
HOOK_STEAM_APPS(ISteamApps_BGetDLCDataByIndex)
|
||||
}
|
||||
} else if (version_string.starts_with(STEAM_USER)) {
|
||||
const auto version_number = extract_version_number(version_string, STEAM_USER, 9, 21);
|
||||
const auto version_number = extract_version_number(version_string, STEAM_USER, 9, 23);
|
||||
|
||||
if (version_number >= 12) {
|
||||
HOOK_STEAM_USER(ISteamUser_UserHasLicenseForApp)
|
||||
}
|
||||
} else if (version_string.starts_with(STEAM_INVENTORY)) {
|
||||
const auto version_number = extract_version_number(version_string, STEAM_INVENTORY, 1, 3);
|
||||
const auto version_number = extract_version_number(
|
||||
version_string, STEAM_INVENTORY, 1, 3
|
||||
);
|
||||
|
||||
HOOK_STEAM_INVENTORY(ISteamInventory_GetResultStatus)
|
||||
HOOK_STEAM_INVENTORY(ISteamInventory_GetResultItems)
|
||||
@@ -195,7 +209,10 @@ namespace steam_impl {
|
||||
if (version_number >= 2) {
|
||||
HOOK_STEAM_INVENTORY(ISteamInventory_GetResultItemProperty)
|
||||
}
|
||||
} else if (version_string.starts_with(CLIENT_ENGINE) && !hooked_interfaces.contains(interface)) {
|
||||
} else if (
|
||||
version_string.starts_with(CLIENT_ENGINE) &&
|
||||
!hooked_interfaces.contains(interface)
|
||||
) {
|
||||
#if COMPILE_STORE_MODE
|
||||
store::steamclient::process_client_engine(reinterpret_cast<uintptr_t>(interface));
|
||||
#endif
|
||||
@@ -210,26 +227,26 @@ namespace steam_impl {
|
||||
const auto& steam_api_module = koalabox::win_util::get_module_handle_or_throw(STEAMAPI_DLL);
|
||||
void* GetHSteamPipe_address;
|
||||
try {
|
||||
GetHSteamPipe_address = (void*) koalabox::win_util::get_proc_address_or_throw(
|
||||
GetHSteamPipe_address = (void*)koalabox::win_util::get_proc_address_or_throw(
|
||||
steam_api_module, "SteamAPI_GetHSteamPipe"
|
||||
);
|
||||
} catch (const Exception& ex) {
|
||||
GetHSteamPipe_address = (void*) koalabox::win_util::get_proc_address_or_throw(
|
||||
GetHSteamPipe_address = (void*)koalabox::win_util::get_proc_address_or_throw(
|
||||
steam_api_module, "GetHSteamPipe"
|
||||
);
|
||||
}
|
||||
typedef HSteamPipe (__cdecl* GetHSteamPipe_t)();
|
||||
const auto GetHSteamPipe_o = (GetHSteamPipe_t) GetHSteamPipe_address;
|
||||
typedef HSteamPipe (__cdecl*GetHSteamPipe_t)();
|
||||
const auto GetHSteamPipe_o = (GetHSteamPipe_t)GetHSteamPipe_address;
|
||||
return GetHSteamPipe_o();
|
||||
}
|
||||
|
||||
template<typename F>
|
||||
template <typename F>
|
||||
F get_virtual_function(void* interface, int ordinal) {
|
||||
auto* v_table = (void***) interface;
|
||||
return (F) (*v_table)[ordinal];
|
||||
auto* v_table = (void***)interface;
|
||||
return (F)(*v_table)[ordinal];
|
||||
}
|
||||
|
||||
template<typename F, typename... Args>
|
||||
template <typename F, typename... Args>
|
||||
auto call_virtual_function(void* interface, F function, Args... args) {
|
||||
#ifdef _WIN64
|
||||
void* RCX = interface;
|
||||
@@ -243,8 +260,9 @@ namespace steam_impl {
|
||||
|
||||
AppId_t get_app_id_or_throw() {
|
||||
// Get CreateInterface
|
||||
const auto& steam_client_module = koalabox::win_util::get_module_handle_or_throw(STEAMCLIENT_DLL);
|
||||
auto* CreateInterface_address = (void*) koalabox::win_util::get_proc_address_or_throw(
|
||||
const auto& steam_client_module =
|
||||
koalabox::win_util::get_module_handle_or_throw(STEAMCLIENT_DLL);
|
||||
auto* CreateInterface_address = (void*)koalabox::win_util::get_proc_address_or_throw(
|
||||
steam_client_module, "CreateInterface"
|
||||
);
|
||||
auto* CreateInterface_o = PLH::FnCast(CreateInterface_address, CreateInterface);
|
||||
@@ -253,20 +271,28 @@ namespace steam_impl {
|
||||
int result;
|
||||
auto* i_steam_client = CreateInterface_o("SteamClient006", &result);
|
||||
if (i_steam_client == nullptr) {
|
||||
throw koalabox::util::exception("Failed to obtain SteamClient006 interface. Result: {}", result);
|
||||
throw koalabox::util::exception(
|
||||
"Failed to obtain SteamClient006 interface. Result: {}",
|
||||
result
|
||||
);
|
||||
}
|
||||
|
||||
// Get GetISteamUtils
|
||||
typedef void*** (__fastcall* GetISteamUtils_t)(PARAMS(HSteamPipe hSteamPipe, const char* version));
|
||||
typedef void*** (__fastcall*GetISteamUtils_t)(
|
||||
PARAMS(HSteamPipe hSteamPipe, const char* version)
|
||||
);
|
||||
const auto steam_utils_ordinal = steam_client_ordinal_map["ISteamClient_GetISteamUtils"][6];
|
||||
const auto GetISteamUtils_o = get_virtual_function<GetISteamUtils_t>(i_steam_client, steam_utils_ordinal);
|
||||
const auto GetISteamUtils_o = get_virtual_function<GetISteamUtils_t>(
|
||||
i_steam_client, steam_utils_ordinal);
|
||||
|
||||
// Get ISteamUtils
|
||||
const auto steam_pipe = get_steam_pipe_or_throw();
|
||||
auto* i_steam_utils = call_virtual_function(i_steam_client, GetISteamUtils_o, steam_pipe, "SteamUtils002");
|
||||
auto* i_steam_utils = call_virtual_function(
|
||||
i_steam_client, GetISteamUtils_o, steam_pipe, "SteamUtils002"
|
||||
);
|
||||
|
||||
// Get GetAppID
|
||||
typedef uint32_t (__fastcall* GetAppID_t)(PARAMS());
|
||||
typedef uint32_t (__fastcall*GetAppID_t)(PARAMS());
|
||||
const auto get_app_id_ordinal = steam_utils_ordinal_map["ISteamUtils_GetAppID"][2];
|
||||
const auto GetAppID_o = get_virtual_function<GetAppID_t>(i_steam_utils, get_app_id_ordinal);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user