/// <summary>
        /// Gets a device capability represented as an array
        /// </summary>
        /// <param name="capability">Capability to retrieve</param>
        /// <returns>value of capability specified in capability argument</returns>
        private T[] GetArrayCapability <T>(DeviceCapability capability, ReadArray <T> readArray, int itemByteSize)
        {
            uint numOutputs = UnsafeNativeMethods.DeviceCapabilitiesW(this._deviceName, this._portName, capability, SafeMemoryHandle.Null, this._devMode);

            if (numOutputs < 1)
            {
                return(Array.Empty <T>());
            }

            HGlobalBuffer buffer = new HGlobalBuffer((int)(numOutputs * itemByteSize));

            try
            {
                numOutputs = UnsafeNativeMethods.DeviceCapabilitiesW(this._deviceName, this._portName, capability, buffer.Handle, this._devMode);
                if (numOutputs >= 0)
                {
                    return(readArray(buffer, itemByteSize));
                }
            }
            finally
            {
                buffer.Release();
            }

            return(null);
        }
 /// <summary>
 /// Gets a device capability represented as an array
 /// </summary>
 /// <typeparam name="T">Capability item type</typeparam>
 /// <param name="capability">Capability to retrieve</param>
 /// <param name="readItem">Delegate to marshal a single capability item from unmanaged memory</param>
 /// <returns>An array of capabilities specified by the capability arg or null if the call fails</returns>
 private T[] GetArrayCapability <T>(DeviceCapability capability, ReadArray <T> readItem) where T : struct
 {
     return(GetArrayCapability <T>(capability, readItem, Marshal.SizeOf(typeof(T))));
 }