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