internal FileIoCompletionResult(FileIoCompletionInformation result)
 {
     KeyContext    = result.KeyContext;
     ApcContext    = result.ApcContext;
     IoStatusBlock = new IoStatus()
     {
         Information = result.IoStatusBlock.Information,
         Pointer     = result.IoStatusBlock.Pointer
     };
 }
        /// <summary>
        /// Remove multiple queued status from the queue.
        /// </summary>
        /// <param name="max_count">Maximum number of status to remove.</param>
        /// <param name="timeout">An optional timeout.</param>
        /// <param name="alertable">Indicate whether the wait is alertable.</param>
        /// <param name="throw_on_error">True to throw on error.</param>
        /// <returns>Array of completion results. Length can be &lt;= max_count.</returns>
        public NtResult <FileIoCompletionResult[]> Remove(int max_count, NtWaitTimeout timeout, bool alertable, bool throw_on_error)
        {
            IoStatus io_status = new IoStatus();

            FileIoCompletionInformation[] result = new FileIoCompletionInformation[max_count];

            return(NtSystemCalls.NtRemoveIoCompletionEx(Handle, result, max_count,
                                                        out int result_count, timeout.ToLargeInteger(), alertable).CreateResult(throw_on_error, () =>
                                                                                                                                result.Take(result_count).Select(r => new FileIoCompletionResult(r)).ToArray()));
        }
        /// <summary>
        /// Remove multiple queued status from the queue.
        /// </summary>
        /// <param name="max_count">Maximum number of status to remove.</param>
        /// <param name="timeout">An optional timeout.</param>
        /// <param name="alertable">Indicate whether the wait is alertable.</param>
        /// <returns>Array of completion results. Length can be &lt;= max_count. If timeout then returns an empty array.</returns>
        public FileIoCompletionResult[] Remove(int max_count, NtWaitTimeout timeout, bool alertable)
        {
            IoStatus io_status = new IoStatus();

            FileIoCompletionInformation[] result = new FileIoCompletionInformation[max_count];
            int result_count = 0;

            NtStatus status = NtSystemCalls.NtRemoveIoCompletionEx(Handle, result, max_count,
                                                                   out result_count, timeout.ToLargeInteger(), alertable).ToNtException();

            if (status == NtStatus.STATUS_SUCCESS)
            {
                return(result.Take(result_count).Select(r => new FileIoCompletionResult(r)).ToArray());
            }
            return(new FileIoCompletionResult[0]);
        }