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