RtlpIsFrameInBoundsEx
NTSTATUS __stdcall RtlpIsFrameInBoundsEx(
UINT64 *LowLimit,
UINT64 StackFrame,
UINT64 *HighLimit,
_KERNEL_STACK_SEGMENT *LastSegment){
void **StackBase;
int v9;
_ETHREAD *CurrentThread;
unsigned int v11;
char *v12;
UINT64 v13;
char v14;
char v15;
int v16;
unsigned __int64 StackLimit;
UINT64 HighLimita;
__int64 LowLimita[2];
void *retaddr;
_KERNEL_STACK_LIMITS Type;
StackBase = &retaddr;
HighLimita = 0i64;
LowLimita[0] = 0i64;
Type = BugcheckStackLimits;
if( (StackFrame & 7) != 0 )
goto LABEL_5;
StackBase = (void **)*LowLimit;
if( StackFrame >= *LowLimit && StackFrame < *HighLimit )
goto LABEL_4;
if( (unsigned __int64)StackBase < 0xFFFF800000000000ui64 )
goto LABEL_5;
KeQueryCurrentStackInformation(&Type, (UINT64 *)LowLimita, &HighLimita);
LODWORD(StackBase) = Type;
if( (unsigned int)Type <= MachineCheckStackLimits )
{
v9 = 929;
if( _bittest(&v9, Type) )
goto LABEL_5;
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v11 = Type;
if( Type == DPCStackLimits )
{
LABEL_16:
v14 = 0;
if( !LastSegment->StackBase )
{
KeGetNextKernelStackSegment(&CurrentThread->Tcb, LastSegment, 1u);
v14 = v15;
}
if( v11 <= 0xA && (v16 = 1090, _bittest(&v16, v11)) && v14
|| KeGetNextKernelStackSegment(&CurrentThread->Tcb, LastSegment, 0) )
{
StackLimit = LastSegment->StackLimit;
StackBase = (void **)LastSegment->StackBase;
if( StackFrame >= StackLimit && StackFrame < (unsigned __int64)StackBase )
{
*LowLimit = StackLimit;
*HighLimit = (UINT64)StackBase;
goto LABEL_4;
}
}
LABEL_5:
LOBYTE(StackBase) = 0;
return(int)StackBase;
}
if( (KeGetPcr()->Prcb.DpcRequestSummary & 1) == 0
|| CurrentThread == KeGetCurrentPrcb()->IdleThread
|| (LODWORD(StackBase) = KeKernelStackSize,
v12 = (char *)KeGetPcr()->Prcb.DpcStack + 80,
v13 = (UINT64)&v12[-(unsigned int)KeKernelStackSize],
v13 > StackFrame)
|| StackFrame >= (unsigned __int64)v12 )
{
v11 = Type;
goto LABEL_16;
}
*HighLimit = (UINT64)v12;
*LowLimit = v13;
LABEL_4:
LOBYTE(StackBase) = 1;
return(int)StackBase;
}Referenced by:
PspGetSetContextInternal