FsRtlNotifySetCancelRoutine

VOID __fastcall FsRtlNotifySetCancelRoutine(_IRP *NotifyIrp, _NOTIFY_CHANGE_LITE *Notify){
  INT64 v2; 
  __int64 v5; 
  unsigned __int8 CancelIrql; 

  NotifyIrp->CancelIrql = KeAcquireQueuedSpinLock(7i64, (INT64)Notify, v2);
  if( Notify )
  {
    v5 = _InterlockedExchange64((volatile __int64 *)&NotifyIrp->CancelRoutine, 0i64);
    CancelIrql = NotifyIrp->CancelIrql;
    NotifyIrp->IoStatus.Information = 0i64;
    KeReleaseQueuedSpinLock(LockQueueIoCancelLock, CancelIrql);
    if( v5 )
      _InterlockedDecrement(Notify + 28);
  }
  else if( NotifyIrp->Cancel )
  {
    FsRtlCancelNotify(0i64, NotifyIrp);
  }
  else
  {
    _InterlockedExchange64((volatile __int64 *)&NotifyIrp->CancelRoutine, (__int64)FsRtlCancelNotify);
    KeReleaseQueuedSpinLock(LockQueueIoCancelLock, NotifyIrp->CancelIrql);
  }
}

Referenced by:

FsRtlNotifyCompleteIrp
FsRtlNotifyFilterChangeDirectory
FsRtlNotifyFilterChangeDirectoryLite