{"type": "func", "start": 945772, "end": 946076, "name": "FMOD_OS_Thread_Create", "pseudocode": "// \n// FMOD_OS_Thread_Create from 0xe6e6c to 0xe6f9c (304 bytes)\n// \n// 4 xrefs:\n// > .FMOD_OS_Thread_Create @ 0x109b0c\n// > <???> @ 0x16a8\n// > .FMOD_OS_Thread_Create @ 0x109b04\n// > <???> @ 0x111648\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_OS_Thread_Create(char *a1, __int64 a2, __int64 a3, __int64 a4, int a5, int a6, pthread_t *a7)\n{\n  __int64 result; // x0\n  __int64 v15; // x8\n  __int64 v16; // x2\n  _QWORD *v17; // x0\n  void *v18; // x24\n  pthread_attr_t attr; // [xsp+8h] [xbp-78h] BYREF\n  pthread_t newthread; // [xsp+48h] [xbp-38h] BYREF\n\n  if ( !pthread_attr_init(&attr) && !pthread_attr_setdetachstate(&attr, 1) )\n  {\n    if ( (unsigned int)(a5 + 32775) <= 5 )\n      a5 = *((_DWORD *)&unk_4E7EC + a5 + 32775);\n    if ( (unsigned __int64)(a4 - 0x4000000000000001LL) < 3 )\n      a4 = 0;\n    if ( !pthread_attr_setstacksize(&attr, (unsigned int)(a6 + 0x8000)) )\n    {\n      sub_E7334();\n      v17 = sub_E2AC4(*(_QWORD *)(*(_QWORD *)v15 + 432LL), 288, v16, 483, 0);\n      if ( !v17 )\n        return 38;\n      v18 = v17;\n      *((_DWORD *)v17 + 2) = a5;\n      v17[35] = a4;\n      *v17 = a2;\n      v17[2] = a3;\n      sub_E3C94((_BYTE *)v17 + 24, a1, 256);\n      if ( !pthread_create(&newthread, &attr, (void *(*)(void *))sub_E6D38, v18) )\n      {\n        result = pthread_attr_destroy(&attr);\n        if ( !(_DWORD)result )\n        {\n          *a7 = newthread;\n          return result;\n        }\n      }\n    }\n  }\n  return 28;\n}", "assembly": "; \n; FMOD_OS_Thread_Create from 0xe6e6c to 0xe6f9c (304 bytes)\n; \n; 4 xrefs:\n; > .FMOD_OS_Thread_Create @ 0x109b0c\n; > <???> @ 0x16a8\n; > .FMOD_OS_Thread_Create @ 0x109b04\n; > <???> @ 0x111648\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\nSUB             SP, SP, #0x90                                          ; +0x0, 0xe6e6c\nSTP             X20, X19, [SP,#0x80+var_10]                            ; +0x4, 0xe6e70\nMOV             X20, X0                                                ; +0x8, 0xe6e74\nADD             X0, SP, #0x80+attr; attr                               ; +0xc, 0xe6e78\nSTR             X25, [SP,#0x80+var_40]                                 ; +0x10, 0xe6e7c\nSTP             X24, X23, [SP,#0x80+var_30]                            ; +0x14, 0xe6e80\nSTP             X22, X21, [SP,#0x80+var_20]                            ; +0x18, 0xe6e84\nSTP             X29, X30, [SP,#0x80+var_s0]                            ; +0x1c, 0xe6e88\nADD             X29, SP, #0x80                                         ; +0x20, 0xe6e8c\nMOV             X19, X6                                                ; +0x24, 0xe6e90\nMOV             W24, W5                                                ; +0x28, 0xe6e94\nMOV             W23, W4                                                ; +0x2c, 0xe6e98\nMOV             X25, X3                                                ; +0x30, 0xe6e9c\nMOV             X21, X2                                                ; +0x34, 0xe6ea0\nMOV             X22, X1                                                ; +0x38, 0xe6ea4\nBL              .pthread_attr_init                                     ; +0x3c, 0xe6ea8\nCBNZ            W0, loc_E6EFC                                          ; +0x40, 0xe6eac\nADD             X0, SP, #0x80+attr; attr                               ; +0x44, 0xe6eb0\nMOV             W1, #1; detachstate                                    ; +0x48, 0xe6eb4\nBL              .pthread_attr_setdetachstate                           ; +0x4c, 0xe6eb8\nCBNZ            W0, loc_E6EFC                                          ; +0x50, 0xe6ebc\nMOV             W8, #0x8007                                            ; +0x54, 0xe6ec0\nADD             W8, W23, W8                                            ; +0x58, 0xe6ec4\nCMP             W8, #5                                                 ; +0x5c, 0xe6ec8\nB.HI            loc_E6EDC                                              ; +0x60, 0xe6ecc\nADRL            X9, unk_4E7EC                                          ; +0x64, 0xe6ed0\nLDR             W23, [X9,W8,SXTW#2]                                    ; +0x6c, 0xe6ed8\nMOV             X8, #0xBFFFFFFFFFFFFFFF                                ; +0x70, 0xe6edc\nADD             X8, X25, X8                                            ; +0x74, 0xe6ee0\nCMP             X8, #3                                                 ; +0x78, 0xe6ee4\nADD             W1, W24, #8,LSL#12; stacksize                          ; +0x7c, 0xe6ee8\nADD             X0, SP, #0x80+attr; attr                               ; +0x80, 0xe6eec\nCSEL            X25, XZR, X25, CC                                      ; +0x84, 0xe6ef0\nBL              .pthread_attr_setstacksize                             ; +0x88, 0xe6ef4\nCBZ             W0, loc_E6F1C                                          ; +0x8c, 0xe6ef8\nMOV             W0, #0x1C                                              ; +0x90, 0xe6efc\nLDP             X29, X30, [SP,#0x80+var_s0]                            ; +0x94, 0xe6f00\nLDP             X20, X19, [SP,#0x80+var_10]                            ; +0x98, 0xe6f04\nLDP             X22, X21, [SP,#0x80+var_20]                            ; +0x9c, 0xe6f08\nLDP             X24, X23, [SP,#0x80+var_30]                            ; +0xa0, 0xe6f0c\nLDR             X25, [SP,#0x80+var_40]                                 ; +0xa4, 0xe6f10\nADD             SP, SP, #0x90                                          ; +0xa8, 0xe6f14\nRET                                                                    ; +0xac, 0xe6f18\nBL              sub_E7334                                              ; +0xb0, 0xe6f1c\nMOV             W1, #0x120                                             ; +0xb4, 0xe6f20\nLDR             X8, [X8]                                               ; +0xb8, 0xe6f24\nMOV             W3, #0x1E3                                             ; +0xbc, 0xe6f28\nMOV             W4, WZR                                                ; +0xc0, 0xe6f2c\nLDR             X0, [X8,#0x1B0]                                        ; +0xc4, 0xe6f30\nBL              sub_E2AC4                                              ; +0xc8, 0xe6f34\nCBZ             X0, loc_E6F94                                          ; +0xcc, 0xe6f38\nMOV             X24, X0                                                ; +0xd0, 0xe6f3c\nSTR             W23, [X0,#8]                                           ; +0xd4, 0xe6f40\nSTR             X25, [X0,#0x118]                                       ; +0xd8, 0xe6f44\nSTR             X22, [X0]                                              ; +0xdc, 0xe6f48\nSTR             X21, [X0,#0x10]                                        ; +0xe0, 0xe6f4c\nADD             X0, X0, #0x18                                          ; +0xe4, 0xe6f50\nMOV             W2, #0x100                                             ; +0xe8, 0xe6f54\nMOV             X1, X20                                                ; +0xec, 0xe6f58\nBL              sub_E3C94                                              ; +0xf0, 0xe6f5c\nADRL            X2, sub_E6D38; start_routine                           ; +0xf4, 0xe6f60\nSUB             X0, X29, #-newthread; newthread                        ; +0xfc, 0xe6f68\nADD             X1, SP, #0x80+attr; attr                               ; +0x100, 0xe6f6c\nMOV             X3, X24; arg                                           ; +0x104, 0xe6f70\nBL              .pthread_create                                        ; +0x108, 0xe6f74\nCBNZ            W0, loc_E6EFC                                          ; +0x10c, 0xe6f78\nADD             X0, SP, #0x80+attr; attr                               ; +0x110, 0xe6f7c\nBL              .pthread_attr_destroy                                  ; +0x114, 0xe6f80\nCBNZ            W0, loc_E6EFC                                          ; +0x118, 0xe6f84\nLDUR            X8, [X29,#newthread]                                   ; +0x11c, 0xe6f88\nSTR             X8, [X19]                                              ; +0x120, 0xe6f8c\nB               loc_E6F00                                              ; +0x124, 0xe6f90\nMOV             W0, #0x26 ; '&'                                        ; +0x128, 0xe6f94\nB               loc_E6F00                                              ; +0x12c, 0xe6f98", "xrefs": [".FMOD_OS_Thread_Create @ 0x109b0c", "<???> @ 0x16a8", ".FMOD_OS_Thread_Create @ 0x109b04", "<???> @ 0x111648"], "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"}