# asd 33.0.0.181 -> 33.0.0.195 # branch 33.0.0, consecutive builds # # 16 functions resized, 100 new, 2 removed, 46 with body changes # total named bytes +8382 # # Normalised: tier annotations, off_/loc_/sub_ address tokens, # long hex literals and vN renumbering. Local declarations are # dropped. Raw diffs are 6-17% of lines and almost all noise. ## resized functions (byte size from the index sidecar) asd_link_sub_113A0 460 -> 472 +12 asd_srm_sub_12EC4 576 -> 588 +12 asd_link_call_D49810_D49814 96 -> 106 +10 asd_feature15_query_D44134 48 -> 58 +10 asd_build_hw_ops 720 -> 728 +8 asd_cfg_type_2_3 80 -> 72 -8 asd_foreach_link_active 52 -> 60 +8 asd_cfg_132byte_blob 84 -> 92 +8 asd_build_caps_blob 94 -> 88 -6 asd_hdcp_version_select 58 -> 62 +4 asd_event_dispatch 620 -> 624 +4 asd_hdcp_reset_all 170 -> 166 -4 asd_reg_read_BE08 98 -> 100 +2 asd_reg_write_19394 68 -> 70 +2 asd_reg_write_19328 68 -> 70 +2 asd_platform_op_403 266 -> 268 +2 ## functions present only in 33.0.0.195 + asd_align_map_range 204 bytes + asd_aux_op_D1891C 48 bytes + asd_aux_transfer_block 218 bytes + asd_aux_write_block 206 bytes + asd_build_reg_addr_table 236 bytes + asd_dio_apply_mask 78 bytes + asd_dio_desc_D330D0 90 bytes + asd_dio_desc_D33158 326 bytes + asd_dio_desc_D33228 254 bytes + asd_dio_disable_all 74 bytes + asd_dio_enable_all 128 bytes + asd_dio_idle_check 48 bytes + asd_dio_read_block 116 bytes + asd_dio_read_block10 124 bytes + asd_dio_read_pair 106 bytes + asd_dio_set_pair 78 bytes + asd_dio_write_packed 158 bytes + asd_dio_write_verify 96 bytes + asd_feature_enabled 54 bytes + asd_feature_enabled_cfg0 64 bytes + asd_feature_level_check 56 bytes + asd_foreach_link_D15412 42 bytes + asd_foreach_link_D15650 38 bytes + asd_get_D49810 6 bytes + asd_get_D49814 6 bytes + asd_get_D49818 6 bytes + asd_get_link_info 70 bytes + asd_get_link_reg_offsets 76 bytes + asd_get_platform_info 236 bytes + asd_hdcp1_disable 220 bytes + asd_hdcp2_disable 268 bytes + asd_link_call_D49818 74 bytes + asd_link_callback_ok 36 bytes + asd_link_check_C930 72 bytes + asd_link_reset 46 bytes + asd_link_sub_C930 1904 bytes + asd_opt_cb_D497F4 12 bytes + asd_opt_cb_D497FC 12 bytes + asd_opt_cb_D4980C_bounded 12 bytes + asd_opt_cb_D49828 12 bytes + asd_program_link_by_signal_v2 802 bytes + asd_program_link_by_signal_v3 784 bytes + asd_query_type_6_7 70 bytes + asd_reg_read_1217E 12 bytes + asd_reg_read_15DF0 18 bytes + asd_reg_read_18878 30 bytes + asd_reg_read_18898 36 bytes + asd_reg_write_166AC 202 bytes + asd_reg_write_1683C 126 bytes + asd_stream_reset 46 bytes + asd_stream_slot_update 118 bytes + j_asd_aux_op_D1891C 4 bytes + j_asd_aux_op_D1891C_0 4 bytes + j_asd_aux_op_D1891C_1 4 bytes + j_asd_aux_op_D1891C_2 4 bytes + j_asd_aux_op_D1891C_3 4 bytes + j_asd_clear_link_outputs_16 4 bytes + j_asd_dio_disable_all 4 bytes + j_asd_dio_disable_all_0 4 bytes + j_asd_dio_disable_all_1 4 bytes + j_asd_dio_disable_all_2 4 bytes + j_asd_dio_enable_all 4 bytes + j_asd_dio_enable_all_0 4 bytes + j_asd_dio_enable_all_1 4 bytes + j_asd_dio_enable_all_2 4 bytes + j_asd_dio_idle_check 4 bytes + j_asd_dio_idle_check_0 4 bytes + j_asd_dio_idle_check_1 4 bytes + j_asd_dio_idle_check_2 4 bytes + j_asd_dio_idle_check_3 4 bytes + j_asd_dio_read_block 4 bytes + j_asd_dio_read_block10 4 bytes + j_asd_dio_read_block10_0 4 bytes + j_asd_dio_read_block10_1 4 bytes + j_asd_dio_read_block_0 4 bytes + j_asd_dio_read_block_2 4 bytes + j_asd_dio_read_pair 4 bytes + j_asd_dio_read_pair_0 4 bytes + j_asd_dio_read_pair_1 4 bytes + j_asd_dio_read_pair_2 4 bytes + j_asd_dio_read_pair_3 4 bytes + j_asd_dio_set_pair 4 bytes + j_asd_dio_set_pair_0 4 bytes + j_asd_dio_set_pair_1 4 bytes + j_asd_dio_set_pair_2 4 bytes + j_asd_dio_set_pair_3 4 bytes + j_asd_dio_write_packed 4 bytes + j_asd_dio_write_packed_0 4 bytes + j_asd_dio_write_packed_1 4 bytes + j_asd_dio_write_packed_2 4 bytes + j_asd_get_link_reg_offsets 4 bytes + j_asd_get_link_reg_offsets_0 4 bytes + j_asd_get_link_reg_offsets_2 4 bytes + j_asd_program_link_by_signal_v2 4 bytes + j_asd_program_link_by_signal_v3 4 bytes + j_asd_stream_reset 4 bytes + j_asd_stream_reset_0 4 bytes + j_asd_stream_reset_1 4 bytes + j_asd_stream_reset_2 4 bytes + j_asd_stream_reset_3 4 bytes ## functions present only in 33.0.0.181 - asd_reg_read_188BC 30 bytes - j_asd_hwop_080_v1 4 bytes ## body changes, per function ### asd_build_caps_blob +// Builds a 0x108-byte capability blob: commands 20 and 25 use asd_check_link_budget's +// path (sub_X), command 24 uses sub_X. int __fastcall asd_build_caps_blob(int a1) result = asd_check_link_budget(a1: vX); - goto LABEL_6; + goto LABEL_5; case 24: result = asd_build_caps_blob_24(a1: vX); - goto LABEL_6; + goto LABEL_5; case 29: - result = sub_X(a1: vX); - goto LABEL_6; case 30: - result = sub_X(a1: vX); -LABEL_6: + result = ((int (__fastcall *)(_DWORD *, int))loc_X)(a1: vX, a2: a1); +LABEL_5: if ( result == 0 ) ### asd_build_hw_ops vX = off_X; - a1[21] = off_X; - a1[22] = vX; - a1[23] = vX; - a1[24] = vX; + a1[24] = off_X; a1[25] = vX; a1[26] = vX; - vX = off_X; - a1[27] = off_X; + a1[27] = vX; a1[28] = vX; a1[29] = vX; + vX = off_X; + a1[30] = off_X; + a1[31] = vX; + a1[32] = vX; vX = (int *)off_X; a1[7] = vX; - a1[30] = off_X; + a1[33] = off_X; a1[9] = off_X; - a1[31] = off_X; + a1[34] = off_X; a1[10] = off_X; a1[11] = off_X; - a1[32] = off_X; + a1[35] = off_X; vX = off_X; a1[12] = off_X; - a1[33] = off_X; - vX = off_X; - a1[45] = off_X; - a1[46] = vX; - a1[35] = vX; - a1[36] = vX; - vX = off_X; - vX = off_X; - a1[37] = off_X; - a1[49] = vX; - a1[50] = vX; + a1[36] = off_X; + vX = off_X; + a1[50] = off_X; + a1[51] = vX; + a1[40] = vX; + a1[41] = vX; + vX = off_X; + vX = off_X; + a1[42] = off_X; + a1[54] = vX; + a1[55] = vX; vX = off_X; *a1 = off_X; - a1[21] = off_X; + a1[24] = off_X; vX = off_X; *a1 = off_X; - a1[21] = off_X; + a1[24] = off_X; vX = off_X; LABEL_5: + a1[50] = vX; + a1[51] = vX; + vX = (int *)off_X; + vX = off_X; + vX = off_X; + vX = off_X; + vX = off_X; + vX = (int *)off_X; + a1[52] = off_X; + a1[53] = vX; + a1[54] = vX; + a1[41] = vX; + a1[42] = vX; + a1[43] = vX; + a1[44] = vX; a1[45] = vX; - a1[46] = vX; - vX = (int *)off_X; - vX = off_X; - vX = off_X; - vX = off_X; - vX = off_X; - vX = (int *)off_X; - a1[47] = off_X; - a1[48] = vX; - a1[49] = vX; - a1[36] = vX; - a1[37] = vX; - a1[38] = vX; - a1[39] = vX; - a1[40] = vX; goto LABEL_10; vX = off_X; - a1[21] = off_X; - a1[22] = vX; - a1[23] = vX; - a1[24] = vX; + a1[24] = off_X; a1[25] = vX; a1[26] = vX; - vX = off_X; - vX = off_X; - a1[27] = off_X; + a1[27] = vX; a1[28] = vX; + a1[29] = vX; + vX = off_X; + vX = off_X; + a1[30] = off_X; + a1[31] = vX; *a1 = vX; vX = off_X; - a1[29] = off_X; - a1[30] = vX; - vX = off_X; - a1[31] = off_X; - a1[32] = vX; + a1[32] = off_X; + a1[33] = vX; + vX = off_X; + a1[34] = off_X; + a1[35] = vX; + vX = off_X; + a1[50] = vX; + HIDWORD(vX) = off_X; a1[13] = vX; - vX = off_X; - a1[45] = off_X; - vX = off_X; - vX = off_X; - a1[34] = vX; - a1[35] = vX; - a1[36] = vX; - vX = off_X; - vX = off_X; - a1[49] = off_X; + a1[37] = off_X; + LODWORD(vX) = off_X; + *((_QWORD *)a1 + 20) = vX; + LODWORD(vX) = off_X; + vX = off_X; + a1[54] = off_X; + a1[55] = vX; + vX = (int *)off_X; +LABEL_7: + a1[45] = vX; + a1[46] = vX; + goto LABEL_10; + case 11: + a1[30] = off_X; + *a1 = off_X; + a1[24] = off_X; + vX = off_X; + a1[6] = off_X; + vX = off_X; + vX = off_X; + vX = off_X; + vX = off_X; a1[50] = vX; - vX = (int *)off_X; -LABEL_7: + a1[51] = vX; + a1[52] = vX; + a1[53] = vX; + vX = off_X; + vX = (int *)off_X; + vX = off_X; + vX = (int *)off_X; + vX = off_X; + a1[54] = off_X; a1[40] = vX; a1[41] = vX; - goto LABEL_10; - case 11: - a1[27] = off_X; - *a1 = off_X; - a1[21] = off_X; - vX = off_X; - a1[6] = off_X; - vX = off_X; - vX = off_X; - vX = off_X; - vX = off_X; + a1[42] = vX; + a1[43] = vX; + a1[44] = vX; a1[45] = vX; - a1[46] = vX; - a1[47] = vX; - a1[48] = vX; - vX = off_X; - vX = (int *)off_X; - vX = off_X; - vX = (int *)off_X; - vX = off_X; - a1[49] = off_X; - a1[35] = vX; - a1[36] = vX; - a1[37] = vX; - a1[38] = vX; - a1[39] = vX; - a1[40] = vX; goto LABEL_10; case 12: - a1[27] = off_X; + a1[30] = off_X; vX = off_X; vX = off_X; - a1[21] = off_X; + a1[24] = off_X; a1[6] = vX; vX = off_X; - a1[45] = off_X; - a1[46] = vX; - vX = off_X; - vX = off_X; - a1[47] = vX; - a1[48] = vX; - a1[49] = vX; - vX = off_X; - vX = off_X; - vX = off_X; - vX = off_X; - vX = (int *)off_X; - a1[35] = off_X; - a1[36] = vX; - a1[37] = vX; - a1[38] = vX; - a1[39] = vX; - a1[40] = vX; + a1[50] = off_X; + a1[51] = vX; + vX = off_X; + vX = off_X; + a1[52] = vX; + a1[53] = vX; + a1[54] = vX; + vX = off_X; + vX = off_X; + vX = off_X; + vX = off_X; + vX = (int *)off_X; + a1[40] = off_X; + a1[41] = vX; + a1[42] = vX; + a1[43] = vX; + a1[44] = vX; + a1[45] = vX; LABEL_10: - vX = a1 + 21; - for ( i = 0; i != 14; ++i ) + vX = a1 + 24; + for ( i = 0; i != 16; ++i ) { vX(a1: &vX); - *((_WORD *)vX + i - 14) = vX; + *((_WORD *)vX + i - 16) = vX; } } - vX = a1 + 45; + vX = a1 + 50; for ( j = 0; j != 6; ++j ) ### asd_build_link_map_full { - vX = vX[19]; + vX = vX[20]; if ( vX != 0 ) return 2; - vX = vX[20]; + vX = vX[22]; if ( vX != 0 ) ### asd_cfg_132byte_blob -int __fastcall asd_cfg_132byte_blob(unsigned int a1, unsigned int *a2, int a3) +int __fastcall asd_cfg_132byte_blob(int a1, unsigned int *a2, int a3) { result = 7; - if ( a1 <= 0x1E ) + switch ( a1 ) { - vX = 1 << a1; - if ( (vX & 0xX) != 0 ) - { + case 20: + case 25: + vX = off_X; + vX = a2; + vX = 8; + goto LABEL_7; + case 24: vX = off_X; vX = 5; - } - else - { - if ( (vX & 0xX) == 0 ) - return result; - vX = off_X; - vX = a2; - vX = 8; - } - result = asd_copy_dword_list(a1: vX, a2: (int)vX, a3: vX); - if ( result == 0 ) - { - if ( *a2 != 0 ) - __asm { SVC 0xB4 } - return 36; - } +LABEL_7: + result = asd_copy_dword_list(a1: vX, a2: (int)vX, a3: vX); + goto LABEL_8; + case 29: + case 30: + result = sub_X(a1: a2); +LABEL_8: + if ( result == 0 ) + { + if ( *a2 != 0 ) + __asm { SVC 0xB4 } + result = 36; + } + break; + default: + return result; } ### asd_cfg_type_2_3 +// Prepares a 0x2C-byte descriptor (word 2 = 0xX, high half of word 0 = 4) for +// type 2 (index 0) or type 3 (index 1). int __fastcall asd_cfg_type_2_3(int a1) { HIWORD(vX[0]) = 4; - if ( a1 == 2 ) - { - vX = 0; - } - else - { - if ( a1 != 3 ) - return 2; - vX = 1; - } - vX = *((int (__fastcall **)(_DWORD *, int))off_X + 23); - if ( vX == nullptr ) - return 7; - result = vX(a1: vX, a2: vX); + if ( a1 != 2 && a1 != 3 ) + return 2; + result = asd_opt_cb_D49828(); if ( result == 0 ) ### asd_dio_entry_present { - return a1 <= 3 && off_X[5 * a1 + 10] != 0; + return a1 <= 3 && *((_DWORD *)off_X + 5 * a1 + 4) != 0; } ### asd_dispatch case 0x189u: - sub_X(a1: req->arg1); + asd_hdcp1_disable(a1: req->arg1); break; case 0x160u: - sub_X(a1: req->arg1, a2: req->arg2); + asd_link_reset(a1: req->arg1, a2: req->arg2); break; ### asd_event_dispatch bzero_core(result: vX, a2: 0x80u); - vX = off_X[0]; + vX = off_X; vX = 0; - if ( *off_X[0] != -1 ) + if ( *off_X != -1 ) __asm { SVC 0x5E ; '^' } vX = off_X; - off_X[4] = 0; + *(_DWORD *)off_X = 0; if ( asd_svc_sub_2794() ) { - vX = sub_X(a1: &vX); + vX = asd_link_check_C930(a1: &vX); if ( vX == 15 ) { - vX[4] = 2; + *vX = 2; if ( *vX != -1 ) vX = vX; - vX[4] = 4; + *vX = 4; if ( *vX != -1 ) vX = vX; - vX[4] = 4; + *vX = 4; if ( *vX != -1 ) { - vX = vX[5]; + vX = vX[1]; vX = vX + 1; vX = vX; - vX[5] = vX; + vX[1] = vX; vX = sub_X(a1: 1, a2: vX); vX = vX; - vX[4] = 4; + *vX = 4; if ( *vX != -1 ) vX = 0; - vX[6] = 0; - vX[7] = 0; - vX[8] = 0; - vX[9] = 0; + vX[2] = 0; + vX[3] = 0; + vX[4] = 0; + vX[5] = 0; while ( vX < vX ) { - if ( sub_X(a1: vX, a2: vX) != 0 ) - { - vX[4] = 1; + if ( asd_feature_enabled_cfg0(a1: vX, a2: vX) != 0 ) + { + *vX = 1; vX = *vX + 1; { - vX[4] = 16; + *vX = 16; vX = *vX + 1; { - vX[4] = 16; + *vX = 16; vX = *vX + 1; LABEL_42: - vX = &vX[vX]; - vX = vX[4]; + vX = vX[vX]; if ( vX == 0 ) { - _R2 = vX << 16; - __asm { UXTB16.W R2, R2 } - vX = (_R2 & 0xX | ((vX & 0xF) << 24)) + (unsigned __int16)((_WORD)vX << 8) + 0xX; + _R0 = vX << 16; + __asm { UXTB16.W R0, R0 } + vX = (_R0 & 0xX | ((vX & 0xF) << 24)) + (unsigned __int16)((_WORD)vX << 8) + 0xX; goto LABEL_58; vX = vX & 0xX | ((vX & 0xF) << 24); - vX[4] = vX; + vX[vX] = vX; } vX = vX & 0xX | ((unsigned __int8)vX << 16); - vX[4] = vX; + vX[vX] = vX; } LABEL_58: - vX[4] = vX; + vX[vX] = vX; } { - vX[4] = 1; + *vX = 1; vX = *vX + 1; { - vX[4] = 4; + *vX = 4; if ( *vX != -1 ) ### asd_feature15_query_D44134 bzero_core(result: vX, a2: 0x104u); + if ( !asd_feature_enabled(a1: 15) ) + return 8; result = (*((int (__fastcall **)(_DWORD *))off_X + 775))(a1: vX); ### asd_foreach_dio_entry { vX = 0; - vX = off_X + 10; + vX = (_DWORD *)((char *)off_X + 16); while ( vX != 4 ) else - return asd_link_notify_D49810(a1, a2: vX, a3: vX); + return asd_link_notify_D49810(a1); } ### asd_foreach_link_active - vX = (void (**)(void))off_X; - for ( i = 0; i != 736; i += 23 ) + if ( asd_feature_enabled(a1: 15) ) { - if ( vX[i + 1] != nullptr ) + vX = (void (**)(void))off_X; + for ( i = 0; i != 736; i += 23 ) { - if ( vX[i + 2] == (void (*)(void))1 ) + if ( vX[i + 1] != nullptr ) { - sub_X(); - } - else - { - vX[768](); - vX = vX[755]; - if ( vX != nullptr ) - vX(); + if ( vX[i + 2] == (void (*)(void))1 ) + { + sub_X(); + } + else + { + vX[768](); + vX = vX[755]; + if ( vX != nullptr ) + vX(); + } } ### asd_get_link_caps_full_v2 vX[vX++] = vX; - vX = (int (__fastcall *)(unsigned int))vX[33]; + vX = (int (__fastcall *)(unsigned int))vX[36]; if ( vX == nullptr || vX(a1: vX) != 0 ) ### asd_hdcp_reset_all case 12: - sub_X(); + asd_reg_write_166AC(); break; case 19: - sub_X(); + asd_reg_write_1683C(); break; case 29: - sub_X(); - break; case 30: - sub_X(); + sub_X(a1: vX); break; ### asd_hdcp_version_select - bzero_core(result: vX, a2: 0xA8u); - if ( a1 != 6 && a1 != 7 ) + bzero_core(result: vX, a2: 0x104u); + if ( a1 != 8 && a1 != 9 ) return 2; ### asd_hw_ops_init vX = (_DWORD *)((char *)off_X + 4); - bzero_core(result: (_DWORD *)off_X + 1, a2: 0xCCu); + bzero_core(result: (_DWORD *)off_X + 1, a2: 0xE0u); *vX = a1; ### asd_link_call_D49810_D49814 +// Bounds a1 <= 1 and a2 <= 3, then invokes the runtime callbacks obtained from +// asd_get_D49810 and asd_get_D49814. int __fastcall asd_link_call_D49810_D49814(unsigned int a1, unsigned int a2, int a3) { + D49810 = (int (__fastcall *)(unsigned int, unsigned int))asd_get_D49810(); + vX = 2; + D49814 = asd_get_D49814(); vX = a1 > 1; - result = 2; - if ( !vX && a2 <= 3 && a3 != 0 ) + if ( a1 <= 1 ) + vX = a2 > 3; + if ( !vX && a3 != 0 ) { - vX = (int (__fastcall **)(unsigned int, unsigned int, int))off_X; - result = 27; - if ( *((_DWORD *)off_X + 18) != 0 ) + vX = (int (__fastcall *)(unsigned int, unsigned int, int))D49814; + vX = D49810 == nullptr; + vX = 27; + if ( D49810 != nullptr ) + vX = D49814 == 0; + if ( !vX ) { - vX = *((_DWORD *)off_X + 17); - if ( vX != 0 ) + if ( asd_link_callback_ok(a1) && asd_opt_cb_D4980C_bounded(a1) != 0 ) { - if ( sub_X(a1, a2: vX, a3) != 0 - && (vX = vX[16]) != nullptr - && ((int (__fastcall *)(unsigned int))vX)(a1) != 0 ) - { - result = vX[18](a1, a2, a3); - if ( result == 0 ) - return ((int (__fastcall *)(unsigned int, unsigned int))vX[17])(a1, a2: (16 * a2) | 0xX); - } - else - { - return 0; - } + vX = vX(a1, a2, a3); + if ( vX == 0 ) + return D49810(a1, a2: (16 * a2) | 0xX); + } + else + { + return 0; } } - return result; + return vX; } ### asd_link_notify_D49810 -int __fastcall asd_link_notify_D49810(unsigned int a1, int a2, int a3) +// Bounds a1 <= 1, fetches the runtime callback from asd_get_D49810 (status 27 if absent), +// and invokes it with (link, 0xX) when the link passes both callback gates. +int __fastcall asd_link_notify_D49810(unsigned int a1) { + D49810 = asd_get_D49810(); if ( a1 > 1 ) return 2; - vX = off_X; - if ( *((_DWORD *)off_X + 17) == 0 ) + if ( D49810 == 0 ) return 27; - if ( sub_X(a1, a2, a3) != 0 ) - { - vX = (int (__fastcall *)(unsigned int))vX[16]; - if ( vX != nullptr && vX(a1) != 0 ) - return ((int (__fastcall *)(unsigned int, int))vX[17])(a1, a2: dword_X); - } - return 0; + vX = (int (__fastcall *)(unsigned int, int))D49810; + if ( asd_link_callback_ok(a1) && asd_opt_cb_D4980C_bounded(a1) != 0 ) + return vX(a1, a2: dword_X); + else + return 0; } ### asd_link_sub_113A0 { - vX = a1; *a2 = 0; vX = 0; + if ( !asd_feature_enabled(a1: 15) ) + return 8; if ( a1 > 0x1F ) return 5; - vX = off_X; + vX = (char *)off_X; vX = (char *)off_X + 92 * a1; { - a1 = *((_DWORD *)off_X + 23 * a1 + 15); - vX = (char *)off_X + 92 * a1; + vX = *((_DWORD *)off_X + 23 * a1 + 15); + vX = (char *)off_X + 92 * vX; if ( *((_DWORD *)vX + 1) != 1 ) vX = nullptr; + vX = a1; } - vX = (char *)off_X + 92 * a1; + vX = (char *)off_X + 92 * vX; *a2 = *((_DWORD *)vX + 20); { - vX = &vX[23 * vX + 2]; - if ( *vX == 1 ) + vX = vX; + vX = &vX[92 * a1 + 8]; + if ( *(_DWORD *)vX == 1 ) { - vX = sub_X(a1: vX); + vX = asd_opt_cb_D497F4(); } { - vX = (int (__fastcall *)(char *))vX[764]; + vX = *((int (**)(void))vX + 764); if ( *vX == 5 ) { - vX = vX(a1: vX); - vX = (int (__fastcall **)(char *, int *))off_X; - if ( vX != 0 ) - goto LABEL_33; - vX = *((int (__fastcall **)(char *))off_X + 759); + if ( vX() != 0 ) + goto LABEL_34; + vX = *((int (**)(void))off_X + 759); } - vX = vX(a1: vX); + vX = ((int (__fastcall *)(char *))vX)(a1: vX); } - vX = (int (__fastcall **)(char *, int *))off_X; if ( vX == 0 ) *a5 = 1; -LABEL_33: +LABEL_34: + vX = (int (__fastcall **)(char *, _DWORD *))off_X; if ( *vX == 5 ) { - vX = (char *)&vX[23 * vX]; + vX = (char *)off_X + 92 * a1; *a3 = *((_DWORD *)vX + 22); - if ( *vX == 1 ) + if ( *(_DWORD *)vX == 1 ) { vX = *((_DWORD *)vX + 21); - goto LABEL_41; +LABEL_42: + *a4 = vX; + goto LABEL_53; } if ( vX != 0 ) - goto LABEL_54; + goto LABEL_53; vX = vX; -LABEL_41: - *a4 = vX; - goto LABEL_54; + goto LABEL_42; } result = 7; - goto LABEL_60; + goto LABEL_59; } - vX = (int (__fastcall *)(char *))vX[761]; + vX = *((int (**)(void))vX + 761); + vX = vX; if ( *vX == 5 ) { - if ( vX(a1: vX) != 0 ) - goto LABEL_14; - vX = *((int (__fastcall **)(char *))off_X + 759); + if ( vX() != 0 ) + goto LABEL_16; + vX = *((int (**)(void))off_X + 759); } - if ( vX(a1: vX) == 0 ) + if ( ((int (__fastcall *)(char *))vX)(a1: vX) == 0 ) *a5 = 1; -LABEL_14: - vX = (unsigned int *)((char *)off_X + 92 * vX + 88); +LABEL_16: vX = *vX; + vX = (unsigned int *)((char *)off_X + 92 * a1 + 88); + vX = vX; if ( *vX == 5 ) *a3 = vX; + goto LABEL_53; } - else + if ( vX == 3 ) { - if ( vX == 3 ) + vX = *a2; + if ( vX == 5 ) { - vX = *a2; - if ( vX == 5 ) - { - if ( vX == 2 ) - vX = *((int (__fastcall **)(char *))off_X + 753); - else - vX = *((int (__fastcall **)(char *))off_X + 747); - vX = vX; - } + if ( vX == 2 ) + vX = (*((int (__fastcall **)(char *))off_X + 753))(a1: vX); else - { - if ( vX == 2 ) - vX = *((int (__fastcall **)(char *))off_X + 753); - else - vX = *((int (__fastcall **)(char *))off_X + 747); - vX = vX; - } - if ( vX(a1: vX) != 0 ) - goto LABEL_54; - vX = 3; + vX = (*((int (__fastcall **)(char *))off_X + 747))(a1: vX); + } + else if ( vX == 2 ) + { + vX = (*((int (__fastcall **)(char *))off_X + 753))(a1: vX); } { - if ( vX != 2 ) - goto LABEL_54; - vX = vX == 5 ? vX : vX; - if ( (*((int (__fastcall **)(char *))off_X + 747))(a1: vX) != 0 ) - goto LABEL_54; + vX = (*((int (__fastcall **)(char *))off_X + 747))(a1: vX); + } + if ( vX == 0 ) + { + vX = 3; + goto LABEL_52; + } + } + else if ( vX == 2 ) + { + if ( vX != 5 ) + vX = vX; + if ( (*((int (__fastcall **)(char *))off_X + 747))(a1: vX) == 0 ) + { vX = 2; +LABEL_52: + *a3 = vX; } - *a3 = vX; } -LABEL_54: - if ( sub_X() != 0 ) +LABEL_53: + if ( asd_link_sub_C930() != 0 ) { result = 15; -LABEL_56: - vX = a5; +LABEL_55: *a2 = 0; *a5 = 0; - goto LABEL_61; + goto LABEL_59; } if ( *((_DWORD *)vX + 1) == 1 - && *((_DWORD *)off_X + 23 * vX + 2) == 0 + && *((_DWORD *)off_X + 23 * a1 + 2) == 0 && (*((int (__fastcall **)(char *))off_X + 770))(a1: vX) != 0 ) result = 17; - goto LABEL_56; + goto LABEL_55; } result = 0; -LABEL_60: - vX = a5; -LABEL_61: +LABEL_59: if ( *a3 != 3 ) - *vX = 0; + *a5 = 0; return result; ### asd_lookup_by_class return result; - vX = *((_DWORD *)off_X + 20); + vX = *((_DWORD *)off_X + 22); goto LABEL_10; return result; - vX = *((_DWORD *)off_X + 19); + vX = *((_DWORD *)off_X + 20); goto LABEL_10; ### asd_opt_cb_D4982C - vX = *((int (**)(void))off_X + 7); + vX = *((int (**)(void))off_X + 18); if ( vX != nullptr ) ### asd_platform_op_403 { - if ( (*off_X)[2 * i] == vX[0] && (*off_X)[2 * i + 1] == vX[1] ) + if ( *(_DWORD *)&off_X[8 * i] == vX[0] && *(_DWORD *)&off_X[8 * i + 4] == vX[1] ) return 8; { - vX = (int (__fastcall *)(unsigned __int8 *))vX[36]; + vX = (int (__fastcall *)(unsigned __int8 *))vX[41]; if ( vX != nullptr ) { - if ( 12 * *((unsigned __int16 *)vX + a1 + 30) == j ) + if ( 12 * *((unsigned __int16 *)vX + a1 + 34) == j ) return 7; ### asd_platform_op_404 } - if ( (*off_X)[2 * i] == vX[0] && (*off_X)[2 * i + 1] == vX[1] ) + if ( *(_DWORD *)&off_X[8 * i] == vX[0] && *(_DWORD *)&off_X[8 * i + 4] == vX[1] ) break; LABEL_14: - vX = a1 > 0xD; - if ( a1 <= 0xD ) + vX = a1 > 0xF; + if ( a1 <= 0xF ) vX = a2 > 7; { - for ( j = 0; *(unsigned __int16 *)&vX[2 * vX + 168] != j; ++j ) + for ( j = 0; *(unsigned __int16 *)&vX[2 * vX + 188] != j; ++j ) { - vX = *(_DWORD *)&vX[4 * vX + 144] + 8 * j; + vX = *(_DWORD *)&vX[4 * vX + 164] + 8 * j; if ( *(unsigned int **)(vX + 4) == a3 ) ### asd_program_link_by_signal if ( a1->field20 == 0 - || (vX = (int (__fastcall *)(_DWORD))vX[34]) != nullptr && vX(a1: vX) != 0 + || (vX = (int (__fastcall *)(_DWORD))vX[37]) != nullptr && vX(a1: vX) != 0 || asd_reg_read_13D24_cfg0(a1: vX, a2: (int)vX, a3: vX) != 0 ) ### asd_read_caps_blob LABEL_13: - result = asd_hdcp_version_select(a1: vX); + result = asd_query_type_6_7(a1: vX); goto LABEL_17; LABEL_16: - result = sub_X(a1: vX); + result = asd_hdcp_version_select(a1: vX); LABEL_17: ### asd_reg_read_13FD4 return 30; - vX = *((_DWORD *)off_X + 32); + vX = *((_DWORD *)off_X + 35); vX = ~a1; ### asd_reg_read_BE08 return 29; - vX = *((_DWORD *)off_X + 31); + vX = *((_DWORD *)off_X + 34); vX = ~vX; ### asd_reg_rw_19798 { - vX = *((_DWORD *)off_X + 28); + vX = *((_DWORD *)off_X + 31); vX = ~result; ### asd_reg_write_19328 { - vX = *((_DWORD *)off_X + 30); + vX = *((_DWORD *)off_X + 33); vX = ~result; ### asd_reg_write_19394 { - vX = *((_DWORD *)off_X + 29); + vX = *((_DWORD *)off_X + 32); vX = ~result; ### asd_reg_write_19524 { - vX = *((_DWORD *)off_X + 21); + vX = *((_DWORD *)off_X + 24); vX = ~result; ### asd_reg_write_19600 { - vX = *((_DWORD *)off_X + 25); + vX = *((_DWORD *)off_X + 28); vX = ~result; ### asd_reg_write_19670 { - vX = *((_DWORD *)off_X + 26); + vX = *((_DWORD *)off_X + 29); vX = ~result; ### asd_reg_write_19724 { - vX = *((_DWORD *)off_X + 27); + vX = *((_DWORD *)off_X + 30); vX = ~result; ### asd_srm_op_301 memcpy_aligned(result: (int *)off_X[0], a2: (int *)vX, a3: a2, a4: vX); - vX = off_X; *off_X = a2; - asd_srm_sub_12EC4(a1: (int)vX, a2: vX, a3: vX, a4: vX); + asd_srm_sub_12EC4(); result = 0; ### asd_srm_sub_12EC4 -int __fastcall asd_srm_sub_12EC4(int a1, int a2, _DWORD *a3, unsigned int a4) +int asd_srm_sub_12EC4() { - vX = off_X; - vX = 0; - vX = (unsigned int *)((char *)off_X + 4072); - vX = 0; - vX = *((unsigned __int8 *)off_X + 4088); - vX = 0; -LABEL_2: - vX = *vX; - vX = (unsigned int)vX + 5 * vX; - vX = (char *)(vX + 4089); - while ( vX <= 0x7F && vX != 0 ) + if ( asd_feature_enabled(a1: 15) ) { - if ( vX << 31 != 0 ) - { - if ( asd_srm_sub_13174(a1: vX, a2: vX, (unsigned int)a3, a4) != 0 ) - { - vX = (char *)&vX[vX]; - vX = *((_DWORD *)vX + 890); - vX = vX[23 * vX + 22]; - if ( vX != 0 ) - { - sub_X(a1: vX, a2: 0); - sub_X(a1: *((_DWORD *)vX + 890)); - a3 = vX; - vX = vX; - vX[vX] = *((_DWORD *)vX + 890); - vX = ++vX; - if ( (unsigned __int8)vX != vX ) - vX = -1; - } - } - --vX; - } - ++vX; - vX += 5; - vX >>= 1; - if ( vX << 27 == 0 ) - { - vX = vX + 1; - if ( (unsigned __int8)(vX + 1) != vX + 1 ) - vX = -1; - vX = vX; - vX = &vX[vX + 1018]; - goto LABEL_2; - } - } - vX = vX; - vX = 0; - vX = 0; - vX = 0; - vX = 0; - while ( vX <= 3 && vX == 0 ) - { - vX = &vX[vX + 1018]; - vX = 0; + vX = off_X; + vX = 0; + vX = (unsigned int *)((char *)off_X + 4072); + vX = 0; + vX = *((unsigned __int8 *)off_X + 4088); + vX = 0; +LABEL_3: vX = *vX; - vX = 0; - vX = *vX; - while ( vX < vX && vX == 0 ) - { - vX = *((unsigned __int8 *)vX + 4088); - vX = vX; - while ( vX != 0 ) - { - if ( vX << 31 != 0 ) - { - if ( vX[vX] == vX[vX + 890] ) - { - *((_BYTE *)vX + 4088) = --vX; - vX &= ~(1 << (vX & 0x1F)); - *vX = vX; - } - --vX; - } - vX = 1; - ++vX; - vX >>= 1; + vX = (unsigned int)vX + 5 * vX; + vX = (char *)(vX + 4089); + while ( vX <= 0x7F && vX != 0 ) + { + if ( vX << 31 != 0 ) + { + if ( asd_srm_sub_13174(a1: vX, a2: vX, a3: (unsigned int)vX, a4: vX) != 0 ) + { + vX = (char *)&vX[vX]; + vX = *((_DWORD *)vX + 890); + vX = vX[23 * vX + 22]; + if ( vX != 0 ) + { + asd_link_reset(a1: vX, a2: 0); + asd_hdcp1_disable(a1: *((_DWORD *)vX + 890)); + vX = vX; + vX = vX; + vX[vX] = *((_DWORD *)vX + 890); + vX = ++vX; + if ( (unsigned __int8)vX != vX ) + vX = -1; + } + } + --vX; + } + ++vX; + vX += 5; + vX >>= 1; + if ( vX << 27 == 0 ) + { vX = vX + 1; vX = -1; - vX = vX & 0x1F; - if ( (vX & 0x1F) != 0 ) - vX = vX; - if ( vX >= 0x80 ) - goto LABEL_34; - } + vX = vX; + vX = &vX[vX + 1018]; + goto LABEL_3; + } + } + vX = vX; + vX = 0; + vX = 0; + vX = 0; + vX = 0; + while ( vX <= 3 && vX == 0 ) + { + vX = &vX[vX + 1018]; vX = 0; -LABEL_34: - ++vX; - } - ++vX; - } - vX = *((unsigned __int8 *)vX + 3556); - vX = 0; - vX = vX[888]; - vX = 3104; - vX = 0; - while ( vX <= 0x1F && vX != 0 ) - { - if ( vX << 31 != 0 ) - { - if ( asd_srm_sub_131F8(a1: (char *)vX + vX, a2: vX, a3: vX, a4: vX) != 0 ) - { - vX = (char *)&vX[vX]; - vX = *((_DWORD *)vX + 856); - vX = vX[23 * vX + 22]; - if ( vX != 0 ) - { - sub_X(a1: vX, a2: 0); - sub_X(a1: *((_DWORD *)vX + 856), a2: vX, a3: vX, a4: vX); - vX = (unsigned int)vX; + vX = *vX; + vX = 0; + vX = *vX; + while ( vX < vX && vX == 0 ) + { + vX = *((unsigned __int8 *)vX + 4088); + vX = vX; + while ( vX != 0 ) + { + if ( vX << 31 != 0 ) + { + if ( vX[vX] == vX[vX + 890] ) + { + *((_BYTE *)vX + 4088) = --vX; + vX &= ~(1 << (vX & 0x1F)); + *vX = vX; + } + --vX; + } + vX = 1; + ++vX; + vX >>= 1; + vX = vX + 1; + if ( (unsigned __int8)(vX + 1) != vX + 1 ) + vX = -1; + vX = vX & 0x1F; + if ( (vX & 0x1F) != 0 ) + vX = vX; + if ( vX >= 0x80 ) + goto LABEL_35; + } + vX = 0; +LABEL_35: + ++vX; + } + ++vX; + } + vX = *((unsigned __int8 *)vX + 3556); + vX = 0; + vX = vX[888]; + vX = 3104; + vX = 0; + while ( vX <= 0x1F && vX != 0 ) + { + if ( vX << 31 != 0 ) + { + if ( asd_srm_sub_131F8(a1: (char *)vX + vX, a2: vX, a3: vX, a4: vX) != 0 ) + { + vX = (char *)&vX[vX]; vX = *((_DWORD *)vX + 856); - vX[vX] = vX; - vX = ++vX; - if ( (unsigned __int8)vX != vX ) - vX = -1; - } - } - --vX; - } - vX += 5; - ++vX; - vX >>= 1; - } - vX = vX[888]; - vX = 0; - vX = 0; - vX = 0; - vX = vX; - vX = 0; - while ( vX < vX && vX == 0 ) - { - vX = *((unsigned __int8 *)vX + 3556); + vX = vX[23 * vX + 22]; + if ( vX != 0 ) + { + asd_link_reset(a1: vX, a2: 0); + asd_hdcp2_disable(a1: *((_DWORD *)vX + 856)); + vX = (unsigned int)vX; + vX = *((_DWORD *)vX + 856); + vX[vX] = vX; + vX = ++vX; + if ( (unsigned __int8)vX != vX ) + vX = -1; + } + } + --vX; + } + vX += 5; + ++vX; + vX >>= 1; + } + vX = vX[888]; + vX = 0; + vX = 0; + vX = 0; vX = vX; - while ( vX != 0 ) - { - if ( vX << 31 != 0 ) - { - if ( vX[vX] == vX[vX + 856] ) - { - *((_BYTE *)vX + 3556) = --vX; - vX &= ~(1 << (vX & 0x1F)); - vX[888] = vX; - } - --vX; - } - vX = 1; - vX = vX + 1; - ++vX; - vX >>= 1; - ++vX; - if ( (unsigned __int8)vX != vX ) - vX = -1; - if ( vX >= 0x20 ) - goto LABEL_60; - } - vX = 0; -LABEL_60: - ++vX; + vX = 0; + while ( vX < vX && vX == 0 ) + { + vX = *((unsigned __int8 *)vX + 3556); + vX = vX; + while ( vX != 0 ) + { + if ( vX << 31 != 0 ) + { + if ( vX[vX] == vX[vX + 856] ) + { + *((_BYTE *)vX + 3556) = --vX; + vX &= ~(1 << (vX & 0x1F)); + vX[888] = vX; + } + --vX; + } + vX = 1; + vX = vX + 1; + ++vX; + vX >>= 1; + ++vX; + if ( (unsigned __int8)vX != vX ) + vX = -1; + if ( vX >= 0x20 ) + goto LABEL_61; + } + vX = 0; +LABEL_61: + ++vX; + } } ### asd_start_link_task { BOOL vX; // r4 } - else if ( vX[1] == 1 ) + else if ( *((_DWORD *)vX + 1) == 1 ) { __asm { SVC 0x51 ; 'Q' } - *(_BYTE *)vX = (_BYTE)off_X; + *vX = (char)off_X; if ( vX == 255 ) ### asd_svc_op_202 vX = 16; - vX = off_X + 11; + vX = dword_X + 20; vX = -1073741824; a6: vX, - a7: (int)vX, + a7: vX, a8: vX, ### asd_svc_sub_2794 { - vX = *((void (__fastcall **)(int *))off_X + 27); + vX = *((void (__fastcall **)(int *))off_X + 14); if ( vX != nullptr ) ### asd_sync_link_state - vX = *(unsigned __int8 *)off_X; + vX = (unsigned __int8)*off_X; vX = 0; ### j_asd_clear_link_outputs_12 // attributes: thunk -int __fastcall j_asd_clear_link_outputs_12(_DWORD *a1, int *a2) +int __fastcall j_asd_clear_link_outputs_12(int a1, int a2, int a3) { - - return asd_clear_link_outputs((struct asd_link_cfg *)a1, a2, a3: vX); + return asd_clear_link_outputs((struct asd_link_cfg *)a1, (_BYTE *)a2, (_BYTE *)a3); } ### j_asd_clear_link_outputs_13 // attributes: thunk -int __fastcall j_asd_clear_link_outputs_13(int a1) +int __fastcall j_asd_clear_link_outputs_13(_DWORD *a1, int *a2) { - return asd_clear_link_outputs((struct asd_link_cfg *)a1, a2: vX, a3: vX); + return asd_clear_link_outputs((struct asd_link_cfg *)a1, a2, a3: vX); } ### j_asd_clear_link_outputs_14 // attributes: thunk -int __fastcall j_asd_clear_link_outputs_14(int a1, int a2) +int __fastcall j_asd_clear_link_outputs_14(int a1) { - return asd_clear_link_outputs((struct asd_link_cfg *)a1, (_BYTE *)a2, a3: vX); + return asd_clear_link_outputs((struct asd_link_cfg *)a1, a2: vX, a3: vX); } ### j_asd_clear_link_outputs_15 // attributes: thunk -int __fastcall j_asd_clear_link_outputs_15(int a1) +int __fastcall j_asd_clear_link_outputs_15(int a1, int a2) { - return asd_clear_link_outputs((struct asd_link_cfg *)a1, a2: vX, a3: vX); + return asd_clear_link_outputs((struct asd_link_cfg *)a1, (_BYTE *)a2, a3: vX); } ### j_asd_get_link_caps_full_v2_14 // attributes: thunk -int __fastcall j_asd_get_link_caps_full_v2_14(struct asd_link_caps *a1) +int __fastcall j_asd_get_link_caps_full_v2_14(_DWORD *a1) { - return asd_get_link_caps_full_v2(a1); + return asd_get_link_caps_full_v2((struct asd_link_caps *)a1); } ### j_asd_program_link_by_signal_12 // attributes: thunk -int __fastcall j_asd_program_link_by_signal_12() +int __fastcall j_asd_program_link_by_signal_12(_DWORD *a1) { - return asd_program_link_by_signal(a1: vX, a2: vX, a3: vX, a4: vX); + return asd_program_link_by_signal((struct asd_link_cfg *)a1, a2: vX, a3: vX, a4: vX); } ### j_asd_state_not_1_cfg0_8 // attributes: thunk -int __fastcall j_asd_state_not_1_cfg0_8(int a1) +int __fastcall j_asd_state_not_1_cfg0_8(unsigned int a1) {