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