RtlFindRange
NTSTATUS __stdcall RtlFindRange(
PRTL_RANGE_LIST RangeList,
ULONGLONG Minimum,
ULONGLONG Maximum,
ULONG Length,
ULONG Alignment,
ULONG Flags,
UCHAR AttributeAvailableMask,
PVOID Context,
PRTL_CONFLICT_RANGE_CALLBACK Callback,
PULONGLONG Start){
unsigned __int64 v10;
__int64 v12;
unsigned __int64 v13;
__int64 v14;
CHAR a5;
CHAR a6;
UINT64 v17;
unsigned __int64 v19;
struct _RANGE_LIST_ITERATOR Iterator;
v10 = *(_QWORD *)&Alignment;
v12 = *(_QWORD *)&Length;
memset(&Iterator, 0, sizeof(Iterator));
v13 = Maximum - *(_QWORD *)&Length + 1 - (Maximum - *(_QWORD *)&Length + 1) % *(_QWORD *)&Alignment;
if( Minimum > Maximum )
return -1073741811;
v14 = *(_QWORD *)&Length - 1i64;
if( Maximum - Minimum < *(_QWORD *)&Length - 1i64
|| Minimum + *(_QWORD *)&Alignment < Minimum
|| v13 < Minimum
|| !*(_QWORD *)&Length
|| !*(_QWORD *)&Alignment )
{
return -1073741811;
}
a5 = Flags & 1;
a6 = Flags & 2;
v17 = Maximum - (Maximum - *(_QWORD *)&Length + 1) % *(_QWORD *)&Alignment;
RtlGetLastRange(RangeList, &Iterator, (_RTL_RANGE **)&Alignment);
do
{
if( RtlpIsRangeAvailable(
(INT64 *)&Iterator,
v13,
v17,
AttributeAvailableMask,
a5,
a6,
0,
(INT64)Context,
(INT64)Callback) )
{
*Start = v13;
return 0;
}
v19 = *(_QWORD *)Iterator.Current - v12;
if( v19 > *(_QWORD *)Iterator.Current )
break;
v13 = v19 - v19 % v10;
v17 = v14 + v13;
}
while( v13 >= Minimum );
return -1073741823;
}Referenced by:
ArbFindSuitableRange
IopPortFindSuitableRange
KiTpIsExcludedKernelTracepointLocation