PopCloneRange
VOID __stdcall PopCloneRange(_POP_HIBER_CONTEXT *HiberContext, UINT64 StartPage, UINT64 PageCount, UINT64 Tag){
int v5;
UINT64 v7;
VOID **p_Flink;
_LIST_ENTRY *Flink;
_LIST_ENTRY *v10;
_LIST_ENTRY *v11;
UINT64 Blink;
_LIST_ENTRY *v13;
_LIST_ENTRY *v14;
_LIST_ENTRY *v15;
_LIST_ENTRY *v16;
v5 = Tag;
v7 = StartPage;
RtlSetBits(&HiberContext->DiscardMap, StartPage, PageCount);
p_Flink = 0i64;
Flink = HiberContext->ClonedRanges.Flink;
v10 = (_LIST_ENTRY *)(v7 + PageCount);
if( Flink == &HiberContext->ClonedRanges )
goto LABEL_13;
while( 1 )
{
v11 = Flink;
Flink = Flink->Flink;
Blink = (UINT64)v11[1].Blink;
if( (v7 < Blink || (_LIST_ENTRY *)v7 > v11[2].Flink) && ((unsigned __int64)v10 < Blink || v10 > v11[2].Flink) )
{
if( v7 > Blink )
goto LABEL_7;
if( Blink > (unsigned __int64)v10 )
break;
}
if( v7 <= Blink )
Blink = v7;
v7 = Blink;
v14 = v11[2].Flink;
if( v10 >= v14 )
v14 = v10;
--HiberContext->ClonedRangeCount;
v15 = v11->Flink;
v10 = v14;
if( v11->Flink->Blink != v11 )
goto LABEL_25;
v16 = v11->Blink;
if( v16->Flink != v11 )
goto LABEL_25;
v16->Flink = v15;
v15->Blink = v16;
if( p_Flink )
ExFreePoolWithTag(v11, 0x70616D48u);
else
p_Flink = (VOID **)&v11->Flink;
LABEL_7:
if( Flink == &HiberContext->ClonedRanges )
goto LABEL_12;
}
if( v7 >= Blink )
goto LABEL_7;
Flink = Flink->Blink;
LABEL_12:
if( p_Flink )
{
LABEL_14:
*p_Flink = 0i64;
p_Flink[1] = 0i64;
*((_DWORD *)p_Flink + 5) = 0;
p_Flink[5] = 0i64;
*((_DWORD *)p_Flink + 4) = v5;
p_Flink[3] = (VOID *)v7;
p_Flink[4] = v10;
v13 = Flink->Blink;
if( v13->Flink != Flink )
LABEL_25:
__fastfail(3u);
*p_Flink = Flink;
p_Flink[1] = v13;
v13->Flink = (_LIST_ENTRY *)p_Flink;
Flink->Blink = (_LIST_ENTRY *)p_Flink;
++HiberContext->ClonedRangeCount;
}
else
{
LABEL_13:
p_Flink = ExAllocatePoolWithTag(0x200ui64, 0x30ui64, 1885433160i64);
if( p_Flink )
goto LABEL_14;
if( HiberContext->Status >= 0 )
HiberContext->Status = -1073741670;
}
}Referenced by:
PopSetRange