MiLockImageSection

VOID __stdcall MiLockImageSection(
        _KLDR_DATA_TABLE_ENTRY *DataTableEntry,
        INT64 *SectionLockCountPointer,
        _MMPTE *PointerPte,
        _MMPTE *LastPte){
  _ETHREAD *CurrentThread; 
  unsigned __int32 v9; 
  unsigned __int32 v10; 
  int v11[8]; 
  unsigned __int32 CompareAddress; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  v9 = *(_DWORD *)SectionLockCountPointer;
  do
  {
    while( 1 )
    {
      CompareAddress = v9;
      if( v9 != 1 )
        break;
      ExBlockOnAddressPushLock(&PushLock, SectionLockCountPointer, &CompareAddress, 4ui64, 0i64);
      v9 = *(_DWORD *)SectionLockCountPointer;
    }
    v10 = v9;
    v9 = _InterlockedCompareExchange((volatile signed __int32 *)SectionLockCountPointer, v9 + 1, v9);
  }
  while( v10 != v9 );
  if( v9 < 2 )
  {
    MiLockCode(DataTableEntry, PointerPte, LastPte, 1ui64);
    _InterlockedIncrement((volatile signed __int32 *)SectionLockCountPointer);
    _InterlockedOr(v11, 0);
    if( PushLock._bf_0 )
      ExfUnblockPushLock(&PushLock._bf_0, 0i64);
  }
  KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
}

Referenced by:

MiLockPagableImageSection