MiUnlinkSubsectionWaitBlock
VOID __stdcall MiUnlinkSubsectionWaitBlock(
_SUBSECTION *Subsection,
_MI_CONTROL_AREA_WAIT_BLOCK *CreationGate,
UINT64 ControlAreaLockHeld){
_CONTROL_AREA *ControlArea;
unsigned __int8 v6;
union {unsigned int LongFlags;_MMSECTION_FLAGS Flags;} v7;
_RTL_BALANCED_NODE *v8;
_RTL_BALANCED_NODE *WaitList;
_RTL_BALANCED_NODE *v10;
ControlArea = Subsection->ControlArea;
if( (_DWORD)ControlAreaLockHeld == 1 )
v6 = 17;
else
v6 = ExAcquireSpinLockExclusive((INT64 *)&ControlArea->ControlAreaLock);
if( !*((_DWORD *)CreationGate + 3) )
{
v7.LongFlags = (unsigned int)ControlArea->u;
v8 = 0i64;
if( (v7.LongFlags & 0x20) != 0 )
WaitList = (_RTL_BALANCED_NODE *)ControlArea->WaitList;
else
WaitList = Subsection->GlobalPerSessionHead.Root;
if( !WaitList )
goto LABEL_13;
do
{
if( WaitList == (_RTL_BALANCED_NODE *)CreationGate )
break;
v8 = WaitList;
WaitList = WaitList->Children[0];
}
while( WaitList );
if( v8 )
{
v8->Children[0] = WaitList->Children[0];
}
else
{
LABEL_13:
v10 = WaitList->Children[0];
if( (v7.LongFlags & 0x20) != 0 )
ControlArea->WaitList = (_MI_CONTROL_AREA_WAIT_BLOCK *)v10;
else
Subsection->GlobalPerSessionHead.Root = v10;
}
}
if( v6 != 17 )
{
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&ControlArea->ControlAreaLock);
__writecr8(v6);
}
}Referenced by:
MiAllocateFileExtents
MiChangingSubsectionProtos