ExpAcquireResourceExclusiveLite
VOID __stdcall ExpAcquireResourceExclusiveLite(VOID *LockAddress, INT8 a2){
_ETHREAD *CurrentThread;
unsigned __int64 *v5;
unsigned __int8 CurrentIrql;
int v7;
_KSPIN_LOCK_QUEUE *volatile Next;
__int64 *v9;
__int64 ***v10;
_KSPIN_LOCK_QUEUE *volatile v11;
_ETHREAD *v12;
int v13;
unsigned int v14;
unsigned int v15;
UINT64 v16;
__int16 v17;
int v18;
int v19;
unsigned __int8 v20;
_OWNER_ENTRY *v21;
_OWNER_ENTRY *v22;
_KSPIN_LOCK_QUEUE *volatile v23;
_KSPIN_LOCK_QUEUE *volatile v24;
int v25;
void(__fastcall **ExtensionTable)(_ETHREAD *);
UINT64 FirstEntryInelligible;
_KLOCK_QUEUE_HANDLE v28;
_KLOCK_QUEUE_HANDLE LockHandle;
__int64 *Object;
__int64 **p_Object;
_ETHREAD *v32;
__int64 v33;
__int64 v34[8];
unsigned __int8 v35;
_KPRCB *Prcb;
p_Object = 0i64;
BYTE3(v33) = 0;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
__incgsdword(0x8678u);
v5 = (unsigned __int64 *)((char *)LockAddress + 96);
v28.LockQueue.Lock = (unsigned __int64 *volatile)((char *)LockAddress + 96);
v28.LockQueue.Next = 0i64;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
*(_QWORD *)&v28.OldIrql = CurrentIrql;
if( _InterlockedExchange64((volatile __int64 *)LockAddress + 12, (__int64)&v28) )
KxWaitForLockOwnerShip((INT64)&v28);
if( !*((_DWORD *)LockAddress + 16) )
{
*((_QWORD *)LockAddress + 6) = CurrentThread;
*((_WORD *)LockAddress + 12) = 1;
*((_WORD *)LockAddress + 13) |= 0x80u;
v7 = *((_DWORD *)LockAddress + 14) & 7;
*((_DWORD *)LockAddress + 16) = 1;
*((_DWORD *)LockAddress + 14) = v7 | 8;
_m_prefetchw(&v28);
Next = v28.LockQueue.Next;
if( !v28.LockQueue.Next )
{
if( (_KLOCK_QUEUE_HANDLE *)_InterlockedCompareExchange64(
(volatile signed __int64 *)v28.LockQueue.Lock,
0i64,
(signed __int64)&v28) == &v28 )
{
LABEL_6:
__writecr8(v28.OldIrql);
__incgsdword(0x867Cu);
__incgsdword(0x8664u);
return;
}
Next = KxWaitForLockChainValid(&v28.LockQueue);
}
v28.LockQueue.Next = 0i64;
_InterlockedXor64((volatile signed __int64 *)&Next->Lock, 1ui64);
goto LABEL_6;
}
if( *((char *)LockAddress + 26) < 0 && *((_ETHREAD **)LockAddress + 6) == CurrentThread )
{
*((_DWORD *)LockAddress + 14) += 8;
_m_prefetchw(&v28);
v24 = v28.LockQueue.Next;
if( !v28.LockQueue.Next )
{
if( (_KLOCK_QUEUE_HANDLE *)_InterlockedCompareExchange64(
(volatile signed __int64 *)v28.LockQueue.Lock,
0i64,
(signed __int64)&v28) == &v28 )
{
LABEL_51:
__writecr8(v28.OldIrql);
__incgsdword(0x8680u);
__incgsdword(0x8664u);
return;
}
v24 = KxWaitForLockChainValid(&v28.LockQueue);
}
v28.LockQueue.Next = 0i64;
_InterlockedXor64((volatile signed __int64 *)&v24->Lock, 1ui64);
goto LABEL_51;
}
if( a2 )
{
++*((_DWORD *)LockAddress + 19);
v34[1] = (__int64)v34;
v34[0] = (__int64)v34;
v9 = (__int64 *)*((_QWORD *)LockAddress + 5);
Object = 0i64;
p_Object = 0i64;
v33 = 393217i64;
v32 = CurrentThread;
if( v9 )
{
v10 = (__int64 ***)v9[1];
if( *v10 != (__int64 **)v9 )
__fastfail(3u);
p_Object = (__int64 **)v9[1];
Object = v9;
*v10 = &Object;
v9[1] = (__int64)&Object;
}
else
{
p_Object = &Object;
Object = (__int64 *)&Object;
*((_QWORD *)LockAddress + 5) = &Object;
}
_m_prefetchw(&v28);
v11 = v28.LockQueue.Next;
if( !v28.LockQueue.Next )
{
if( (_KLOCK_QUEUE_HANDLE *)_InterlockedCompareExchange64(
(volatile signed __int64 *)v28.LockQueue.Lock,
0i64,
(signed __int64)&v28) == &v28 )
goto LABEL_15;
v11 = KxWaitForLockChainValid(&v28.LockQueue);
}
v28.LockQueue.Next = 0i64;
_InterlockedXor64((volatile signed __int64 *)&v11->Lock, 1ui64);
LABEL_15:
__writecr8(v28.OldIrql);
__incgsdword(0x8684u);
v12 = (_ETHREAD *)KeGetCurrentThread();
v13 = 0;
v14 = (v12->CrossThreadFlags >> 9) & 7;
if( (v12->Tcb.Process->Flags & 0x100000) != 0 )
{
v14 = 0;
}
else if( v14 >= 2 )
{
goto LABEL_17;
}
if( v12 == (_ETHREAD *)KeGetCurrentThread() && v12->IoBoostCount )
{
LABEL_18:
if( (*((_BYTE *)LockAddress + 26) & 4) == 0 )
v13 = 4;
LABEL_20:
v15 = v13 | 2;
if( (*((_WORD *)LockAddress + 13) & 2) != 0 )
v15 = v13;
v16 = v15 | 0xFF00;
if( v12->Tcb.Priority <= HIBYTE(*((unsigned __int16 *)LockAddress + 13)) )
v16 = v15;
if( (_DWORD)v16 )
ExpApplyPriorityBoost((_ERESOURCE *)LockAddress, v16, v12);
ExpWaitForResource((_ERESOURCE *)LockAddress, &Object);
v17 = *((_WORD *)LockAddress + 13);
memset(&LockHandle, 0, sizeof(LockHandle));
if( (v17 & 8) != 0 )
goto LABEL_48;
v18 = 0;
if( (v17 & 4) != 0
&& ((CurrentThread->Tcb.Process->Flags & 0x100000) != 0 || (CurrentThread->CrossThreadFlags & 0xE00) < 0x400) )
{
v18 = 4;
}
v19 = v18 | 2;
if( (v17 & 2) == 0 )
v19 = v18;
if( !v19 )
goto LABEL_48;
LockHandle.LockQueue.Lock = v5;
LockHandle.LockQueue.Next = 0i64;
v20 = KeGetCurrentIrql();
__writecr8(2ui64);
LockHandle.OldIrql = v20;
if( _InterlockedExchange64((volatile __int64 *)v5, (__int64)&LockHandle) )
KxWaitForLockOwnerShip((INT64)&LockHandle);
LODWORD(FirstEntryInelligible) = 1;
v21 = ExpFindCurrentThread(
(_ERESOURCE *)LockAddress,
(UINT64)CurrentThread,
&LockHandle,
0i64,
FirstEntryInelligible);
v22 = v21;
if( (v19 & 4) != 0 )
{
if( (v21->_bf_0 & 1) != 0 )
{
v19 &= ~4u;
}
else
{
PsBoostThreadIoEx(CurrentThread, 0, 0, 0i64);
v22->_bf_0 |= 1u;
}
}
if( (v19 & 2) != 0 )
{
if( (v22->_bf_0 & 4) != 0 )
{
v19 &= ~2u;
}
else
{
if( _InterlockedIncrement((volatile signed __int32 *)&CurrentThread->IoQoSBoostCount) == 1
&& CurrentThread->Tcb.AbWaitEntryCount )
{
v35 = KeGetCurrentIrql();
__writecr8(2ui64);
Prcb = KeGetCurrentPrcb();
KiAbThreadInsertList(CurrentThread, &Prcb->AbPropagateBoostsList, &CurrentThread->Tcb.PropagateBoostsEntry);
if( v25 )
KiAbQueueAutoBoostDpc(Prcb);
__writecr8(v35);
}
v22->_bf_0 |= 4u;
}
}
_m_prefetchw(&LockHandle);
v23 = LockHandle.LockQueue.Next;
if( !LockHandle.LockQueue.Next )
{
if( (_KLOCK_QUEUE_HANDLE *)_InterlockedCompareExchange64(
(volatile signed __int64 *)LockHandle.LockQueue.Lock,
0i64,
(signed __int64)&LockHandle) == &LockHandle )
goto LABEL_43;
v23 = KxWaitForLockChainValid(&LockHandle.LockQueue);
}
LockHandle.LockQueue.Next = 0i64;
_InterlockedXor64((volatile signed __int64 *)&v23->Lock, 1ui64);
LABEL_43:
__writecr8(LockHandle.OldIrql);
if( v19 )
{
if( (v19 & 4) != 0 )
IoBoostThreadIoPriority(CurrentThread, IoPriorityNormal, 0i64);
if( (v19 & 2) != 0 && CurrentThread->IoQoSThrottleCount )
{
ExtensionTable = (void(__fastcall **)(_ETHREAD *))ExGetExtensionTable(*(&stru_140C452E0 + 122));
if( ExtensionTable )
{
ExtensionTable[2](CurrentThread);
ExReleaseRundownProtection((_EX_RUNDOWN_REF *)(*(&stru_140C452E0 + 122) + 64i64));
}
}
}
LABEL_48:
__incgsdword(0x867Cu);
__incgsdword(0x8664u);
return;
}
LABEL_17:
if( v14 <= 1 )
goto LABEL_20;
goto LABEL_18;
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v28);
__writecr8(v28.OldIrql);
__incgsdword(0x8688u);
}Referenced by:
ExEnterCriticalRegionAndAcquireResourceExclusive