ExDeleteResourceLite
NTSTATUS __fastcall ExDeleteResourceLite(UINT64 a1){
UINT8 CurrentIrql;
signed __int32 v3;
__int64 v4;
_QWORD *v5;
unsigned __int64 v6;
int *v7;
int v9;
unsigned int v10;
int *i;
_ETHREAD *v12;
bool v13;
signed __int32 v14;
int v15;
UINT64 SpinCount;
if( (*(_BYTE *)(a1 + 26) & 1) != 0 )
KeBugCheckEx(0x1C6u, (PVOID)0xE, (PVOID)a1, 0i64, 0i64);
__incgsdword(0x8660u);
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
LODWORD(SpinCount) = 0;
if( _interlockedbittestandset((volatile signed __int32 *)&ExpResourceSpinLock, 0x1Fu) )
LODWORD(SpinCount) = ExpWaitForSpinLockExclusiveAndAcquire(&ExpResourceSpinLock, CurrentIrql);
v3 = ExpResourceSpinLock;
while( (v3 & 0xBFFFFFFF) != 0x80000000 )
{
if( (v3 & 0x40000000) == 0 )
{
v14 = _InterlockedCompareExchange((volatile signed __int32 *)&ExpResourceSpinLock, v3 | 0x40000000, v3);
v13 = v3 == v14;
v3 = v14;
if( !v13 )
continue;
}
KeYieldProcessorEx(&SpinCount);
v3 = ExpResourceSpinLock;
}
v4 = *(_QWORD *)a1;
v5 = *(_QWORD **)(a1 + 8);
if( *(_QWORD *)(*(_QWORD *)a1 + 8i64) != a1 || *v5 != a1 )
__fastfail(3u);
*v5 = v4;
*(_QWORD *)(v4 + 8) = v5;
LODWORD(ExpResourceSpinLock) = 0;
__writecr8(CurrentIrql);
*(_QWORD *)a1 = 0i64;
*(_QWORD *)(a1 + 8) = 0i64;
v6 = *(_QWORD *)(a1 + 48);
if( (*(_DWORD *)(a1 + 56) & 2) != 0 )
{
v6 &= 0xFFFFFFFFFFFFFFFCui64;
}
else if( (v6 & 3) != 0 )
{
goto LABEL_10;
}
if( v6 )
{
if( ExpResourceEnforcesOwnershipTransfer(a1)
&& (*(_DWORD *)(a1 + 56) & 2) == 0
&& (struct _KTHREAD *)v6 != KeGetCurrentThread() )
{
KeBugCheckEx(0x16Eu, (PVOID)a1, KeGetCurrentThread(), (PVOID)v6, (PVOID)1);
}
v9 = *(_DWORD *)(a1 + 56);
if( (v9 & 1) != 0 )
{
PsBoostThreadIoEx((_ETHREAD *)v6, 1u, 0, 0i64);
v9 = *(_DWORD *)(a1 + 56);
}
if( (v9 & 4) != 0 )
{
PsBoostThreadIoQoS((_ETHREAD *)v6, 1ui64);
v9 = *(_DWORD *)(a1 + 56);
}
if( (v9 & 2) != 0 )
ObDereferenceObjectDeferDeleteWithTag(v6, 1953261124i64);
}
LABEL_10:
v7 = *(int **)(a1 + 16);
if( v7 )
{
v10 = 1;
for( i = v7 + 2; v10 < v7[2]; ++v10 )
{
i += 4;
v12 = ExpOwnerEntryToThread((_OWNER_ENTRY *)(i - 2));
if( v12 )
{
if( ExpResourceEnforcesOwnershipTransfer(a1) && (*i & 2) == 0 && v12 != (_ETHREAD *)KeGetCurrentThread() )
KeBugCheckEx(0x16Eu, (PVOID)a1, KeGetCurrentThread(), v12, (PVOID)2);
v15 = *i;
if( (*i & 1) != 0 )
{
PsBoostThreadIoEx(v12, 1u, 0, 0i64);
v15 = *i;
}
if( (v15 & 4) != 0 )
{
PsBoostThreadIoQoS(v12, 1ui64);
v15 = *i;
}
if( (v15 & 2) != 0 )
ObDereferenceObjectDeferDeleteWithTag((UINT64)v12, 1953261124i64);
}
v7 = *(int **)(a1 + 16);
}
ExFreeHeapPool(v7);
}
return 0;
}Referenced by:
CcDeallocateBcb
CmpInitCmRM
DrvDbCreateDatabaseNode
DrvDbDestroyDatabaseNode
DrvDbOpenContext
MUIInitializeResourceLock
PiDrvDbDestroyNode
PnpCtxCloseMachine
PspJobDelete
RtlCreateHeap
RtlDestroyHeap
SepTokenDeleteMethod
TtmpDeleteQueue