RtlpLookupFunctionEntryForStackWalks

_IMAGE_ARM64_RUNTIME_FUNCTION_ENTRY *__fastcall RtlpLookupFunctionEntryForStackWalks(
        UINT64 ControlPc,
        _INVERTED_FUNCTION_TABLE_ENTRY *FunctionTableInfo,
        INT64 a3,
        INT64 a4,
        INT64 a5,
        UINT64 a6,
        UINT64 a7,
        CHAR *a8){
  void *ImageBase; 
  char *FunctionTable; 
  unsigned int v12; 
  _IMAGE_ARM64_RUNTIME_FUNCTION_ENTRY *v13; 
  UINT64 v14; 
  _IMAGE_ARM64_RUNTIME_FUNCTION_ENTRY *v15; 
  int v16; 
  int v17; 
  int v18; 
  char *v19; 
  __int64 BeginAddress; 
  void *v22; 
  INT64 v23; 
  UINT64 v24; 
  UINT64 v25; 
  CHAR *v26; 

  ImageBase = FunctionTableInfo->ImageBase;
  if( ControlPc < (unsigned __int64)ImageBase
    || ControlPc >= (unsigned __int64)ImageBase + FunctionTableInfo->SizeOfImage )
  {
    if( ControlPc <= 0x7FFFFFFEFFFFi64 )
    {
      FunctionTable = (char *)RtlpLookupUserFunctionTable(
                                (VOID *)ControlPc,
                                FunctionTableInfo,
                                a3,
                                a4,
                                v23,
                                v24,
                                v25,
                                v26);
    }
    else if( ControlPc < (unsigned __int64)*(&byte_140E00020 + 1)
           || ControlPc >= (unsigned __int64)*(&byte_140E00020 + 1) + *((unsigned int *)&byte_140E00020 + 4) )
    {
      FunctionTable = (char *)RtlpxLookupFunctionTable((VOID *)ControlPc, FunctionTableInfo);
    }
    else
    {
      *FunctionTableInfo = *(_INVERTED_FUNCTION_TABLE_ENTRY *)&byte_140E00020;
      FunctionTable = (char *)FunctionTableInfo->FunctionTable;
    }
  }
  else
  {
    FunctionTable = (char *)FunctionTableInfo->FunctionTable;
  }
  if( FunctionTable )
  {
    v12 = FunctionTableInfo->SizeOfTable / 0xC;
    v13 = 0i64;
    if( v12 )
    {
      v14 = ControlPc - (unsigned __int64)FunctionTableInfo->ImageBase;
      v15 = (_IMAGE_ARM64_RUNTIME_FUNCTION_ENTRY *)&FunctionTable[12 * v12 - 12];
      if( v14 < v15->BeginAddress )
      {
        v16 = 0;
        v17 = v12 - 2;
        while( v17 >= v16 )
        {
          v18 = (v16 + v17) >> 1;
          v15 = (_IMAGE_ARM64_RUNTIME_FUNCTION_ENTRY *)&FunctionTable[12 * v18];
          if( v14 >= v15->BeginAddress )
          {
            if( v14 < v15[1].UnwindData )
              break;
            v16 = v18 + 1;
          }
          else
          {
            v17 = v18 - 1;
          }
        }
      }
      if( v14 >= v15->BeginAddress && v14 < v15->UnwindData )
        v13 = v15;
    }
    if( v13 )
    {
      v19 = (char *)FunctionTableInfo->ImageBase;
      BeginAddress = v13[1].BeginAddress;
      if( (BeginAddress & 1) != 0 )
      {
        v13 = (_IMAGE_ARM64_RUNTIME_FUNCTION_ENTRY *)&v19[BeginAddress - 1];
        if( (unsigned __int64)v19 <= 0x7FFFFFFEFFFFi64 && ((unsigned __int8)v13 & 3) != 0 )
          ExRaiseDatatypeMisalignment();
      }
    }
    return v13;
  }
  else if( HvlQueryConnection(&FunctionTableInfo->ImageBase) < 0
         || (v22 = FunctionTableInfo->ImageBase, ControlPc < (unsigned __int64)v22)
         || ControlPc >= (unsigned __int64)v22 + 4096 )
  {
    FunctionTableInfo->ImageBase = 0i64;
    FunctionTableInfo->SizeOfImage = 0;
    return 0i64;
  }
  else
  {
    FunctionTableInfo->SizeOfImage = 4096;
    return 0i64;
  }
}

Referenced by:

PspGetSetContextInternal
RtlpSameFunction
RtlpWalkFrameChain