RtlpLookupUserFunctionTableInverted

_IMAGE_ARM64_RUNTIME_FUNCTION_ENTRY *__fastcall RtlpLookupUserFunctionTableInverted(
        VOID *ControlPc,
        _INVERTED_FUNCTION_TABLE_ENTRY *FunctionTableInfo,
        INT64 a3,
        INT64 a4,
        INT64 a5,
        UINT64 a6,
        UINT64 a7,
        CHAR *a8){
  __int64 v10; 
  unsigned __int64 v11; 
  int v12; 
  int v13; 
  int v14; 
  unsigned __int64 v15; 
  unsigned __int64 v16; 
  _IMAGE_ARM64_RUNTIME_FUNCTION_ENTRY *v17; 
  __int64 SizeOfTable; 
  char *ImageBase; 
  int v21[8]; 
  int v22; 
  int v23; 
  _IMAGE_ARM64_RUNTIME_FUNCTION_ENTRY *v24; 
  int v25; 
  v25 = *(_DWORD *)(KeUserInvertedFunctionTable + 8);
  v22 = 0;
  v23 = 0;
  v10 = KeUserInvertedFunctionTable + 16;
  v11 = *(_QWORD *)(KeUserInvertedFunctionTable + 24);
  if( (unsigned __int64)ControlPc < v11
    || (unsigned __int64)ControlPc >= v11 + *(unsigned int *)(KeUserInvertedFunctionTable + 32) )
  {
    v12 = *(_DWORD *)KeUserInvertedFunctionTable - 1;
    if( (unsigned int)v12 <= 0x200 && *(_DWORD *)KeUserInvertedFunctionTable != 1 )
    {
      v13 = 1;
      v23 = 1;
      v22 = v12;
      while( v12 >= v13 )
      {
        v14 = (v13 + v12) >> 1;
        v10 = KeUserInvertedFunctionTable + 24i64 * v14 + 16;
        v15 = *(_QWORD *)(KeUserInvertedFunctionTable + 24i64 * v14 + 24);
        v16 = v15 + *(unsigned int *)(KeUserInvertedFunctionTable + 24i64 * v14 + 32);
        if( v16 < v15 )
          break;
        if( (unsigned __int64)ControlPc < v15 )
        {
          if( !v14 )
            return 0i64;
          v12 = v14 - 1;
          v22 = v14 - 1;
        }
        else
        {
          if( (unsigned __int64)ControlPc < v16 )
            goto LABEL_13;
          v13 = v14 + 1;
          v23 = v14 + 1;
        }
      }
    }
    return 0i64;
  }
LABEL_13:
  if( !v10 )
    return 0i64;
  v17 = *(_IMAGE_ARM64_RUNTIME_FUNCTION_ENTRY **)v10;
  v24 = v17;
  FunctionTableInfo->FunctionTable = (_IMAGE_RUNTIME_FUNCTION_ENTRY *)v17;
  FunctionTableInfo->ImageBase = *(void **)(v10 + 8);
  FunctionTableInfo->SizeOfTable = *(_DWORD *)(v10 + 20);
  FunctionTableInfo->SizeOfImage = *(_DWORD *)(v10 + 16);
  SizeOfTable = FunctionTableInfo->SizeOfTable;
  if( (_DWORD)SizeOfTable )
  {
    if( ((unsigned __int8)v17 & 3) != 0 )
      ExRaiseDatatypeMisalignment();
    if( (unsigned __int64)v17 + SizeOfTable > 0x7FFFFFFF0000i64
      || (_IMAGE_ARM64_RUNTIME_FUNCTION_ENTRY *)((char *)v17 + SizeOfTable) < v17 )
    {
      MEMORY[0x7FFFFFFF0000] = 0;
    }
  }
  ImageBase = (char *)FunctionTableInfo->ImageBase;
  if( (_WORD)ImageBase )
    ExRaiseDatatypeMisalignment();
  if( (unsigned __int64)(ImageBase + 64) > 0x7FFFFFFF0000i64 || ImageBase + 64 < ImageBase )
    MEMORY[0x7FFFFFFF0000] = 0;
  _InterlockedOr(v21, 0);
  if( *(_DWORD *)(KeUserInvertedFunctionTable + 8) != v25 || (v25 & 1) != 0 )
    return 0i64;
  else
    return v24;
}

Referenced by:

RtlGetImageBaseAndLoadConfig
RtlpLookupUserFunctionTable