/// <summary>
        /// Direct write to hardware USB pipes (low level). Not recommended for application use if you do not know what you do.
        /// </summary>
        /// <param name="overlapped"></param>
        /// <returns></returns>
        public virtual string RKSWritePipe(NativeCanEntryPoints.LPOVERLAPPED pOverlapped)
        {
            const int capacity             = 128;
            var       pucBuffer            = new StringBuilder(capacity);
            var       pdwLengthTransferred = new int();

            Procedure <NativeCanEntryPoints.RKSWritePipe>(NativeCanEntryPoints._RKSWritePipe)(pucBuffer, capacity,
                                                                                              ref pdwLengthTransferred, ref pOverlapped);

            return(pucBuffer.ToString());
        }
        /// <summary>
        /// Direct read from hardware USB pipes (low level). Not recommended for application use if you do not know what you do.
        /// </summary>
        /// <returns></returns>
        public virtual string RKSReadPipe(out NativeCanEntryPoints.LPOVERLAPPED pOverlapped)
        {
            const int capacity = 128;
            var       sb       = new StringBuilder(capacity);

            pOverlapped = new NativeCanEntryPoints.LPOVERLAPPED();
            int pdwLengthTransferred = new int();
            var result = Procedure <NativeCanEntryPoints.RKSReadPipe>(NativeCanEntryPoints._RKSReadPipe)(sb, capacity,
                                                                                                         ref pdwLengthTransferred, ref pOverlapped);

            if (!result)
            {
                throw new Exception();
            }

            return(sb.ToString().Substring(0, pdwLengthTransferred));
        }