NtCancelIoFile
NTSTATUS __stdcall NtCancelIoFile(VOID *FileHandle, _IO_STATUS_BLOCK *IoStatusBlock){
char v4;
_ETHREAD *CurrentThread;
INT8 PreviousMode;
__int64 v7;
NTSTATUS result;
void *v9;
void *v10;
void *v11;
_ETHREAD *v12;
unsigned __int8 CurrentIrql;
_LIST_ENTRY *p_IrpList;
_LIST_ENTRY *i;
char v16;
unsigned __int8 v17;
_LIST_ENTRY *j;
_FILE_OBJECT *v19;
_FILE_OBJECT *pFileObject;
_LARGE_INTEGER Interval;
pFileObject = 0i64;
v4 = 0;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
PreviousMode = CurrentThread->Tcb.PreviousMode;
if( PreviousMode )
{
v7 = 0x7FFFFFFF0000i64;
if( (unsigned __int64)IoStatusBlock < 0x7FFFFFFF0000i64 )
v7 = (__int64)IoStatusBlock;
*(_DWORD *)v7 = *(_DWORD *)v7;
}
result = IopReferenceFileObject(FileHandle, 0i64, PreviousMode, &pFileObject, 0i64);
if( result >= 0 )
{
v12 = (_ETHREAD *)KeGetCurrentThread();
++v12->Tcb.OtherOperationCount;
__incgsdword(0x2EE4u);
CurrentIrql = KeGetCurrentIrql();
__writecr8(1ui64);
p_IrpList = &CurrentThread->IrpList;
for( i = p_IrpList->Flink; p_IrpList != i; i = i->Flink )
{
if( (_FILE_OBJECT *)i[10].Flink == pFileObject )
{
v4 = 1;
IoCancelIrp((_KDPC *)&i[-2], v9, v10, v11);
}
}
__writecr8(CurrentIrql);
if( v4 )
{
Interval.QuadPart = -100000i64;
while( 1 )
{
v16 = 0;
v17 = KeGetCurrentIrql();
__writecr8(1ui64);
for( j = p_IrpList->Flink; p_IrpList != j; j = j->Flink )
{
if( (_FILE_OBJECT *)j[10].Flink == pFileObject )
{
v16 = 1;
break;
}
}
__writecr8(v17);
if( !v16 )
break;
KeDelayExecutionThread(0, 0, &Interval);
}
}
v19 = pFileObject;
IopCancelIrpsInFileObjectList(
pFileObject,
KeGetCurrentThread()->ApcState.Process,
0i64,
(_ETHREAD *)KeGetCurrentThread(),
1u,
0);
IoStatusBlock->Status = 0;
IoStatusBlock->Information = 0i64;
HalPutDmaAdapter((PADAPTER_OBJECT)v19);
return 0;
}
return result;
}Referenced by:
No references.