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