ExpReleaseFastResourceShared
NTSTATUS __stdcall ExpReleaseFastResourceShared(PVOID BugCheckParameter2){
INT64 v1;
WORK_QUEUE_TYPE v2;
void *v3;
INT64 v4;
unsigned __int8 CurrentIrql;
_QWORD *v7;
IO_WORKITEM_ROUTINE *v8;
__int64 v9;
_QWORD *v10;
NTSTATUS result;
_QWORD *v12;
__int64 v13;
_QWORD *v14;
__int64 v15;
_QWORD *v16;
__int128 LockHandle;
__int64 LockHandle_16;
INT64 v19;
INT64 v20;
INT64 v21;
LockHandle_16 = 0i64;
v21 = 0i64;
v4 = v1;
v20 = 0i64;
LODWORD(v19) = 0;
LockHandle = 0i64;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
if( !*(_BYTE *)(v1 + 18) )
{
v9 = *(_QWORD *)v1;
v10 = *(_QWORD **)(v1 + 8);
if( *(_QWORD *)(*(_QWORD *)v1 + 8i64) == v1 && *v10 == v1 )
goto LABEL_5;
goto LABEL_13;
}
v7 = (_QWORD *)(v1 + 40);
*(_QWORD *)&LockHandle = 0i64;
v8 = (IO_WORKITEM_ROUTINE *)((char *)BugCheckParameter2 + 96);
*((_QWORD *)&LockHandle + 1) = (char *)BugCheckParameter2 + 96;
if( (_QWORD *)*v7 != v7 )
{
KxAcquireQueuedSpinLock((PIO_WORKITEM)&LockHandle, v8, v2, v3);
ExpRotateFastOwnerEntrySublistHead((INT64)BugCheckParameter2, v4, 1);
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
v9 = *(_QWORD *)v4;
v10 = *(_QWORD **)(v4 + 8);
if( *(_QWORD *)(*(_QWORD *)v4 + 8i64) == v4 && *v10 == v4 )
{
LABEL_5:
*v10 = v9;
*(_QWORD *)(v9 + 8) = v10;
*(_QWORD *)v4 = 0i64;
*(_QWORD *)(v4 + 8) = 0i64;
result = CurrentIrql;
__writecr8(CurrentIrql);
goto LABEL_6;
}
LABEL_13:
__fastfail(3u);
}
KxAcquireQueuedSpinLock((PIO_WORKITEM)&LockHandle, v8, v2, v3);
ExpPrepareToWakeResourceShared((INT64)BugCheckParameter2, &v21, &v20, &v19);
v12 = (_QWORD *)(v4 + 56);
v13 = *(_QWORD *)(v4 + 56);
v14 = *(_QWORD **)(v4 + 64);
if( *(_QWORD *)(v13 + 8) != v4 + 56 )
goto LABEL_13;
if( (_QWORD *)*v14 != v12 )
goto LABEL_13;
*v14 = v13;
*(_QWORD *)(v13 + 8) = v14;
*v12 = 0i64;
*(_QWORD *)(v4 + 64) = 0i64;
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
KeWakeWaitChain((const WCHAR *)&v21, 0i64, 2 * (v20 != 0) + 1);
*(_BYTE *)(v4 + 18) = 0;
v15 = *(_QWORD *)v4;
v16 = *(_QWORD **)(v4 + 8);
if( *(_QWORD *)(*(_QWORD *)v4 + 8i64) != v4 || *v16 != v4 )
goto LABEL_13;
*v16 = v15;
*(_QWORD *)(v15 + 8) = v16;
*(_QWORD *)v4 = 0i64;
*(_QWORD *)(v4 + 8) = 0i64;
*v7 = 0i64;
*(_QWORD *)(v4 + 48) = 0i64;
__writecr8(CurrentIrql);
result = *(unsigned __int8 *)(v4 + 16);
if( (_BYTE)result )
KeAbPostReleaseEx(BugCheckParameter2, (PVOID)*(unsigned __int8 *)(v4 + 16));
LABEL_6:
*(_BYTE *)(v4 + 17) &= 0xFAu;
*(_BYTE *)(v4 + 16) = 0;
*(_QWORD *)(v4 + 24) = 0i64;
return result;
}Referenced by:
ExReleaseFastResource
ExReleaseFastResourceShared