{"type": "func", "start": 6443712740, "end": 6443713076, "name": "strnlen", "pseudocode": "// \n// strnlen from 0x1801340e4 to 0x180134234 (336 bytes)\n// \n// 2 xrefs:\n// > common_getenv<char> @ 0x180128cef\n// > unknown_libname_53 @ 0x18012ebc6\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\nsize_t __cdecl strnlen(const char *String, size_t MaxCount)\n{\n  const char *v4; // r9\n  size_t v5; // r10\n  const char *v6; // rax\n  const char *v7; // rcx\n  size_t v8; // rcx\n  const char *v9; // r8\n  size_t v11; // r10\n  const char *v12; // rax\n  const char *v13; // rcx\n  const char *v14; // r8\n  const char *i; // rax\n\n  v4 = String;\n  if ( dword_1801B1700 < 5 )\n  {\n    if ( dword_1801B1700 < 1 )\n    {\n      for ( i = &String[MaxCount]; String != i; ++String )\n      {\n        if ( !*String )\n          break;\n      }\n      return String - v4;\n    }\n    v11 = (16LL - ((unsigned __int8)String & 0xF)) & -(__int64)(((unsigned __int8)String & 0xF) != 0);\n    v12 = String;\n    if ( MaxCount < v11 )\n      v11 = MaxCount;\n    v13 = &String[v11];\n    if ( v4 != &v4[v11] )\n    {\n      do\n      {\n        if ( !*v12 )\n          break;\n        ++v12;\n      }\n      while ( v12 != v13 );\n    }\n    v8 = v12 - v4;\n    if ( v12 - v4 == v11 )\n    {\n      String = v12;\n      v14 = &v12[(MaxCount - v11) & 0xFFFFFFFFFFFFFFF0uLL];\n      if ( v12 != v14 )\n      {\n        do\n        {\n          if ( _mm_movemask_epi8(_mm_cmpeq_epi8((__m128i)0LL, *(__m128i *)String)) )\n            break;\n          String += 16;\n        }\n        while ( String != v14 );\n      }\n      while ( String != &v4[MaxCount] && *String )\n        ++String;\n      return String - v4;\n    }\n  }\n  else\n  {\n    v5 = (32LL - ((unsigned __int8)String & 0x1F)) & -(__int64)(((unsigned __int8)String & 0x1F) != 0);\n    v6 = String;\n    if ( MaxCount < v5 )\n      v5 = MaxCount;\n    v7 = &String[v5];\n    if ( v4 != v7 )\n    {\n      do\n      {\n        if ( !*v6 )\n          break;\n        ++v6;\n      }\n      while ( v6 != v7 );\n    }\n    v8 = v6 - v4;\n    if ( v6 - v4 == v5 )\n    {\n      String = v6;\n      v9 = &v6[(MaxCount - v5) & 0xFFFFFFFFFFFFFFE0uLL];\n      if ( v6 != v9 )\n      {\n        do\n        {\n          __asm\n          {\n            vpxor   xmm1, xmm1, xmm1\n            vpcmpeqb ymm1, ymm1, ymmword ptr [rcx]\n            vpmovmskb eax, ymm1\n          }\n          __asm { vzeroupper }\n          if ( _EAX )\n            break;\n          String += 32;\n        }\n        while ( String != v9 );\n      }\n      while ( String != &v4[MaxCount] && *String )\n        ++String;\n      return String - v4;\n    }\n  }\n  return v8;\n}", "assembly": "; \n; strnlen from 0x1801340e4 to 0x180134234 (336 bytes)\n; \n; 2 xrefs:\n; > common_getenv<char> @ 0x180128cef\n; > unknown_libname_53 @ 0x18012ebc6\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     eax, cs:dword_1801B1700                                        ; +0x0, 0x1801340e4\nmov     r9, rcx                                                        ; +0x6, 0x1801340ea\ncmp     eax, 5                                                         ; +0x9, 0x1801340ed\njl      loc_180134189                                                  ; +0xc, 0x1801340f0\nmov     r8, rcx                                                        ; +0x12, 0x1801340f6\nmov     eax, 20h ; ' '                                                 ; +0x15, 0x1801340f9\nand     r8d, 1Fh                                                       ; +0x1a, 0x1801340fe\nsub     rax, r8                                                        ; +0x1e, 0x180134102\nneg     r8                                                             ; +0x21, 0x180134105\nsbb     r10, r10                                                       ; +0x24, 0x180134108\nand     r10, rax                                                       ; +0x27, 0x18013410b\nmov     rax, r9                                                        ; +0x2a, 0x18013410e\ncmp     rdx, r10                                                       ; +0x2d, 0x180134111\ncmovb   r10, rdx                                                       ; +0x30, 0x180134114\nadd     rcx, r10                                                       ; +0x34, 0x180134118\ncmp     r9, rcx                                                        ; +0x37, 0x18013411b\njz      short loc_18013412D                                            ; +0x3a, 0x18013411e\ncmp     byte ptr [rax], 0                                              ; +0x3c, 0x180134120\njz      short loc_18013412D                                            ; +0x3f, 0x180134123\ninc     rax                                                            ; +0x41, 0x180134125\ncmp     rax, rcx                                                       ; +0x44, 0x180134128\njnz     short loc_180134120                                            ; +0x47, 0x18013412b\nmov     rcx, rax                                                       ; +0x49, 0x18013412d\nsub     rcx, r9                                                        ; +0x4c, 0x180134130\ncmp     rcx, r10                                                       ; +0x4f, 0x180134133\njnz     loc_180134230                                                  ; +0x52, 0x180134136\nmov     r8, rdx                                                        ; +0x58, 0x18013413c\nmov     rcx, rax                                                       ; +0x5b, 0x18013413f\nsub     r8, r10                                                        ; +0x5e, 0x180134142\nand     r8, 0FFFFFFFFFFFFFFE0h                                         ; +0x61, 0x180134145\nadd     r8, rax                                                        ; +0x65, 0x180134149\ncmp     rax, r8                                                        ; +0x68, 0x18013414c\njz      short loc_18013416D                                            ; +0x6b, 0x18013414f\nvpxor   xmm1, xmm1, xmm1                                               ; +0x6d, 0x180134151\nvpcmpeqb ymm1, ymm1, ymmword ptr [rcx]                                 ; +0x71, 0x180134155\nvpmovmskb eax, ymm1                                                    ; +0x75, 0x180134159\ntest    eax, eax                                                       ; +0x79, 0x18013415d\nvzeroupper                                                             ; +0x7b, 0x18013415f\njnz     short loc_18013416D                                            ; +0x7e, 0x180134162\nadd     rcx, 20h ; ' '                                                 ; +0x80, 0x180134164\ncmp     rcx, r8                                                        ; +0x84, 0x180134168\njnz     short loc_180134151                                            ; +0x87, 0x18013416b\nlea     rax, [r9+rdx]                                                  ; +0x89, 0x18013416d\njmp     short loc_18013417F                                            ; +0x8d, 0x180134171\ncmp     byte ptr [rcx], 0                                              ; +0x8f, 0x180134173\njz      loc_18013422D                                                  ; +0x92, 0x180134176\ninc     rcx                                                            ; +0x98, 0x18013417c\ncmp     rcx, rax                                                       ; +0x9b, 0x18013417f\njnz     short loc_180134173                                            ; +0x9e, 0x180134182\njmp     loc_18013422D                                                  ; +0xa0, 0x180134184\ncmp     eax, 1                                                         ; +0xa5, 0x180134189\njl      loc_180134217                                                  ; +0xa8, 0x18013418c\nand     ecx, 0Fh                                                       ; +0xae, 0x180134192\nmov     eax, 10h                                                       ; +0xb1, 0x180134195\nsub     rax, rcx                                                       ; +0xb6, 0x18013419a\nneg     rcx                                                            ; +0xb9, 0x18013419d\nsbb     r10, r10                                                       ; +0xbc, 0x1801341a0\nand     r10, rax                                                       ; +0xbf, 0x1801341a3\nmov     rax, r9                                                        ; +0xc2, 0x1801341a6\ncmp     rdx, r10                                                       ; +0xc5, 0x1801341a9\ncmovb   r10, rdx                                                       ; +0xc8, 0x1801341ac\nlea     rcx, [r10+r9]                                                  ; +0xcc, 0x1801341b0\ncmp     r9, rcx                                                        ; +0xd0, 0x1801341b4\njz      short loc_1801341C6                                            ; +0xd3, 0x1801341b7\ncmp     byte ptr [rax], 0                                              ; +0xd5, 0x1801341b9\njz      short loc_1801341C6                                            ; +0xd8, 0x1801341bc\ninc     rax                                                            ; +0xda, 0x1801341be\ncmp     rax, rcx                                                       ; +0xdd, 0x1801341c1\njnz     short loc_1801341B9                                            ; +0xe0, 0x1801341c4\nmov     rcx, rax                                                       ; +0xe2, 0x1801341c6\nsub     rcx, r9                                                        ; +0xe5, 0x1801341c9\ncmp     rcx, r10                                                       ; +0xe8, 0x1801341cc\njnz     short loc_180134230                                            ; +0xeb, 0x1801341cf\nmov     r8, rdx                                                        ; +0xed, 0x1801341d1\nmov     rcx, rax                                                       ; +0xf0, 0x1801341d4\nsub     r8, r10                                                        ; +0xf3, 0x1801341d7\nxorps   xmm1, xmm1                                                     ; +0xf6, 0x1801341da\nand     r8, 0FFFFFFFFFFFFFFF0h                                         ; +0xf9, 0x1801341dd\nadd     r8, rax                                                        ; +0xfd, 0x1801341e1\ncmp     rax, r8                                                        ; +0x100, 0x1801341e4\njz      short loc_180134202                                            ; +0x103, 0x1801341e7\nmovdqa  xmm0, xmm1                                                     ; +0x105, 0x1801341e9\npcmpeqb xmm0, xmmword ptr [rcx]                                        ; +0x109, 0x1801341ed\npmovmskb eax, xmm0                                                     ; +0x10d, 0x1801341f1\ntest    eax, eax                                                       ; +0x111, 0x1801341f5\njnz     short loc_180134202                                            ; +0x113, 0x1801341f7\nadd     rcx, 10h                                                       ; +0x115, 0x1801341f9\ncmp     rcx, r8                                                        ; +0x119, 0x1801341fd\njnz     short loc_1801341E9                                            ; +0x11c, 0x180134200\nlea     rax, [r9+rdx]                                                  ; +0x11e, 0x180134202\njmp     short loc_180134210                                            ; +0x122, 0x180134206\ncmp     byte ptr [rcx], 0                                              ; +0x124, 0x180134208\njz      short loc_18013422D                                            ; +0x127, 0x18013420b\ninc     rcx                                                            ; +0x129, 0x18013420d\ncmp     rcx, rax                                                       ; +0x12c, 0x180134210\njnz     short loc_180134208                                            ; +0x12f, 0x180134213\njmp     short loc_18013422D                                            ; +0x131, 0x180134215\nlea     rax, [rcx+rdx]                                                 ; +0x133, 0x180134217\ncmp     r9, rax                                                        ; +0x137, 0x18013421b\njz      short loc_18013422D                                            ; +0x13a, 0x18013421e\ncmp     byte ptr [rcx], 0                                              ; +0x13c, 0x180134220\njz      short loc_18013422D                                            ; +0x13f, 0x180134223\ninc     rcx                                                            ; +0x141, 0x180134225\ncmp     rcx, rax                                                       ; +0x144, 0x180134228\njnz     short loc_180134220                                            ; +0x147, 0x18013422b\nsub     rcx, r9                                                        ; +0x149, 0x18013422d\nmov     rax, rcx                                                       ; +0x14c, 0x180134230\nretn                                                                   ; +0x14f, 0x180134233", "xrefs": ["common_getenv<char> @ 0x180128cef", "unknown_libname_53 @ 0x18012ebc6"], "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"}