IoAcquireRemoveLockEx
NTSTATUS __stdcall IoAcquireRemoveLockEx(
PIO_REMOVE_LOCK RemoveLock,
PVOID Tag,
PCSTR File,
UINT32 Line,
UINT32 RemlockSize){
NTSTATUS v9;
_LIST_ENTRY *PoolWithTag;
UINT64 v12;
_LIST_ENTRY *v13;
unsigned __int8 v14;
unsigned __int64 v15;
_InterlockedIncrement(&RemoveLock->Common.IoCount);
v9 = 0;
if( RemoveLock->Common.Removed )
{
if( _InterlockedExchangeAdd(&RemoveLock->Common.IoCount, 0xFFFFFFFF) == 1 )
KeSetEvent(&RemoveLock->Common.RemoveEvent, 0);
return -1073741738;
}
else if( RemlockSize == 120 )
{
PoolWithTag = (_LIST_ENTRY *)ExAllocatePoolWithTag(
NonPagedPoolNx,
0x28ui64,
LODWORD(RemoveLock[1].Common.RemoveEvent.Header.WaitListHead.Flink));
v13 = PoolWithTag;
if( PoolWithTag )
{
PoolWithTag->Flink = 0i64;
PoolWithTag[1].Flink = 0i64;
HIDWORD(PoolWithTag[2].Flink) = 0;
PoolWithTag->Blink = (_LIST_ENTRY *)Tag;
PoolWithTag[1].Blink = (_LIST_ENTRY *)File;
LODWORD(PoolWithTag[2].Flink) = Line;
PoolWithTag[1].Flink = (_LIST_ENTRY *)KUSER_SHARED_DATA.TickCountQuad;
KeAcquireSpinLockRaiseToDpc((UINT64 *)&RemoveLock[2].Common.RemoveEvent, v12);
v15 = v14;
v13->Flink = RemoveLock[3].Common.RemoveEvent.Header.WaitListHead.Flink;
RemoveLock[3].Common.RemoveEvent.Header.WaitListHead.Flink = v13;
KxReleaseSpinLock((UINT64 *)&RemoveLock[2].Common.RemoveEvent);
__writecr8(v15);
}
else
{
_InterlockedIncrement((volatile signed __int32 *)&RemoveLock[2].Common.RemoveEvent.Header.WaitListHead);
}
}
return v9;
}Referenced by:
PoFxPowerControl
PopFxAcpiForwardNotification
PopFxAcpiForwardPepWorkRequest
PopFxAcpiUnregisterDevice
PopFxAddRefDevice
PopFxAllocatePowerIrp
PopFxFindAcpiDeviceByUniqueId
PopFxFindAndReferenceAcpiDevice
PopFxLockDevice
PopFxPlatformIdleVeto
PopFxProcessWork
PopFxProcessorIdleVeto
PopFxUpdatePlatformIdleState
PopFxUpdateProcessorIdleState
ViFilterDispatchGeneric
ViFilterDispatchPnp
ViFilterDispatchPower