NtRemoveIoCompletionEx

NTSTATUS __stdcall NtRemoveIoCompletionEx(
        VOID *IoCompletionHandle,
        _FILE_IO_COMPLETION_INFORMATION *IoCompletionInformation,
        UINT64 Count,
        UINT64 *NumEntriesRemoved,
        _LARGE_INTEGER *Timeout,
        UINT8 Alertable){
  __int64 v7; 
  INT64 v10; 
  char PreviousMode; 
  INT64 *Pool_2; 
  int v13; 
  __int64 v15; 
  char NumEntriesRemoveda[12]; 
  __int64 v17; 
  PVOID IoCompletionPtr; 
  _LIST_ENTRY *EntryArray[16]; 

  v7 = (unsigned int)Count;
  v10 = (INT64)Timeout;
  memset(EntryArray, 0i64, sizeof(EntryArray));
  v17 = 0i64;
  *(_DWORD *)NumEntriesRemoveda = 0;
  if( (unsigned int)(v7 - 1) > 0x7FFFFFE )
    return -1073741811;
  *(_QWORD *)&NumEntriesRemoveda[4] = 0i64;
  PreviousMode = KeGetCurrentThread()->PreviousMode;
  if( PreviousMode )
  {
    ProbeForWrite((UINT64)IoCompletionInformation, 32 * v7, 8i64);
    v15 = (__int64)NumEntriesRemoved;
    if( (unsigned __int64)NumEntriesRemoved >= 0x7FFFFFFF0000i64 )
      v15 = 0x7FFFFFFF0000i64;
    *(_DWORD *)v15 = *(_DWORD *)v15;
    if( Timeout )
    {
      *(_QWORD *)&NumEntriesRemoveda[4] = &v17;
      if( (unsigned __int64)Timeout >= 0x7FFFFFFF0000i64 )
        v10 = 0x7FFFFFFF0000i64;
      v17 = *(_QWORD *)v10;
    }
    v10 = *(_QWORD *)&NumEntriesRemoveda[4];
  }
  else if( !Timeout )
  {
    v10 = *(_QWORD *)&NumEntriesRemoveda[4];
  }
  if( (unsigned int)v7 > 0x10 )
  {
    Pool_2 = (INT64 *)IopVerifierExAllocatePool_2(0i64, 8 * v7);
    if( Pool_2 )
      goto LABEL_7;
    LODWORD(v7) = 16;
  }
  Pool_2 = (INT64 *)EntryArray;
LABEL_7:
  IoCompletionPtr = 0i64;
  v13 = ObReferenceObjectByHandle(
          IoCompletionHandle,
          2ui64,
          IoCompletionObjectType,
          PreviousMode,
          &IoCompletionPtr,
          0i64);
  if( v13 >= 0 )
  {
    v13 = IoRemoveIoCompletion(
            (UINT64)IoCompletionPtr,
            (INT64)IoCompletionInformation,
            Pool_2,
            (unsigned int)v7,
            (UINT64 *)NumEntriesRemoveda,
            PreviousMode,
            v10,
            Alertable);
    HalPutDmaAdapter((PADAPTER_OBJECT)IoCompletionPtr);
  }
  if( Pool_2 != (INT64 *)EntryArray )
    ExFreePoolWithTag(Pool_2, 0);
  if( v13 >= 0 )
    *(_DWORD *)NumEntriesRemoved = *(_DWORD *)NumEntriesRemoveda;
  return v13;
}

Referenced by:

No references.