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