IopCancelIrpsInCurrentThreadList
VOID __fastcall IopCancelIrpsInCurrentThreadList(
_FILE_OBJECT *FileObject,
_ETHREAD *CurrentThread,
_IO_STATUS_BLOCK *IoRequestToCancel,
UINT8 SynchronousOnly){
unsigned __int64 *p_IrpListLock;
unsigned __int8 v8;
_LIST_ENTRY *i;
PVOID v10;
PVOID v11;
PVOID v12;
int Flink;
p_IrpListLock = &CurrentThread->IrpListLock;
v8 = KeAcquireSpinLockRaiseToDpc(&CurrentThread->IrpListLock);
for( i = CurrentThread->IrpList.Flink; &CurrentThread->IrpList != i; i = i->Flink )
{
if( SBYTE3(i[2].Flink) < SBYTE2(i[2].Flink) + 2 )
{
if( SynchronousOnly )
{
if( FileObject && (_FILE_OBJECT *)i[10].Flink != FileObject )
continue;
if( IoRequestToCancel && (_IO_STATUS_BLOCK *)i[2].Blink != IoRequestToCancel )
continue;
Flink = (int)i[-1].Flink;
if( (Flink & 0x402) != 0 || (Flink & 0x84) == 0 && (HIBYTE(i[2].Flink) & 2) == 0 )
continue;
}
else if( ((__int64)i[-1].Flink & 2) != 0
|| FileObject && (_FILE_OBJECT *)i[10].Flink != FileObject
|| IoRequestToCancel && (_IO_STATUS_BLOCK *)i[2].Blink != IoRequestToCancel )
{
continue;
}
KxReleaseSpinLock(p_IrpListLock);
__writecr8(1ui64);
IoCancelIrp((_KDPC *)&i[-2], v10, v11, v12);
KeGetCurrentIrql();
__writecr8(2ui64);
KxAcquireSpinLock(p_IrpListLock);
}
}
KxReleaseSpinLock(p_IrpListLock);
__writecr8(v8);
}Referenced by:
IopCancelIrpsInCurrentThreadListApcRoutine
IopCancelIrpsInThreadList