// // cocos2d::extension::WebSocket::init from 0x180019a70 to 0x18001a343 (2259 bytes) // // 2 xrefs: // > @ 0x18002fdf8 // > @ 0x18004ac80 // // This function is hookable on this platform! // // Using BromaIDA 8.0.0 @ https://github.com/Stazzical/BromaIDA // Using bindings at commit ba9f177b at Thu Jul 16 22:52:06 2026 from https://github.com/geode-sdk/bindings // // Hidden C++ exception states: #wind=7 _BOOL8 __fastcall cocos2d::extension::WebSocket::init(void **a1, void *a2, __int64 a3, __int64 *a4) { void **v6; // rsi unsigned __int64 v7; // r15 bool v8; // r13 void **v9; // r12 __int64 v10; // rbx unsigned __int64 v11; // rdi size_t v12; // r14 char *v13; // r9 __int64 v14; // rcx unsigned __int8 v15; // al int v16; // eax int v17; // r9d void **v18; // rcx void **v19; // rsi __int64 v20; // rbx char *v21; // r9 __int64 v22; // rcx unsigned __int8 v23; // al int v24; // eax int v25; // r9d void **v26; // rcx void **v27; // rsi _BYTE *v28; // rbx int v30; // ebx unsigned __int64 v31; // rcx void **v32; // rdx const char *v33; // rcx int v34; // r13d char *v35; // rcx unsigned __int64 v36; // rcx void **v37; // rbx _BYTE *v38; // rcx int v40; // ecx unsigned __int64 v41; // rcx void **v42; // rdx __int64 v43; // r8 char **v44; // r9 char *v45; // rdi unsigned __int64 v46; // r14 size_t v47; // rcx size_t v48; // rsi void **v49; // rbx char *v50; // rbx char *v51; // rax void **v52; // rbx _BYTE *v53; // rax int v55; // eax __int64 v56; // r9 unsigned __int64 v57; // rax void **v58; // rcx void **v59; // r14 void **v60; // rdx void **v61; // rdx __int64 *v62; // r15 __int64 v63; // rax unsigned __int64 v64; // rbx void *v65; // rax __int64 v66; // rbx __int64 v67; // rdi _BYTE *v68; // rax _BYTE *v69; // r8 char *v70; // rcx __int64 v71; // rdx char v72; // al char *v73; // rax __int64 *v74; // rdi _QWORD *v75; // rbx _QWORD *v76; // rax void **v77; // rbx _QWORD *v78; // rax __int64 v79; // rdx __int64 v80; // rcx __int64 v81; // rax cocos2d::CCScheduler *v82; // rax bool v83; // bl void *v84; // rcx void *v85; // rcx unsigned __int8 v87; // [rsp+30h] [rbp-69h] __int64 *v88; // [rsp+38h] [rbp-61h] BYREF void **v89; // [rsp+40h] [rbp-59h] void *Buf[2]; // [rsp+50h] [rbp-49h] BYREF size_t v91; // [rsp+60h] [rbp-39h] unsigned __int64 v92; // [rsp+68h] [rbp-31h] void *Block[2]; // [rsp+70h] [rbp-29h] BYREF size_t v94; // [rsp+80h] [rbp-19h] unsigned __int64 v95; // [rsp+88h] [rbp-11h] char *String[2]; // [rsp+90h] [rbp-9h] BYREF size_t Size; // [rsp+A0h] [rbp+7h] unsigned __int64 v98; // [rsp+A8h] [rbp+Fh] v88 = a4; v89 = a1; v87 = 0; sub_180003F50((__int64)Buf, a3); a1[14] = a2; v6 = Buf; v7 = v92; v8 = v92 > 0xF; v9 = (void **)Buf[0]; if ( v92 > 0xF ) v6 = (void **)Buf[0]; v10 = 5; v11 = v91; if ( v91 >= 5 && (v12 = (size_t)v6 + v91, (v13 = (char *)memchr(v6, 119, v91 - 4)) != nullptr) ) { while ( 1 ) { v14 = 0; while ( 1 ) { v15 = v13[v14++]; if ( v15 != aWs[v14 - 1] ) break; if ( v14 == 5 ) { v16 = 0; goto LABEL_10; } } v16 = v15 < (unsigned __int8)aWs[v14 - 1] ? -1 : 1; LABEL_10: if ( !v16 ) break; v13 = (char *)memchr(v13 + 1, 119, v12 - 4 - (_QWORD)(v13 + 1)); if ( !v13 ) goto LABEL_12; } v17 = (_DWORD)v13 - (_DWORD)v6; } else { LABEL_12: v17 = -1; } if ( !v17 ) { if ( v11 < 5 ) v10 = v11; v18 = Buf; if ( v8 ) v18 = v9; v11 -= v10; memmove(v18, (char *)v18 + v10, v11 + 1); v91 = v11; v7 = v92; v9 = (void **)Buf[0]; } v19 = Buf; if ( v7 > 0xF ) v19 = v9; v20 = 6; if ( v11 >= 6 && (v21 = (char *)memchr(v19, 119, v11 - 5)) != nullptr ) { while ( 1 ) { v22 = 0; while ( 1 ) { v23 = v21[v22++]; if ( v23 != aWss[v22 - 1] ) break; if ( v22 == 6 ) { v24 = 0; goto LABEL_29; } } v24 = v23 < (unsigned __int8)aWss[v22 - 1] ? -1 : 1; LABEL_29: if ( !v24 ) break; v21 = (char *)memchr(v21 + 1, 119, (char *)v19 + v11 - 5 - (v21 + 1)); if ( !v21 ) goto LABEL_31; } v25 = (_DWORD)v21 - (_DWORD)v19; } else { LABEL_31: v25 = -1; } if ( !v25 ) { if ( v11 < 6 ) v20 = v11; v26 = Buf; if ( v7 > 0xF ) v26 = v9; v11 -= v20; memmove(v26, (char *)v26 + v20, v11 + 1); v91 = v11; v87 = 1; v7 = v92; v9 = (void **)Buf[0]; } v27 = Buf; if ( v7 > 0xF ) v27 = v9; if ( v11 ) { v28 = memchr(v27, 58, v11); if ( v28 ) { while ( *v28 == 58 ? 0 : *v28 < 0x3Au ? -1 : 1 ) { v28 = memchr(v28 + 1, 58, (char *)v27 + v11 - (v28 + 1)); if ( !v28 ) goto LABEL_48; } v30 = (_DWORD)v28 - (_DWORD)v27; } else { LABEL_48: v30 = -1; } } else { v30 = -1; } if ( v30 < 0 ) { v34 = 80; } else { v31 = v30 + 1; *(_OWORD *)String = 0; Size = 0; v98 = 0; if ( v11 < v31 ) sub_18001ABF0(); v32 = Buf; if ( v7 > 0xF ) v32 = v9; sub_180003AB0(String, (char *)v32 + v31, v11 - v31); v33 = (const char *)String; if ( v98 > 0xF ) v33 = String[0]; v34 = atoi(v33); if ( v98 > 0xF ) { v35 = String[0]; if ( v98 + 1 >= 0x1000 ) { v35 = *((char **)String[0] - 1); if ( (unsigned __int64)(String[0] - v35 - 8) > 0x1F ) invalid_parameter_noinfo_noreturn(); } j_j_free(v35); } v7 = v92; v11 = v91; v9 = (void **)Buf[0]; } v36 = v30; v37 = Buf; if ( v7 > 0xF ) v37 = v9; if ( v11 && v36 <= v11 - 1 && (v38 = memchr((char *)v37 + v36, 47, v11 - v36)) != nullptr ) { while ( *v38 == 47 ? 0 : *v38 < 0x2Fu ? -1 : 1 ) { v38 = memchr(v38 + 1, 47, (char *)v37 + v11 - (v38 + 1)); if ( !v38 ) goto LABEL_74; } v40 = (_DWORD)v38 - (_DWORD)v37; } else { LABEL_74: v40 = -1; } *(_OWORD *)Block = 0; v94 = 1; v95 = 15; LOWORD(Block[0]) = 47; if ( v40 >= 0 ) { v41 = v40 + 1; *(_OWORD *)String = 0; Size = 0; v98 = 0; if ( v11 < v41 ) goto LABEL_141; v42 = Buf; if ( v7 > 0xF ) v42 = v9; sub_180003AB0(String, (char *)v42 + v41, v11 - v41); v44 = String; v45 = String[0]; v46 = v98; if ( v98 > 0xF ) v44 = (char **)String[0]; v47 = v94; v48 = Size; if ( Size > v95 - v94 ) { sub_180003810(Block, Size, v43, v44, Size); v46 = v98; v45 = String[0]; } else { v94 += Size; v49 = Block; if ( v95 > 0xF ) v49 = (void **)Block[0]; v50 = (char *)v49 + v47; memmove(v50, v44, Size); v50[v48] = 0; } if ( v46 > 0xF ) { v51 = v45; if ( v46 + 1 >= 0x1000 ) { v45 = *((char **)v45 - 1); if ( (unsigned __int64)(v51 - v45 - 8) > 0x1F ) invalid_parameter_noinfo_noreturn(); } j_j_free(v45); } v9 = (void **)Buf[0]; v11 = v91; v7 = v92; } v52 = Buf; if ( v7 > 0xF ) v52 = v9; if ( v11 && (v53 = memchr(v52, 58, v11)) != nullptr ) { while ( *v53 == 58 ? 0 : *v53 < 0x3Au ? -1 : 1 ) { v53 = memchr(v53 + 1, 58, (char *)v52 + v11 - (v53 + 1)); if ( !v53 ) goto LABEL_102; } v55 = (_DWORD)v53 - (_DWORD)v52; } else { LABEL_102: v55 = -1; } if ( v55 >= 0 ) { v56 = v55; if ( v11 >= v55 ) { v57 = v11 - v55; v58 = Buf; if ( v7 > 0xF ) v58 = v9; v11 -= v57; memmove((char *)v58 + v56, (char *)v58 + v56 + v57, v11 - v56 + 1); v91 = v11; v7 = v92; v9 = (void **)Buf[0]; goto LABEL_108; } LABEL_141: sub_18001ABF0(); } LABEL_108: v59 = v89; if ( v89 + 2 != Buf ) { v60 = Buf; if ( v7 > 0xF ) v60 = v9; sub_180003BC0(v89 + 2, v60, v11); } *((_DWORD *)v59 + 12) = v34; if ( v59 + 7 != Block ) { v61 = Block; if ( v95 > 0xF ) v61 = (void **)Block[0]; sub_180003BC0(v59 + 7, v61, v94); } *((_DWORD *)v59 + 30) = v87; v62 = v88; if ( !v88 || (v63 = (v88[1] - *v88) >> 5) == 0 ) LODWORD(v63) = 1; v64 = (int)v63 + 1; v65 = operator new(saturated_mul(v64, 0x38u)); v59[16] = v65; memset(v65, 0, 56 * v64); if ( v62 ) { v66 = *v62; if ( *v62 != v62[1] ) { v67 = 0; do { v68 = operator new(*(_QWORD *)(v66 + 16) + 1LL); v69 = v68; v70 = (char *)v66; if ( *(_QWORD *)(v66 + 24) > 0xFu ) v70 = *(char **)v66; v71 = v68 - v70; do { v72 = *v70; v70[v71] = *v70; ++v70; } while ( v72 ); *(_QWORD *)((char *)v59[16] + v67) = v69; *(_QWORD *)((char *)v59[16] + v67 + 8) = sub_180019520; v66 += 32; v67 += 56; } while ( v66 != v62[1] ); } } else { v73 = (char *)operator new(0x14u); strcpy(v73, "default-protocol"); *(_QWORD *)v59[16] = v73; *((_QWORD *)v59[16] + 1) = sub_180019520; } v74 = (__int64 *)operator new(0x78u); v88 = v74; cocos2d::CCObject::CCObject((cocos2d::CCObject *)v74); *v74 = (__int64)&cocos2d::extension::WsThreadHelper::`vftable'; v74[13] = 0; *((_BYTE *)v74 + 112) = 0; v75 = operator new(0x10u); HIDWORD(v89) = HIDWORD(v75); *v75 = 0; v75[1] = 0; v76 = operator new(0x18u); *v76 = v76; v76[1] = v76; *v75 = v76; v74[7] = (__int64)v75; pthread_mutex_init(v74 + 9, 0); v77 = (void **)operator new(0x10u); v89 = v77; *v77 = nullptr; v77[1] = nullptr; v78 = operator new(0x18u); *v78 = v78; v78[1] = v78; *v77 = v78; v74[8] = (__int64)v77; pthread_mutex_init(v74 + 10, 0); v81 = cocos2d::CCDirector::sharedDirector(v80, v79); v82 = (cocos2d::CCScheduler *)(*(__int64 (__fastcall **)(__int64))(*(_QWORD *)v81 + 112LL))(v81); cocos2d::CCScheduler::scheduleUpdateForTarget(v82, (struct cocos2d::CCObject *)v74, 0, 0); v59[11] = v74; v74[13] = (__int64)v59; pthread_attr_init(&v88); v83 = (unsigned int)pthread_create(v74 + 11, &v88, sub_180019690, v74) == 0; if ( v95 > 0xF ) { v84 = Block[0]; if ( v95 + 1 >= 0x1000 ) { v84 = *((void **)Block[0] - 1); if ( (unsigned __int64)((char *)Block[0] - (char *)v84 - 8) > 0x1F ) invalid_parameter_noinfo_noreturn(); } j_j_free(v84); } v94 = 0; v95 = 15; LOBYTE(Block[0]) = 0; if ( v92 > 0xF ) { v85 = Buf[0]; if ( v92 + 1 >= 0x1000 ) { v85 = *((void **)Buf[0] - 1); if ( (unsigned __int64)((char *)Buf[0] - (char *)v85 - 8) > 0x1F ) invalid_parameter_noinfo_noreturn(); } j_j_free(v85); } return v83; }