IopIrpExtensionControl
VOID __stdcall IopIrpExtensionControl(UINT64 Flags, UINT64 Enable){
int v2;
int v3;
bool v4;
UINT8 v5;
struct _KLOCK_QUEUE_HANDLE LockHandle;
v2 = Enable;
v3 = Flags;
memset(&LockHandle, 0, sizeof(LockHandle));
KeAcquireInStackQueuedSpinLock(&IopFunctionPointerLock, &LockHandle);
if( v2 == 1 )
{
v4 = IopIrpExtensionStatus == 0;
IopIrpExtensionStatus |= v3;
if( (v3 & 1) != 0 )
++dword_140CF47EC;
if( (v3 & 2) != 0 )
++dword_140CF47F0;
if( v4 )
{
v5 = 1;
LABEL_16:
IopUpdateFunctionPointers(4ui64, v5, 1u);
}
}
else
{
if( (v3 & 1) != 0 && !--dword_140CF47EC )
IopIrpExtensionStatus &= ~1u;
if( (v3 & 2) != 0 && !--dword_140CF47F0 )
IopIrpExtensionStatus &= ~2u;
if( !IopIrpExtensionStatus )
{
v5 = 0;
goto LABEL_16;
}
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
}Referenced by:
IoRegisterIoTracking
IoUnregisterIoTracking
IopEtwEnableCallback