ExpReleaseFastResourceExclusive
NTSTATUS __stdcall ExpReleaseFastResourceExclusive(PVOID BugCheckParameter2){
__int64 v1;
__int64 v2;
unsigned __int8 CurrentIrql;
_QWORD *v5;
UINT64 *v6;
_QWORD *v7;
__int64 v8;
_QWORD *v9;
__int64 v10;
_QWORD *v11;
NTSTATUS result;
__int64 v13;
_QWORD *v14;
_KLOCK_QUEUE_HANDLE LockQueue;
INT64 v16;
INT64 v17;
INT64 v18;
v18 = 0i64;
v2 = v1;
v17 = 0i64;
LODWORD(v16) = 0;
memset(&LockQueue, 0, sizeof(LockQueue));
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
if( !*(_BYTE *)(v1 + 18) )
{
v13 = *(_QWORD *)v1;
v14 = *(_QWORD **)(v1 + 8);
if( *(_QWORD *)(*(_QWORD *)v1 + 8i64) == v1 && *v14 == v1 )
goto LABEL_12;
goto LABEL_15;
}
v5 = (_QWORD *)(v1 + 40);
LockQueue.LockQueue.Next = 0i64;
v6 = (UINT64 *)((char *)BugCheckParameter2 + 96);
LockQueue.LockQueue.Lock = (unsigned __int64 *volatile)((char *)BugCheckParameter2 + 96);
if( (_QWORD *)*v5 != v5 )
{
KxAcquireQueuedSpinLock(&LockQueue.LockQueue, v6);
ExpRotateFastOwnerEntrySublistHead((__int64)BugCheckParameter2, v2, 1);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
v13 = *(_QWORD *)v2;
v14 = *(_QWORD **)(v2 + 8);
if( *(_QWORD *)(*(_QWORD *)v2 + 8i64) == v2 && *v14 == v2 )
{
LABEL_12:
*v14 = v13;
*(_QWORD *)(v13 + 8) = v14;
*(_QWORD *)v2 = 0i64;
*(_QWORD *)(v2 + 8) = 0i64;
result = CurrentIrql;
__writecr8(CurrentIrql);
goto LABEL_9;
}
LABEL_15:
__fastfail(3u);
}
KxAcquireQueuedSpinLock(&LockQueue.LockQueue, v6);
ExpPrepareToWakeResourceExclusive((INT64)BugCheckParameter2, &v18, &v17, &v16);
v7 = (_QWORD *)(v2 + 56);
v8 = *(_QWORD *)(v2 + 56);
v9 = *(_QWORD **)(v2 + 64);
if( *(_QWORD *)(v8 + 8) != v2 + 56 )
goto LABEL_15;
if( (_QWORD *)*v9 != v7 )
goto LABEL_15;
*v9 = v8;
*(_QWORD *)(v8 + 8) = v9;
*v7 = 0i64;
*(_QWORD *)(v2 + 64) = 0i64;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
KeWakeWaitChain((_KWAIT_CHAIN *)&v18, 0i64, 2 * (unsigned int)(v17 != 0) + 1);
*(_BYTE *)(v2 + 18) = 0;
v10 = *(_QWORD *)v2;
v11 = *(_QWORD **)(v2 + 8);
if( *(_QWORD *)(*(_QWORD *)v2 + 8i64) != v2 || *v11 != v2 )
goto LABEL_15;
*v11 = v10;
*(_QWORD *)(v10 + 8) = v11;
*(_QWORD *)v2 = 0i64;
*(_QWORD *)(v2 + 8) = 0i64;
*v5 = 0i64;
*(_QWORD *)(v2 + 48) = 0i64;
__writecr8(CurrentIrql);
result = *(unsigned __int8 *)(v2 + 16);
if( (_BYTE)result )
KeAbPostReleaseEx(BugCheckParameter2, (VOID *)*(unsigned __int8 *)(v2 + 16));
LABEL_9:
*(_BYTE *)(v2 + 17) &= 0xFAu;
*(_BYTE *)(v2 + 16) = 0;
*(_QWORD *)(v2 + 24) = 0i64;
return result;
}Referenced by:
ExReleaseFastResource
ExReleaseFastResourceExclusive
ExReleaseFastResourceShared