Esempio n. 1
0
        //コントロール転送でレポートをセットする

        /*
         * 引数
         *      reportType:	Featureレポート、Outputレポートの区別。
         *      reportID:	レポートID。
         *      dataBytes:	送信するデータ。下記備考参照。
         *      addReportIdByte:	dataBytesの先頭にレポートIDを加えるかどうか。
         * 備考
         *      addReportIdByteをtrueとするとき、dataBytesはレポートIDを含まないbyte配列であること。
         *      addReportIdByteをfalseとするとき、dataBytesはレポートIDを含んだbyte配列であること。
         */
        private bool SetReport(ReportType reportType, byte reportID, byte[] dataBytes, bool addReportIdByte)
        {
            if (!(reportType == ReportType.Feature || reportType == ReportType.Output))
            {
                return(false);
            }

            SafeFileHandle hHidDev = DeviceAccess.Open(devInfo.DevicePath, CFF.GENERIC_WRITE);

            if (hHidDev.IsInvalid)
            {
                return(false);
            }

            int    reportLength = dataBytes.Length + (addReportIdByte ? 1 : 0);
            IntPtr pGlobalBuf   = IntPtr.Zero;
            bool   isOK         = false;

            try
            {
                pGlobalBuf = Marshal.AllocHGlobal(reportLength);
                IntPtr pStart = addReportIdByte ? new IntPtr(pGlobalBuf.ToInt32() + 1) : pGlobalBuf;
                Marshal.Copy(dataBytes, 0, pStart, dataBytes.Length);
                Marshal.WriteByte(pGlobalBuf, 0, reportID);
                isOK = HiddSetReport(reportType, hHidDev, pGlobalBuf, reportLength);
            }
            catch { }
            finally { Marshal.FreeHGlobal(pGlobalBuf); }

            hHidDev.Close();
            return(isOK);
        }
Esempio n. 2
0
        //コントロール転送でレポートを取得する

        /*
         * 引数
         *      reportType:	Featureレポート、Inputレポートの区別。
         *      reportID:	レポートID。
         *      reportLength:	取得するレポートの長さ。レポートIDの分1byteを含めた長さであること。
         *      cutReportIdByte:	取得したbyte配列からレポートIDの要素をカットするかどうか。
         */
        private byte[] GetReport(ReportType reportType, byte reportID, int reportLength, bool cutReportIdByte)
        {
            if (!(reportType == ReportType.Feature || reportType == ReportType.Input))
            {
                return(null);
            }

            SafeFileHandle hHidDev = DeviceAccess.Open(devInfo.DevicePath, CFF.GENERIC_READ);

            if (hHidDev.IsInvalid)
            {
                return(null);
            }

            IntPtr pGlobalBuf = IntPtr.Zero;

            byte[] rBuf = null;
            try
            {
                pGlobalBuf = Marshal.AllocHGlobal(reportLength);
                Marshal.WriteByte(pGlobalBuf, 0, reportID);
                if (HiddGetReport(reportType, hHidDev, pGlobalBuf, reportLength))
                {
                    IntPtr pStart = cutReportIdByte ? new IntPtr(pGlobalBuf.ToInt32() + 1) : pGlobalBuf;
                    rBuf = new byte[cutReportIdByte ? reportLength - 1 : reportLength];
                    Marshal.Copy(pStart, rBuf, 0, rBuf.Length);
                }
            }
            catch { rBuf = null; }
            finally { Marshal.FreeHGlobal(pGlobalBuf); }

            hHidDev.Close();
            return(rBuf);
        }