IopUpdateFunctionPointers
VOID __stdcall IopUpdateFunctionPointers(UINT64 FunctionType, UINT8 Enable, UINT8 LockAcquired){
int v5;
int v6;
volatile __int32 *v7;
__int32 v8;
__int32 v9;
_KLOCK_QUEUE_HANDLE LockHandle;
v5 = FunctionType;
memset(&LockHandle, 0, sizeof(LockHandle));
if( !LockAcquired )
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&stru_140C452E0 + 213, &LockHandle);
if( Enable )
v6 = v5 | *(&stru_140CF2E80 + 1624);
else
v6 = *(&stru_140CF2E80 + 1624) & ~v5;
*(&stru_140CF2E80 + 1624) = v6;
if( (v6 & 1) != 0 )
{
_InterlockedExchange(&IopDispatchAllocateIrp, 1);
_InterlockedExchange(&IopDispatchCallDriver, 1);
v7 = &IopDispatchFreeIrp;
_InterlockedExchange(&IopDispatchCompleteRequest, 1);
v8 = 1;
}
else
{
_InterlockedExchange(&IopDispatchFreeIrp, 0);
v7 = &IopDispatchAllocateIrp;
v9 = (*(&stru_140CF2E80 + 6496) & 2) != 0 ? 3 : 0;
_InterlockedExchange(&IopDispatchCallDriver, v9);
_InterlockedExchange(&IopDispatchCompleteRequest, v9);
if( (*(&stru_140CF2E80 + 6496) & 4) != 0 )
v8 = 2;
else
v8 = 0;
}
_InterlockedExchange(v7, v8);
if( !LockAcquired )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
}
}Referenced by:
IoPerfInit
IoPerfReset
IoVerifierInit
IopIrpExtensionControl