IopCancelIrpsInFileObjectList
UINT64 __stdcall IopCancelIrpsInFileObjectList(
_FILE_OBJECT *FileObject,
_EPROCESS *Process,
_IO_STATUS_BLOCK *IoRequestToCancel,
_ETHREAD *Thread,
UINT8 Wait,
UINT8 Cleanup){
unsigned __int64 *p_IrpListLock;
_ETHREAD *v8;
_LIST_ENTRY *hintEntry;
unsigned __int8 v10;
_LIST_ENTRY *p_IrpList;
_LIST_ENTRY *v12;
UINT8 v14;
PIRP v15;
PVOID v16;
PVOID v17;
PVOID v18;
int v19;
unsigned int v20;
PIRP Irp;
_LARGE_INTEGER Interval;
int(__fastcall *DriverInit)(_DRIVER_OBJECT *, _UNICODE_STRING *);
int v24;
v24 = 1;
p_IrpListLock = &FileObject->IrpListLock;
Irp = 0i64;
DriverInit = 0i64;
v20 = 0;
v8 = Thread;
Interval.QuadPart = -10000i64;
hintEntry = 0i64;
v10 = KeAcquireSpinLockRaiseToDpc(&FileObject->IrpListLock);
if( Cleanup )
FileObject->Flags |= 0x400u;
p_IrpList = &FileObject->IrpList;
while( 1 )
{
v12 = hintEntry;
if( p_IrpList->Flink == p_IrpList )
break;
v14 = IopCheckListForCancelableIrp(&FileObject->IrpList, Process, IoRequestToCancel, v8, hintEntry, &Irp);
v15 = Irp;
hintEntry = 0i64;
if( !Irp )
{
if( !Wait )
break;
if( v14 )
{
if( !v12 )
break;
}
else
{
DriverInit = FileObject->DeviceObject->DriverObject->DriverInit;
KxReleaseSpinLock(p_IrpListLock);
__writecr8(v10);
KeDelayExecutionThread(0, 0, &Interval);
v19 = v24;
if( v24 < 100 )
{
v24 *= 2;
Interval.QuadPart = -20000 * v19;
}
v10 = KeAcquireSpinLockRaiseToDpc(p_IrpListLock);
}
goto LABEL_23;
}
if( !Irp->Cancel )
{
v20 = 1;
Irp->Cancel = 1;
KxReleaseSpinLock(p_IrpListLock);
__writecr8(v10);
IoCancelIrp((_KDPC *)v15, v16, v17, v18);
v10 = KeAcquireSpinLockRaiseToDpc(p_IrpListLock);
}
if( (v15->Flags & 0x2000) != 0 )
hintEntry = v15->ThreadListEntry.Flink;
if( !(unsigned int)IopInterlockedAdd((UINT64 *)&v15->Overlay, 0xFFFFFFFFi64) )
IoFreeIrp(v15);
v8 = Thread;
if( hintEntry == p_IrpList )
{
if( !Wait )
break;
hintEntry = 0i64;
LABEL_23:
v8 = Thread;
}
}
KxReleaseSpinLock(p_IrpListLock);
__writecr8(v10);
return v20;
}Referenced by:
IopCleanupProcessResources
IopRevokeFileObjectForProcess
NtCancelIoFile
NtCancelIoFileEx