ExpReleaseDisownedFastResourceExclusive
INT64 __stdcall ExpReleaseDisownedFastResourceExclusive(UINT64 *a1, INT64 a2){
WORK_QUEUE_TYPE v2;
void *v3;
unsigned __int8 CurrentIrql;
UINT64 v7;
WORK_QUEUE_TYPE v8;
void *v9;
__int64 v10;
_QWORD *v11;
_QWORD *v12;
IO_WORKITEM_ROUTINE *v13;
INT64 result;
_QWORD *v15;
__int64 v16;
_QWORD *v17;
__int64 v18;
_QWORD *v19;
struct _KLOCK_QUEUE_HANDLE LockHandle;
struct _KLOCK_QUEUE_HANDLE v21;
INT64 v22;
INT64 v23;
INT64 v24;
v24 = 0i64;
v23 = 0i64;
LODWORD(v22) = 0;
*(_QWORD *)&v21.OldIrql = 0i64;
memset(&LockHandle, 0, sizeof(LockHandle));
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
v7 = *(_QWORD *)(a2 + 32);
v21.LockQueue.Next = 0i64;
v21.LockQueue.Lock = (unsigned __int64 *volatile)(v7 + 1592);
KxAcquireQueuedSpinLock((PIO_WORKITEM)&v21, (PIO_WORKITEM_ROUTINE)(v7 + 1592), v2, v3);
if( !*(_BYTE *)(a2 + 18) )
{
v10 = *(_QWORD *)a2;
v11 = *(_QWORD **)(a2 + 8);
if( *(_QWORD *)(*(_QWORD *)a2 + 8i64) != a2 || *v11 != a2 )
goto LABEL_4;
goto LABEL_8;
}
v12 = (_QWORD *)(a2 + 40);
LockHandle.LockQueue.Next = 0i64;
v13 = (IO_WORKITEM_ROUTINE *)(a1 + 12);
LockHandle.LockQueue.Lock = a1 + 12;
if( (_QWORD *)*v12 != v12 )
{
KxAcquireQueuedSpinLock((PIO_WORKITEM)&LockHandle, v13, v8, v9);
ExpRotateFastOwnerEntrySublistHead((INT64)a1, a2, 1);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
v10 = *(_QWORD *)a2;
v11 = *(_QWORD **)(a2 + 8);
if( *(_QWORD *)(*(_QWORD *)a2 + 8i64) == a2 && *v11 == a2 )
{
LABEL_8:
*v11 = v10;
*(_QWORD *)(v10 + 8) = v11;
*(_QWORD *)a2 = 0i64;
*(_QWORD *)(a2 + 8) = 0i64;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v21);
result = CurrentIrql;
__writecr8(CurrentIrql);
goto LABEL_16;
}
LABEL_4:
__fastfail(3u);
}
KxAcquireQueuedSpinLock((PIO_WORKITEM)&LockHandle, v13, v8, v9);
ExpPrepareToWakeResourceExclusive((INT64)a1, &v24, &v23, &v22);
v15 = (_QWORD *)(a2 + 56);
v16 = *(_QWORD *)(a2 + 56);
v17 = *(_QWORD **)(a2 + 64);
if( *(_QWORD *)(v16 + 8) != a2 + 56 )
goto LABEL_4;
if( (_QWORD *)*v17 != v15 )
goto LABEL_4;
*v17 = v16;
*(_QWORD *)(v16 + 8) = v17;
*v15 = 0i64;
*(_QWORD *)(a2 + 64) = 0i64;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
*(_BYTE *)(a2 + 18) = 0;
v18 = *(_QWORD *)a2;
v19 = *(_QWORD **)(a2 + 8);
if( *(_QWORD *)(*(_QWORD *)a2 + 8i64) != a2 || *v19 != a2 )
goto LABEL_4;
*v19 = v18;
*(_QWORD *)(v18 + 8) = v19;
*(_QWORD *)a2 = 0i64;
*(_QWORD *)(a2 + 8) = 0i64;
*v12 = 0i64;
*(_QWORD *)(a2 + 48) = 0i64;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v21);
KeWakeWaitChain((const WCHAR *)&v24, 0i64, 2 * (v23 != 0) + 1);
__writecr8(CurrentIrql);
if( *(_BYTE *)(a2 + 16) )
KeAbCrossThreadRelease((INT64)a1, *(unsigned __int8 *)(a2 + 16), v7);
LODWORD(result) = ObfDereferenceObjectWithTag(*(PVOID *)(a2 + 32), 0x746C6644ui64);
LABEL_16:
*(_BYTE *)(a2 + 17) &= 0xFAu;
*(_BYTE *)(a2 + 16) = 0;
*(_QWORD *)(a2 + 24) = 0i64;
return result;
}Referenced by:
ExReleaseDisownedFastResource
ExReleaseDisownedFastResourceExclusive
ExReleaseDisownedFastResourceShared