ExpReleaseDisownedFastResourceExclusive
NTSTATUS __fastcall ExpReleaseDisownedFastResourceExclusive(__int64 a1, __int64 a2){
unsigned __int8 CurrentIrql;
UINT64 v5;
__int64 v6;
_QWORD *v7;
_QWORD *v8;
UINT64 *v9;
NTSTATUS result;
_QWORD *v11;
__int64 v12;
_QWORD *v13;
__int64 v14;
_QWORD *v15;
_KLOCK_QUEUE_HANDLE v16;
_KLOCK_QUEUE_HANDLE LockQueue;
INT64 v18;
INT64 v19;
INT64 v20;
v20 = 0i64;
v19 = 0i64;
LODWORD(v18) = 0;
*(_QWORD *)&LockQueue.OldIrql = 0i64;
memset(&v16, 0, sizeof(v16));
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
v5 = *(_QWORD *)(a2 + 32);
LockQueue.LockQueue.Next = 0i64;
LockQueue.LockQueue.Lock = (unsigned __int64 *volatile)(v5 + 1592);
KxAcquireQueuedSpinLock(&LockQueue.LockQueue, (UINT64 *)(v5 + 1592));
if( !*(_BYTE *)(a2 + 18) )
{
v6 = *(_QWORD *)a2;
v7 = *(_QWORD **)(a2 + 8);
if( *(_QWORD *)(*(_QWORD *)a2 + 8i64) != a2 || *v7 != a2 )
goto LABEL_4;
goto LABEL_8;
}
v8 = (_QWORD *)(a2 + 40);
v16.LockQueue.Next = 0i64;
v9 = (UINT64 *)(a1 + 96);
v16.LockQueue.Lock = (unsigned __int64 *volatile)(a1 + 96);
if( (_QWORD *)*v8 != v8 )
{
KxAcquireQueuedSpinLock(&v16.LockQueue, v9);
ExpRotateFastOwnerEntrySublistHead(a1, a2, 1);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v16);
v6 = *(_QWORD *)a2;
v7 = *(_QWORD **)(a2 + 8);
if( *(_QWORD *)(*(_QWORD *)a2 + 8i64) == a2 && *v7 == a2 )
{
LABEL_8:
*v7 = v6;
*(_QWORD *)(v6 + 8) = v7;
*(_QWORD *)a2 = 0i64;
*(_QWORD *)(a2 + 8) = 0i64;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
result = CurrentIrql;
__writecr8(CurrentIrql);
goto LABEL_16;
}
LABEL_4:
__fastfail(3u);
}
KxAcquireQueuedSpinLock(&v16.LockQueue, v9);
ExpPrepareToWakeResourceExclusive(a1, &v20, &v19, &v18);
v11 = (_QWORD *)(a2 + 56);
v12 = *(_QWORD *)(a2 + 56);
v13 = *(_QWORD **)(a2 + 64);
if( *(_QWORD *)(v12 + 8) != a2 + 56 )
goto LABEL_4;
if( (_QWORD *)*v13 != v11 )
goto LABEL_4;
*v13 = v12;
*(_QWORD *)(v12 + 8) = v13;
*v11 = 0i64;
*(_QWORD *)(a2 + 64) = 0i64;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v16);
*(_BYTE *)(a2 + 18) = 0;
v14 = *(_QWORD *)a2;
v15 = *(_QWORD **)(a2 + 8);
if( *(_QWORD *)(*(_QWORD *)a2 + 8i64) != a2 || *v15 != a2 )
goto LABEL_4;
*v15 = v14;
*(_QWORD *)(v14 + 8) = v15;
*(_QWORD *)a2 = 0i64;
*(_QWORD *)(a2 + 8) = 0i64;
*v8 = 0i64;
*(_QWORD *)(a2 + 48) = 0i64;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
KeWakeWaitChain((_KWAIT_CHAIN *)&v20, 0i64, 2 * (unsigned int)(v19 != 0) + 1);
__writecr8(CurrentIrql);
if( *(_BYTE *)(a2 + 16) )
KeAbCrossThreadRelease(a1, *(unsigned __int8 *)(a2 + 16), v5);
result = ObfDereferenceObjectWithTag(*(VOID **)(a2 + 32), 0x746C6644ui64);
LABEL_16:
*(_BYTE *)(a2 + 17) &= 0xFAu;
*(_BYTE *)(a2 + 16) = 0;
*(_QWORD *)(a2 + 24) = 0i64;
return result;
}Referenced by:
ExReleaseDisownedFastResource
ExReleaseDisownedFastResourceExclusive
ExReleaseDisownedFastResourceShared