// // cocos2d::extension::WebSocket::onSocketCallback from 0x18001a7b0 to 0x18001ab3d (909 bytes) // // 5 xrefs: // > sub_180019520 @ 0x18001956e // > @ 0x18002f62c // > @ 0x18002f660 // > @ 0x18002fdf8 // > @ 0x18004ad04 // // 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 // __int64 __fastcall cocos2d::extension::WebSocket::onSocketCallback( __int64 a1, __int64 a2, int a3, __int64 a4, void *Src, size_t Size) { _QWORD *v8; // rdx _QWORD *v9; // rbx __int64 v10; // rdx _QWORD **v11; // rax _QWORD *v12; // rbx _QWORD *v13; // r15 __int64 v14; // r14 char *v15; // r13 _QWORD *v16; // rdi _QWORD **v17; // rcx _QWORD *v18; // rcx _QWORD *v19; // rbx _QWORD *v20; // r15 _DWORD *v21; // rdi _BYTE *v22; // r14 char v23; // al switch ( a3 ) { case 1: case 28: case 33: if ( a3 == 1 ) goto LABEL_9; if ( a3 != 28 ) { if ( a3 != 33 || *(_DWORD *)(a1 + 8) ) return 0; LABEL_9: v8 = operator new(0x10u); v8[1] = 0; *(_DWORD *)v8 = 4; *(_DWORD *)(a1 + 8) = 2; goto LABEL_28; } if ( !*(_DWORD *)(a1 + 8) ) goto LABEL_9; if ( *(_DWORD *)(a1 + 8) == 2 ) { v8 = operator new(0x10u); v8[1] = 0; *(_DWORD *)v8 = 5; goto LABEL_28; } return 0; case 3: v9 = operator new(0x10u); v9[1] = 0; *(_DWORD *)v9 = 2; *(_DWORD *)(a1 + 8) = 1; lws_callback_on_writable(a2); v8 = v9; goto LABEL_28; case 4: *(_BYTE *)(*(_QWORD *)(a1 + 88) + 112LL) = 1; if ( *(_DWORD *)(a1 + 8) == 3 ) return 0; v8 = operator new(0x10u); v8[1] = 0; *(_DWORD *)(a1 + 8) = 3; *(_DWORD *)v8 = 5; goto LABEL_28; case 8: if ( !Src || !Size ) return 0; v20 = operator new(0x10u); v20[1] = 0; *(_DWORD *)v20 = 3; v21 = operator new(0x10u); *(_QWORD *)v21 = 0; v21[2] = 0; *((_BYTE *)v21 + 12) = 0; if ( (unsigned int)lws_frame_is_binary(a2) ) { v22 = operator new(Size); v23 = 1; } else { v22 = operator new(Size + 1); v22[Size] = 0; v23 = 0; } *((_BYTE *)v21 + 12) = v23; memcpy(v22, Src, Size); *(_QWORD *)v21 = v22; v8 = v20; v21[2] = Size; v20[1] = v21; LABEL_28: sub_1800196E0(*(_QWORD *)(a1 + 88), (__int64)v8); return 0; case 10: pthread_mutex_lock(*(_QWORD *)(a1 + 88) + 80LL); v10 = *(_QWORD *)(a1 + 88); v11 = *(_QWORD ***)(v10 + 64); v12 = (_QWORD *)**v11; if ( v12 != *v11 ) { do { v13 = (_QWORD *)v12[2]; if ( *(_DWORD *)v13 <= 1u ) { v14 = v13[1]; v15 = (char *)operator new(*(_DWORD *)(v14 + 8) + 16); memset(v15 + 16, 0, *(int *)(v14 + 8)); memcpy(v15 + 16, *(const void **)v14, *(int *)(v14 + 8)); lws_write(a2, v15 + 16, *(int *)(v14 + 8), *(_DWORD *)v13 != 0); if ( *(_QWORD *)v14 ) { j_j_free(*(void **)v14); *(_QWORD *)v14 = 0; } j_j_free((void *)v14); j_j_free(v15); } j_j_free(v13); v10 = *(_QWORD *)(a1 + 88); v12 = (_QWORD *)*v12; } while ( v12 != **(_QWORD ***)(v10 + 64) ); } v16 = *(_QWORD **)(v10 + 64); v17 = (_QWORD **)*v16; **(_QWORD **)(*v16 + 8LL) = 0; v18 = *v17; if ( v18 ) { do { v19 = (_QWORD *)*v18; j_j_free(v18); v18 = v19; } while ( v19 ); } *(_QWORD *)*v16 = *v16; *(_QWORD *)(*v16 + 8LL) = *v16; v16[1] = 0; pthread_mutex_unlock(*(_QWORD *)(a1 + 88) + 80LL); lws_callback_on_writable(a2); return 0; default: return 0; } }