FsRtlUninitializeOplock
VOID __stdcall FsRtlUninitializeOplock(VOID **Oplock){
char *v1;
INT64 v2;
INT64 v3;
_QWORD *v4;
char *v5;
_QWORD *v6;
_QWORD *v7;
INT64 *v8;
INT64 *v9;
INT64 *v10;
INT64 v11;
INT64 v12;
_CCHAR v13;
INT64 v14;
_RH_OP_CONTEXT *v15;
_QWORD *v16;
__int64 v17;
_QWORD *v18;
_RH_OP_CONTEXT *v19;
PFAST_MUTEX v20;
__int64 v21;
_CCHAR v22;
__int64 v23;
VOID *v24;
void *v25;
INT64 v26;
INT64 v27;
UINT64 AccessMode;
v1 = (char *)*Oplock;
if( *Oplock )
{
*Oplock = 0i64;
ExAcquireFastMutexUnsafe(*((PFAST_MUTEX *)v1 + 19));
while( 1 )
{
v4 = v1 + 88;
v5 = (char *)*((_QWORD *)v1 + 11);
if( v5 == v1 + 88 )
break;
v6 = *(_QWORD **)v5;
if( *((_QWORD **)v5 + 1) != v4 || (char *)v6[1] != v5 )
__fastfail(3u);
*v4 = v6;
v6[1] = v4;
v7 = (_QWORD *)*((_QWORD *)v5 + 2);
if( v7 )
{
*((_BYTE *)v7 + 69) = KeAcquireQueuedSpinLock(7i64, v2, v3);
_InterlockedExchange64(v7 + 13, 0i64);
KeReleaseQueuedSpinLock(LockQueueIoCancelLock, *((_BYTE *)v7 + 69));
v7[7] = 0i64;
v7 = (_QWORD *)*((_QWORD *)v5 + 2);
}
(*((void(__fastcall **)(_QWORD, _QWORD *))v5 + 3))(*((_QWORD *)v5 + 4), v7);
ExFreePoolWithTag(v5, 0);
}
while( 1 )
{
v8 = (INT64 *)(v1 + 40);
v9 = (INT64 *)*((_QWORD *)v1 + 5);
if( v9 == (INT64 *)(v1 + 40) )
break;
v10 = v9 - 21;
v11 = v9[2];
v12 = *v9;
if( (INT64 *)v9[1] != v8 || *(INT64 **)(v12 + 8) != v9 )
__fastfail(3u);
*v8 = v12;
*(_QWORD *)(v12 + 8) = v8;
*((_BYTE *)v10 + 69) = KeAcquireQueuedSpinLock(7i64, v12, v3);
_InterlockedExchange64(v10 + 13, 0i64);
KeReleaseQueuedSpinLock(LockQueueIoCancelLock, *((_BYTE *)v10 + 69));
ObfDereferenceObjectWithTag(*(VOID **)(v11 + 48), 0x746C6644ui64);
if( *(_DWORD *)(v11 + 24) == 590400 )
{
v14 = v10[3];
*(_OWORD *)v14 = 0i64;
*(_QWORD *)(v14 + 16) = 0i64;
*(_DWORD *)v14 = 1572865;
*(_DWORD *)(v14 + 4) = (*((_DWORD *)v1 + 36) >> 12) & 7;
v10[7] = 24i64;
}
else
{
v10[7] = 8i64;
}
*((_DWORD *)v10 + 12) = 0;
LOBYTE(v13) = 1;
IofCompleteRequest((PIRP)v10, v13);
}
while( 1 )
{
v15 = (_RH_OP_CONTEXT *)*((_QWORD *)v1 + 7);
if( v15 == (_RH_OP_CONTEXT *)(v1 + 56) )
break;
if( (*((_DWORD *)v1 + 36) & 0x10000) != 0 && v15->AtomicLinks.Flink )
{
FsRtlpOplockDequeueRH(*((_RH_OP_CONTEXT **)v1 + 7));
v17 = *v16;
v18 = (_QWORD *)v16[1];
if( *(_QWORD **)(*v16 + 8i64) != v16 || (_QWORD *)*v18 != v16 )
__fastfail(3u);
*v18 = v17;
*(_QWORD *)(v17 + 8) = v18;
if( *((char **)v1 + 15) == v1 + 120 )
*((_DWORD *)v1 + 36) &= 0xFFFCFFFF;
if( v15->OplockOwnerThread )
FsRtlpClearOwner((_NONOPAQUE_OPLOCK *)v1, v15);
ExFreePoolWithTag(v15, 0);
}
else if( Feature_Servicing_39887415__private_IsEnabled() )
{
LODWORD(v27) = 0;
LODWORD(v26) = 0;
FsRtlpRemoveAndCompleteRHIrp(v15, (_NONOPAQUE_OPLOCK *)v1, 0i64, 0i64, v26, v27, 0);
}
else
{
LODWORD(AccessMode) = 0;
LODWORD(v27) = 0;
LODWORD(v26) = 0;
FsRtlpRemoveAndBreakRHIrp(v15, (_NONOPAQUE_OPLOCK *)v1, 1u, 0i64, v26, v27, AccessMode, 0);
}
}
while( 1 )
{
v19 = (_RH_OP_CONTEXT *)*((_QWORD *)v1 + 9);
if( v19 == (_RH_OP_CONTEXT *)(v1 + 72) )
break;
FsRtlpOplockDequeueRH(*((_RH_OP_CONTEXT **)v1 + 9));
FsRtlpModifyThreadPriorities((_NONOPAQUE_OPLOCK *)v1, v19, 0);
ObfDereferenceObjectWithTag(v19->OplockRequestFileObject, 0x746C6644ui64);
FsRtlpClearOwner((_NONOPAQUE_OPLOCK *)v1, v19);
ExFreePoolWithTag(v19, 0);
}
v20 = *(PFAST_MUTEX *)v1;
if( *(_QWORD *)v1 )
{
v21 = *(_QWORD *)&v20[3].Contention;
BYTE5(v20[1].Owner) = KeAcquireQueuedSpinLock(7i64, v2, v3);
_InterlockedExchange64((volatile __int64 *)&v20[1].OldIrql, 0i64);
KeReleaseQueuedSpinLock(LockQueueIoCancelLock, BYTE5(v20[1].Owner));
if( *(_DWORD *)(v21 + 24) == 590400 )
{
v23 = *(_QWORD *)&v20->gap14[4];
*(_OWORD *)v23 = 0i64;
*(_QWORD *)(v23 + 16) = 0i64;
*(_DWORD *)v23 = 1572865;
*(_DWORD *)(v23 + 4) = (*((_DWORD *)v1 + 36) >> 12) & 7;
*(_QWORD *)&v20[1].Count = 24i64;
}
else
{
*(_QWORD *)&v20[1].Count = 8i64;
}
v20->OldIrql = 0;
LOBYTE(v22) = 1;
IofCompleteRequest((PIRP)v20, v22);
*(_QWORD *)v1 = 0i64;
v24 = (VOID *)*((_QWORD *)v1 + 1);
if( v24 )
ObfDereferenceObjectWithTag(v24, 0x746C6644ui64);
FsRtlpModifyThreadPriorities((_NONOPAQUE_OPLOCK *)v1, 0i64, 0);
FsRtlpClearOwner((_NONOPAQUE_OPLOCK *)v1, 0i64);
}
ExReleaseFastMutexUnsafe(*((PFAST_MUTEX *)v1 + 19));
v25 = (void *)*((_QWORD *)v1 + 17);
if( v25 )
ExFreePoolWithTag(v25, 0);
ExFreePoolWithTag(*((PVOID *)v1 + 19), 0);
ExFreePoolWithTag(v1, 0);
}
}Referenced by:
No references.