MiUnlockControlAreaSectionExtend
VOID __stdcall MiUnlockControlAreaSectionExtend(_CONTROL_AREA *ControlArea, _MI_CONTROL_AREA_WAIT_BLOCK *a2){
int v2;
unsigned __int64 v5;
_MI_CONTROL_AREA_WAIT_BLOCK *v6;
INT64 *p_ControlAreaLock;
_MI_CONTROL_AREA_WAIT_BLOCK *v8;
_MI_CONTROL_AREA_WAIT_BLOCK *v9;
_ETHREAD *CurrentThread;
v2 = *((_DWORD *)a2 + 2);
KeAbPostRelease(ControlArea);
v5 = (unsigned __int8)ExAcquireSpinLockExclusive((INT64 *)&ControlArea->ControlAreaLock);
v6 = MiBuildWakeList(ControlArea, *((unsigned int *)a2 + 2));
p_ControlAreaLock = (INT64 *)&ControlArea->ControlAreaLock;
v8 = v6;
ExReleaseSpinLockExclusiveFromDpcLevel(p_ControlAreaLock);
__writecr8(v5);
if( v8 )
{
do
{
v9 = *(_MI_CONTROL_AREA_WAIT_BLOCK **)v8;
if( v8 != a2 )
KeSignalGate((_KGATE *)((char *)v8 + 16), 1i64);
v8 = v9;
}
while( v9 );
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
if( v2 == 16 )
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
else
KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
}Referenced by:
MmExtendSection