{"type": "func", "start": 6443305552, "end": 6443305815, "name": "FMOD::ChannelI::validate", "pseudocode": "// \n// FMOD::ChannelI::validate from 0x1800d0a50 to 0x1800d0b57 (263 bytes)\n// \n// 22 xrefs:\n// > sub_180012360 @ 0x180012363\n// > FMOD::Channel::getChannelGroup @ 0x18009fb43\n// > FMOD::Channel::getCurrentSound @ 0x18009fc1d\n// > FMOD::Channel::getFrequency @ 0x18009fd02\n// > FMOD::Channel::getIndex @ 0x18009fddd\n// > FMOD::Channel::getLoopCount @ 0x18009fec2\n// > FMOD::Channel::getLoopPoints @ 0x18009ffbd\n// > FMOD::Channel::getPosition @ 0x1800a018a\n// > FMOD::Channel::getPriority @ 0x1800a02c2\n// > FMOD::Channel::isVirtual @ 0x1800a03a5\n// > FMOD::Channel::setChannelGroup @ 0x1800a047d\n// > FMOD::Channel::setFrequency @ 0x1800a0550\n// > FMOD::Channel::setLoopCount @ 0x1800a062c\n// > FMOD::Channel::setLoopPoints @ 0x1800a070f\n// > FMOD::Channel::setPosition @ 0x1800a08d4\n// > FMOD::Channel::setPriority @ 0x1800a09fc\n// > sub_1800D10B0 @ 0x1800d10e1\n// > sub_1800D1500 @ 0x1800d1525\n// > <???> @ 0x18018b618\n// > <???> @ 0x18018b628\n// > <???> @ 0x180194348\n// > <???> @ 0x1801fea84\n// \n// This function is hookable on this platform!\n// \n// Using BromaIDA 8.0.0 @ https://github.com/Stazzical/BromaIDA\n// Using bindings at commit ba9f177b at Thu Jul 16 22:52:06 2026 from https://github.com/geode-sdk/bindings\n// \n\n__int64 __fastcall FMOD::ChannelI::validate(unsigned int a1, __int64 *a2, _QWORD *a3)\n{\n  int v4; // edi\n  __int64 v5; // rbp\n  __int64 result; // rax\n  __int64 v9; // rbx\n  __int64 v10; // rdx\n  unsigned __int64 v11; // rcx\n  __int64 v12; // [rsp+40h] [rbp+8h] BYREF\n\n  v4 = (a1 >> 17) & 0xFFF;\n  v5 = (unsigned __int16)(a1 >> 1);\n  if ( !a2 )\n    return 31;\n  *a2 = 0;\n  if ( (unsigned __int16)(a1 >> 1) && !(unsigned int)sub_1800E43E0(a1 >> 29, &v12) )\n  {\n    v9 = v12;\n    if ( !*(_QWORD *)(v12 + 488) )\n      return 67;\n    if ( v4 < *(_DWORD *)(v12 + 480) )\n    {\n      if ( a3 )\n      {\n        if ( *a3 )\n          return 28;\n        result = sub_1801021E0(v12);\n        if ( (_DWORD)result )\n          return result;\n        *a3 = v9;\n        v9 = v12;\n      }\n      v10 = *(_QWORD *)(v9 + 488) + 560LL * (unsigned int)v4;\n      if ( (_DWORD)v5 == 0xFFFF || (v11 = *(_QWORD *)(v10 + 80), v11 == a1) )\n      {\n        *a2 = v10;\n        return 0;\n      }\n      if ( (unsigned __int64)(unsigned __int16)(v11 >> 1) - v5 >= 2 )\n        return 3;\n    }\n  }\n  return 30;\n}", "assembly": "; \n; FMOD::ChannelI::validate from 0x1800d0a50 to 0x1800d0b57 (263 bytes)\n; \n; 22 xrefs:\n; > sub_180012360 @ 0x180012363\n; > FMOD::Channel::getChannelGroup @ 0x18009fb43\n; > FMOD::Channel::getCurrentSound @ 0x18009fc1d\n; > FMOD::Channel::getFrequency @ 0x18009fd02\n; > FMOD::Channel::getIndex @ 0x18009fddd\n; > FMOD::Channel::getLoopCount @ 0x18009fec2\n; > FMOD::Channel::getLoopPoints @ 0x18009ffbd\n; > FMOD::Channel::getPosition @ 0x1800a018a\n; > FMOD::Channel::getPriority @ 0x1800a02c2\n; > FMOD::Channel::isVirtual @ 0x1800a03a5\n; > FMOD::Channel::setChannelGroup @ 0x1800a047d\n; > FMOD::Channel::setFrequency @ 0x1800a0550\n; > FMOD::Channel::setLoopCount @ 0x1800a062c\n; > FMOD::Channel::setLoopPoints @ 0x1800a070f\n; > FMOD::Channel::setPosition @ 0x1800a08d4\n; > FMOD::Channel::setPriority @ 0x1800a09fc\n; > sub_1800D10B0 @ 0x1800d10e1\n; > sub_1800D1500 @ 0x1800d1525\n; > <???> @ 0x18018b618\n; > <???> @ 0x18018b628\n; > <???> @ 0x180194348\n; > <???> @ 0x1801fea84\n; \n; This function is hookable on this platform!\n; \n; Using BromaIDA 8.0.0 @ https:;github.com/Stazzical/BromaIDA\n; Using bindings at commit ba9f177b at Thu Jul 16 22:52:06 2026 from https:;github.com/geode-sdk/bindings\n; \n\nmov     [rsp+arg_10], rbp                                              ; +0x0, 0x1800d0a50\nmov     [rsp+arg_18], rsi                                              ; +0x5, 0x1800d0a55\npush    rdi                                                            ; +0xa, 0x1800d0a5a\npush    r14                                                            ; +0xb, 0x1800d0a5b\npush    r15                                                            ; +0xd, 0x1800d0a5d\nsub     rsp, 20h                                                       ; +0xf, 0x1800d0a5f\nmov     edi, ecx                                                       ; +0x13, 0x1800d0a63\nmov     eax, ecx                                                       ; +0x15, 0x1800d0a65\nshr     edi, 11h                                                       ; +0x17, 0x1800d0a67\nmov     rsi, r8                                                        ; +0x1a, 0x1800d0a6a\nshr     eax, 1                                                         ; +0x1d, 0x1800d0a6d\nand     edi, 0FFFh                                                     ; +0x1f, 0x1800d0a6f\nmovzx   ebp, ax                                                        ; +0x25, 0x1800d0a75\nmov     r14, rdx                                                       ; +0x28, 0x1800d0a78\nmov     r15, rcx                                                       ; +0x2b, 0x1800d0a7b\ntest    rdx, rdx                                                       ; +0x2e, 0x1800d0a7e\njnz     short loc_1800D0A8B                                            ; +0x31, 0x1800d0a81\nlea     eax, [rdx+1Fh]                                                 ; +0x33, 0x1800d0a83\njmp     loc_1800D0B43                                                  ; +0x36, 0x1800d0a86\nmov     [rsp+38h+arg_8], rbx                                           ; +0x3b, 0x1800d0a8b\nmov     qword ptr [rdx], 0                                             ; +0x40, 0x1800d0a90\ntest    ebp, ebp                                                       ; +0x47, 0x1800d0a97\njz      loc_1800D0B39                                                  ; +0x49, 0x1800d0a99\nshr     ecx, 1Dh                                                       ; +0x4f, 0x1800d0a9f\nlea     rdx, [rsp+38h+arg_0]                                           ; +0x52, 0x1800d0aa2\ncall    sub_1800E43E0                                                  ; +0x57, 0x1800d0aa7\ntest    eax, eax                                                       ; +0x5c, 0x1800d0aac\njnz     loc_1800D0B39                                                  ; +0x5e, 0x1800d0aae\nmov     rbx, [rsp+38h+arg_0]                                           ; +0x64, 0x1800d0ab4\ncmp     qword ptr [rbx+1E8h], 0                                        ; +0x69, 0x1800d0ab9\njnz     short loc_1800D0ACA                                            ; +0x71, 0x1800d0ac1\nmov     eax, 43h ; 'C'                                                 ; +0x73, 0x1800d0ac3\njmp     short loc_1800D0B3E                                            ; +0x78, 0x1800d0ac8\ncmp     edi, [rbx+1E0h]                                                ; +0x7a, 0x1800d0aca\njge     short loc_1800D0B39                                            ; +0x80, 0x1800d0ad0\ntest    rsi, rsi                                                       ; +0x82, 0x1800d0ad2\njz      short loc_1800D0AF1                                            ; +0x85, 0x1800d0ad5\ncmp     qword ptr [rsi], 0                                             ; +0x87, 0x1800d0ad7\njnz     short loc_1800D0B2B                                            ; +0x8b, 0x1800d0adb\nmov     rcx, rbx                                                       ; +0x8d, 0x1800d0add\ncall    sub_1801021E0                                                  ; +0x90, 0x1800d0ae0\ntest    eax, eax                                                       ; +0x95, 0x1800d0ae5\njnz     short loc_1800D0B3E                                            ; +0x97, 0x1800d0ae7\nmov     [rsi], rbx                                                     ; +0x99, 0x1800d0ae9\nmov     rbx, [rsp+38h+arg_0]                                           ; +0x9c, 0x1800d0aec\nmov     eax, edi                                                       ; +0xa1, 0x1800d0af1\nimul    rdx, rax, 230h                                                 ; +0xa3, 0x1800d0af3\nadd     rdx, [rbx+1E8h]                                                ; +0xaa, 0x1800d0afa\ncmp     ebp, 0FFFFh                                                    ; +0xb1, 0x1800d0b01\njz      short loc_1800D0B32                                            ; +0xb7, 0x1800d0b07\nmov     rcx, [rdx+50h]                                                 ; +0xb9, 0x1800d0b09\nmov     eax, r15d                                                      ; +0xbd, 0x1800d0b0d\ncmp     rcx, rax                                                       ; +0xc0, 0x1800d0b10\njz      short loc_1800D0B32                                            ; +0xc3, 0x1800d0b13\nshr     rcx, 1                                                         ; +0xc5, 0x1800d0b15\nmovzx   ecx, cx                                                        ; +0xc8, 0x1800d0b18\nsub     rcx, rbp                                                       ; +0xcb, 0x1800d0b1b\ncmp     rcx, 2                                                         ; +0xce, 0x1800d0b1e\njb      short loc_1800D0B39                                            ; +0xd2, 0x1800d0b22\nmov     eax, 3                                                         ; +0xd4, 0x1800d0b24\njmp     short loc_1800D0B3E                                            ; +0xd9, 0x1800d0b29\nmov     eax, 1Ch                                                       ; +0xdb, 0x1800d0b2b\njmp     short loc_1800D0B3E                                            ; +0xe0, 0x1800d0b30\nmov     [r14], rdx                                                     ; +0xe2, 0x1800d0b32\nxor     eax, eax                                                       ; +0xe5, 0x1800d0b35\njmp     short loc_1800D0B3E                                            ; +0xe7, 0x1800d0b37\nmov     eax, 1Eh                                                       ; +0xe9, 0x1800d0b39\nmov     rbx, [rsp+38h+arg_8]                                           ; +0xee, 0x1800d0b3e\nmov     rbp, [rsp+38h+arg_10]                                          ; +0xf3, 0x1800d0b43\nmov     rsi, [rsp+38h+arg_18]                                          ; +0xf8, 0x1800d0b48\nadd     rsp, 20h                                                       ; +0xfd, 0x1800d0b4d\npop     r15                                                            ; +0x101, 0x1800d0b51\npop     r14                                                            ; +0x103, 0x1800d0b53\npop     rdi                                                            ; +0x105, 0x1800d0b55\nretn                                                                   ; +0x106, 0x1800d0b56", "xrefs": ["sub_180012360 @ 0x180012363", "FMOD::Channel::getChannelGroup @ 0x18009fb43", "FMOD::Channel::getCurrentSound @ 0x18009fc1d", "FMOD::Channel::getFrequency @ 0x18009fd02", "FMOD::Channel::getIndex @ 0x18009fddd", "FMOD::Channel::getLoopCount @ 0x18009fec2", "FMOD::Channel::getLoopPoints @ 0x18009ffbd", "FMOD::Channel::getPosition @ 0x1800a018a", "FMOD::Channel::getPriority @ 0x1800a02c2", "FMOD::Channel::isVirtual @ 0x1800a03a5", "FMOD::Channel::setChannelGroup @ 0x1800a047d", "FMOD::Channel::setFrequency @ 0x1800a0550", "FMOD::Channel::setLoopCount @ 0x1800a062c", "FMOD::Channel::setLoopPoints @ 0x1800a070f", "FMOD::Channel::setPosition @ 0x1800a08d4", "FMOD::Channel::setPriority @ 0x1800a09fc", "sub_1800D10B0 @ 0x1800d10e1", "sub_1800D1500 @ 0x1800d1525", "<???> @ 0x18018b618", "<???> @ 0x18018b628", "<???> @ 0x180194348", "<???> @ 0x1801fea84"], "is_objc": false, "is_arm32": false, "is_arm64": false, "bida_info": "8.0.0 @ https://github.com/Stazzical/BromaIDA", "bindings_info": "commit ba9f177b at Thu Jul 16 22:52:06 2026 from https://github.com/geode-sdk/bindings"}