//コントロール転送でレポートをセットする /* * 引数 * 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); }
//コントロール転送でレポートを取得する /* * 引数 * 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); }