private int GetMoveRects(int bufferSizeBytes, out OutputDuplicateMoveRectangle[] moveRects)
            {
                int moveRectsBufferSizeRequired = 0;

                moveRects = new OutputDuplicateMoveRectangle[0];
                if (bufferSizeBytes <= 0)
                {
                    return(moveRectsBufferSizeRequired);
                }

                var moveItemSize         = Marshal.SizeOf(typeof(OutputDuplicateMoveRectangle));
                var maxMoveRectItemCount = bufferSizeBytes / moveItemSize;

                if (maxMoveRectItemCount > 0)
                {
                    var moveRectBuf = new OutputDuplicateMoveRectangle[maxMoveRectItemCount];

                    try
                    {
                        deskDupl.GetFrameMoveRects(bufferSizeBytes, moveRectBuf, out moveRectsBufferSizeRequired);
                    }
                    catch (SharpDXException ex)
                    {
                        if (ex.ResultCode == SharpDX.DXGI.ResultCode.MoreData)
                        {
                            logger.Error(ex);

                            // TODO:
                            //maxMoveRectItemCount = moveRectsBufferSizeRequired / moveItemSize;
                            //moveRectBuf = new OutputDuplicateMoveRectangle[maxMoveRectItemCount];
                            // continue...
                        }

                        throw;
                    }


                    var moveCount = moveRectsBufferSizeRequired / moveItemSize;

                    if (moveCount > 0)
                    {
                        if (maxMoveRectItemCount > moveCount)
                        {
                            moveRects = moveRectBuf.Take(moveCount).ToArray();
                        }
                        else
                        {
                            moveRects = moveRectBuf;
                        }
                    }
                }

                return(moveRectsBufferSizeRequired);
            }