IopCancelIrpsInCurrentThreadListSpecialApc

NTSTATUS __fastcall IopCancelIrpsInCurrentThreadListSpecialApc(__int64 a1, __int64 a2, __int64 a3, _BYTE **a4){
  _ETHREAD *CurrentThread; 
  _BYTE *v6; 
  char v7; 
  unsigned __int64 v8; 
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *v10; 
  _LIST_ENTRY *v11; 
  _LIST_ENTRY *v13; 
  int v14; 
  _LIST_ENTRY *v15; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v6 = *a4;
  v7 = 0;
  v8 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc(&CurrentThread->IrpListLock);
  Flink = CurrentThread->IrpList.Flink;
  *v6 = 0;
  *(_DWORD *)(a1 + 132) = 0;
  if( &CurrentThread->IrpList == Flink )
  {
    KxReleaseSpinLock(&CurrentThread->IrpListLock);
    __writecr8(v8);
  }
  else
  {
    do
    {
      if( SBYTE3(Flink[2].Flink) < SBYTE2(Flink[2].Flink) + 2 )
      {
        v10 = *(_LIST_ENTRY **)(a1 + 96);
        if( !v10 || Flink[2].Blink == v10 )
        {
          v13 = *(_LIST_ENTRY **)(a1 + 88);
          if( !v13 || Flink[10].Flink == v13 )
          {
            v14 = (int)Flink[-1].Flink;
            if( (v14 & 0x402) == 0 && ((v14 & 0x84) != 0 || (HIBYTE(Flink[2].Flink) & 2) != 0) )
            {
              BYTE4(Flink[2].Flink) = 1;
              v7 = 1;
              *v6 = 1;
              *(_DWORD *)(a1 + 132) = 1;
            }
          }
        }
        if( !*(_BYTE *)(a1 + 128) )
        {
          v11 = *(_LIST_ENTRY **)(a1 + 96);
          if( !v11 || Flink[2].Blink == v11 )
          {
            v15 = *(_LIST_ENTRY **)(a1 + 88);
            if( (!v15 || Flink[10].Flink == v15) && ((__int64)Flink[-1].Flink & 2) == 0 )
            {
              *v6 = 1;
              *(_DWORD *)(a1 + 132) = 1;
            }
          }
        }
      }
      Flink = Flink->Flink;
    }
    while( &CurrentThread->IrpList != Flink );
    KxReleaseSpinLock(&CurrentThread->IrpListLock);
    __writecr8(v8);
    if( v7 )
      KeAlertThread((INT64)CurrentThread, 0);
  }
  return KeSetEvent((PRKEVENT)(a1 + 104), 0, 0);
}

Referenced by:

No references.