IopCancelApcRequired
VOID __fastcall IopCancelApcRequired(_ETHREAD *Thread, _FILE_OBJECT *FileObject, _IO_STATUS_BLOCK *IoRequestToCancel){
unsigned __int64 *p_IrpListLock;
unsigned __int64 v7;
_LIST_ENTRY *Flink;
p_IrpListLock = &Thread->IrpListLock;
v7 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc(&Thread->IrpListLock);
Flink = Thread->IrpList.Flink;
if( Flink != &Thread->IrpList && (IoRequestToCancel || FileObject) )
{
do
{
if( ((__int64)Flink[-1].Flink & 2) == 0
&& ((_IO_STATUS_BLOCK *)Flink[2].Blink == IoRequestToCancel
&& (!FileObject || (_FILE_OBJECT *)Flink[10].Flink == FileObject)
|| !IoRequestToCancel && (_FILE_OBJECT *)Flink[10].Flink == FileObject) )
{
break;
}
Flink = Flink->Flink;
}
while( &Thread->IrpList != Flink );
}
KxReleaseSpinLock(p_IrpListLock);
__writecr8(v7);
}Referenced by:
IopCancelIrpsInThreadListForCurrentProcess
IopCancelSynchronousIrpsForThread