ExDeleteResourceLite
INT64 __fastcall ExDeleteResourceLite(INT64 a1, UINT64 *a2, UINT64 a3, INT64 a4, VOID *UniqueOwnerId){
unsigned __int8 CurrentIrql;
signed __int32 v7;
__int64 v8;
_QWORD *v9;
ULONG_PTR v10;
__int64 *v11;
int v13;
unsigned int v14;
__int64 *i;
_ETHREAD *v16;
bool v17;
signed __int32 v18;
int v19;
UINT64 SpinCount;
if( (*(_BYTE *)(a1 + 26) & 1) != 0 )
KeBugCheckEx(0x1C6u, 0xEui64, a1, 0i64, 0i64);
__incgsdword(0x8660u);
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
LODWORD(SpinCount) = 0;
if( _interlockedbittestandset(&ExpResourceSpinLock, 0x1Fu) )
LODWORD(SpinCount) = ExpWaitForSpinLockExclusiveAndAcquire(
(RTL_BITMAP *)&ExpResourceSpinLock,
CurrentIrql,
(UINT64 *)a3);
v7 = ExpResourceSpinLock;
while( (v7 & 0xBFFFFFFF) != 0x80000000 )
{
if( (v7 & 0x40000000) == 0 )
{
v18 = _InterlockedCompareExchange(&ExpResourceSpinLock, v7 | 0x40000000, v7);
v17 = v7 == v18;
v7 = v18;
if( !v17 )
continue;
}
KeYieldProcessorEx(&SpinCount);
v7 = ExpResourceSpinLock;
}
v8 = *(_QWORD *)a1;
v9 = *(_QWORD **)(a1 + 8);
if( *(_QWORD *)(*(_QWORD *)a1 + 8i64) != a1 || *v9 != a1 )
__fastfail(3u);
*v9 = v8;
*(_QWORD *)(v8 + 8) = v9;
ExpResourceSpinLock = 0;
__writecr8(CurrentIrql);
*(_QWORD *)a1 = 0i64;
*(_QWORD *)(a1 + 8) = 0i64;
v10 = *(_QWORD *)(a1 + 48);
if( (*(_DWORD *)(a1 + 56) & 2) != 0 )
{
v10 &= 0xFFFFFFFFFFFFFFFCui64;
}
else if( (v10 & 3) != 0 )
{
goto LABEL_10;
}
if( v10 )
{
if( ExpResourceEnforcesOwnershipTransfer(a1)
&& (*(_DWORD *)(a1 + 56) & 2) == 0
&& (struct _KTHREAD *)v10 != KeGetCurrentThread() )
{
KeBugCheckEx(0x16Eu, a1, (ULONG_PTR)KeGetCurrentThread(), v10, 1ui64);
}
v13 = *(_DWORD *)(a1 + 56);
if( (v13 & 1) != 0 )
{
PsBoostThreadIoEx(v10, 1, 0, 0i64);
v13 = *(_DWORD *)(a1 + 56);
}
if( (v13 & 4) != 0 )
{
PsBoostThreadIoQoS(v10, 1);
v13 = *(_DWORD *)(a1 + 56);
}
if( (v13 & 2) != 0 )
ObDereferenceObjectDeferDeleteWithTag((PVOID)v10, 0x746C6644ui64);
}
LABEL_10:
v11 = *(__int64 **)(a1 + 16);
if( v11 )
{
v14 = 1;
for( i = v11 + 1; v14 < *((_DWORD *)v11 + 2); ++v14 )
{
i += 2;
v16 = (_ETHREAD *)ExpOwnerEntryToThread(i - 1);
if( v16 )
{
if( ExpResourceEnforcesOwnershipTransfer(a1)
&& (*(_DWORD *)i & 2) == 0
&& v16 != (_ETHREAD *)KeGetCurrentThread() )
{
KeBugCheckEx(0x16Eu, a1, (ULONG_PTR)KeGetCurrentThread(), (ULONG_PTR)v16, 2ui64);
}
v19 = *(_DWORD *)i;
if( (*(_DWORD *)i & 1) != 0 )
{
PsBoostThreadIoEx((__int64)v16, 1, 0, 0i64);
v19 = *(_DWORD *)i;
}
if( (v19 & 4) != 0 )
{
PsBoostThreadIoQoS((__int64)v16, 1);
v19 = *(_DWORD *)i;
}
if( (v19 & 2) != 0 )
ObDereferenceObjectDeferDeleteWithTag(v16, 0x746C6644ui64);
}
v11 = *(__int64 **)(a1 + 16);
}
ExFreeHeapPool(v11);
}
return 0i64;
}Referenced by:
CcDeallocateBcb
CmpInitCmRM
DrvDbCreateDatabaseNode
DrvDbDestroyDatabaseNode
DrvDbOpenContext
MUIInitializeResourceLock
PiDrvDbDestroyNode
PnpCtxCloseMachine
PspJobDelete
RtlCreateHeap
RtlDestroyHeap
SepTokenDeleteMethod
TtmpDeleteQueue