ArbRetestAllocation
INT64 __fastcall ArbRetestAllocation(_ARBITER_INSTANCE *Arbiter, _ARBITER_RETEST_ALLOCATION_PARAMETERS *Parameters){
_CM_PARTIAL_RESOURCE_DESCRIPTOR *AllocateFrom;
int v5;
_LIST_ENTRY *i;
_LIST_ENTRY *j;
int(__fastcall *PreprocessEntry)(_ARBITER_INSTANCE *, _ARBITER_ALLOCATION_STATE *);
__int64 v10;
INT64 result[6];
int v12;
__int64 *v13;
__int16 v14;
PVOID P;
__int64 v16[8];
v10 = 0i64;
memset((INT64)result, 0i64);
memset((INT64)v16, 0i64);
AllocateFrom = Parameters->AllocateFrom;
v13 = v16;
v12 = 1;
result[5] = (INT64)v16;
v14 = 1;
if( AllocateFrom )
{
v5 = Arbiter->InitializeRangeList(Arbiter, Parameters->AllocateFromCount, AllocateFrom, Arbiter->PossibleAllocation);
if( v5 >= 0 )
goto LABEL_8;
LABEL_17:
RtlFreeRangeList((INT64)Arbiter->PossibleAllocation);
return(unsigned int)v5;
}
v5 = RtlCopyRangeList(Arbiter->PossibleAllocation, Arbiter->Allocation);
if( v5 < 0 )
goto LABEL_17;
for( i = Parameters->ArbitrationList->Flink; Parameters->ArbitrationList != i; i = i->Flink )
{
v5 = RtlDeleteOwnersRanges(Arbiter->PossibleAllocation, i[2].Flink);
if( v5 < 0 )
goto LABEL_17;
}
LABEL_8:
for( j = Parameters->ArbitrationList->Flink; Parameters->ArbitrationList != j; j = j->Flink )
{
P = 0i64;
result[4] = (INT64)j;
v5 = ArbpBuildAlternative(Arbiter, (_IO_RESOURCE_DESCRIPTOR *)j[5].Flink, (_ARBITER_ALTERNATIVE *)v16);
if( LODWORD(j[5].Blink) != 2 )
{
Arbiter->UnpackResource(
(_CM_PARTIAL_RESOURCE_DESCRIPTOR *)j[4].Blink,
(unsigned __int64 *)result,
(unsigned __int64 *)&v10);
PreprocessEntry = Arbiter->PreprocessEntry;
result[1] = result[0] - 1 + v10;
v5 = PreprocessEntry(Arbiter, (_ARBITER_ALLOCATION_STATE *)result);
if( v5 < 0 )
goto LABEL_17;
if( v10 )
Arbiter->AddAllocation(Arbiter, (_ARBITER_ALLOCATION_STATE *)result);
if( (v14 & 0x10) != 0 )
{
ExFreePoolWithTag(P, 0);
v14 &= ~0x10u;
}
}
}
return(unsigned int)v5;
}Referenced by:
No references.