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.