// // InternalCompareStringA from 0x18013bad8 to 0x18013be35 (861 bytes) // // 2 xrefs: // > __acrt_CompareStringA @ 0x18013be99 // > @ 0x180203974 // // 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 InternalCompareStringA( struct __crt_locale_pointers *a1, const wchar_t *a2, DWORD a3, const char *a4, int a5, char *String, int a7, UINT CodePage) { int v8; // ebx int v11; // esi UINT v12; // r14d BYTE *LeadByte; // rax BYTE *v15; // rax int v16; // eax unsigned int v17; // r12d size_t v18; // rcx __int64 v19; // rax void *v20; // rsp WCHAR *v21; // rdi WCHAR *v22; // rax int v23; // eax int v24; // r15d unsigned __int64 v25; // rcx unsigned __int64 v26; // rdx __int64 v27; // rax void *v28; // rsp WCHAR *v29; // rbx WCHAR *v30; // rax unsigned int v31; // esi _BYTE v32[32]; // [rsp+0h] [rbp-50h] BYREF DWORD v33; // [rsp+50h] [rbp+0h] BYREF const wchar_t *v34; // [rsp+58h] [rbp+8h] struct _cpinfo CPInfo; // [rsp+60h] [rbp+10h] BYREF v8 = a5; v33 = a3; v34 = a2; if ( a5 <= 0 ) { if ( a5 < -1 ) return 0; } else { v8 = _strncnt(a4, a5); } v11 = a7; if ( a7 <= 0 ) { if ( a7 < -1 ) return 0; } else { v11 = _strncnt(String, a7); } v12 = CodePage; if ( !CodePage ) v12 = *((_DWORD *)a1->locinfo + 3); if ( !v8 || !v11 ) { if ( v8 == v11 ) return 2; if ( v11 > 1 ) return 1; if ( v8 > 1 ) return 3; if ( !GetCPInfo(v12, &CPInfo) ) return 0; if ( v8 > 0 ) { if ( CPInfo.MaxCharSize >= 2 ) { LeadByte = CPInfo.LeadByte; if ( CPInfo.LeadByte[0] ) { while ( LeadByte[1] ) { if ( (unsigned int)*a4 >= *LeadByte && (unsigned int)*a4 <= LeadByte[1] ) return 2; LeadByte += 2; if ( !*LeadByte ) return 3; } } } return 3; } if ( v11 > 0 ) { if ( CPInfo.MaxCharSize >= 2 ) { v15 = CPInfo.LeadByte; if ( CPInfo.LeadByte[0] ) { while ( v15[1] ) { if ( (unsigned __int8)*String >= *v15 && (unsigned __int8)*String <= v15[1] ) return 2; v15 += 2; if ( !*v15 ) return 1; } } } return 1; } } v16 = _acrt_MultiByteToWideChar(v12, 9, a4, v8, nullptr, 0); v17 = v16; if ( !v16 ) return 0; v18 = (2LL * v16 + 16) & -(__int64)(2LL * v16 < (unsigned __int64)(2LL * v16 + 16)); if ( !v18 ) { v21 = nullptr; goto LABEL_42; } if ( v18 <= 0x400 ) { v19 = v18 + 15; if ( v18 + 15 < v18 ) v19 = 0xFFFFFFFFFFFFFF0LL; v20 = alloca(v19 & 0xFFFFFFFFFFFFFFF0uLL); v21 = (WCHAR *)&v33; if ( v32 == (_BYTE *)-80LL ) goto LABEL_62; v33 = 52428; goto LABEL_40; } v22 = (WCHAR *)malloc_base(v18); v21 = v22; if ( v22 ) { *(_DWORD *)v22 = 56797; LABEL_40: v21 += 8; } LABEL_42: if ( v21 ) { if ( _acrt_MultiByteToWideChar(v12, 1, a4, v8, v21, v17) ) { v23 = _acrt_MultiByteToWideChar(v12, 9, String, v11, nullptr, 0); v24 = v23; if ( v23 ) { v25 = 2LL * v23 + 16; v26 = v25 & -(__int64)(2LL * v23 < v25); if ( !v26 ) { v29 = nullptr; goto LABEL_55; } if ( v26 > 0x400 ) { v30 = (WCHAR *)malloc_base(v25 & -(__int64)(2LL * v23 < v25)); v29 = v30; if ( !v30 ) { LABEL_55: if ( v29 && _acrt_MultiByteToWideChar(v12, 1, String, v11, v29, v24) ) { v31 = _acrt_CompareStringEx((__int64)v34, v33, v21, v17, v29, v24, 0, 0, 0); LABEL_59: if ( v29 && *((_DWORD *)v29 - 4) == 56797 ) free_base(v29 - 8); goto LABEL_63; } LABEL_58: v31 = 0; goto LABEL_59; } *(_DWORD *)v30 = 56797; } else { v27 = v26 + 15; if ( v26 + 15 < v26 ) v27 = 0xFFFFFFFFFFFFFF0LL; v28 = alloca(v27 & 0xFFFFFFFFFFFFFFF0uLL); v29 = (WCHAR *)&v33; if ( v32 == (_BYTE *)-80LL ) goto LABEL_58; v33 = 52428; } v29 += 8; goto LABEL_55; } } } LABEL_62: v31 = 0; LABEL_63: if ( v21 && *((_DWORD *)v21 - 4) == 56797 ) free_base(v21 - 8); return v31; }