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