WriteFile 返回错误代码 87

2024-03-30

我正在开发一个写入 HID 设备的程序,但收到错误 87,WriteFile 函数参数无效。我从 Jan Axelson 的 USB Complete 获得了这些功能,所以我不确定为什么会收到错误。 我用它来查找我的设备:

private void USBInit()
    {
        IntPtr deviceInfoSet;
        Int32 memberIndex = 0;
        SP_DEVICE_INTERFACE_DATA MyDeviceInterfaceData = new SP_DEVICE_INTERFACE_DATA();
        Int32 bufferSize = 0;
        IntPtr detailDataBuffer;
        Boolean success = false;
        deviceFound = false;

        HidD_GetHidGuid(ref hidGuid);           // Get the GUID

        deviceInfoSet = SetupDiGetClassDevs     // Get pointer to a device info set
            (ref hidGuid,
            IntPtr.Zero,
            IntPtr.Zero,
            DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);

        do
        {
            MyDeviceInterfaceData.cbSize = Marshal.SizeOf(MyDeviceInterfaceData);   // Identify Device Interface
            success = SetupDiEnumDeviceInterfaces
                (deviceInfoSet,
                IntPtr.Zero,
                ref hidGuid,
                memberIndex,
                ref MyDeviceInterfaceData);

            success = SetupDiGetDeviceInterfaceDetail           // Request Structure with Device Path Name
                (deviceInfoSet,
                ref MyDeviceInterfaceData,
                IntPtr.Zero,
                0,
                ref bufferSize,
                IntPtr.Zero);

            detailDataBuffer = Marshal.AllocHGlobal(bufferSize);
            Marshal.WriteInt32(detailDataBuffer, (IntPtr.Size == 4) ? (4 + Marshal.SystemDefaultCharSize) : 8);

            success = SetupDiGetDeviceInterfaceDetail
                (deviceInfoSet,
                ref MyDeviceInterfaceData,
                detailDataBuffer,
                bufferSize,
                ref bufferSize,
                IntPtr.Zero);

            IntPtr pDevicePathName = new IntPtr(detailDataBuffer.ToInt32() + 4);
            devicePathName = Marshal.PtrToStringAuto(pDevicePathName);
            Marshal.FreeHGlobal(detailDataBuffer);

            /* Request Communications Handle */
            deviceHandle = CreateFile
                (devicePathName,
                (GENERIC_WRITE | GENERIC_READ),
                FILE_SHARE_READ | FILE_SHARE_WRITE,
                IntPtr.Zero,
                OPEN_EXISTING,
                FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
                0);

            /* Get Vendor ID and Product ID */
            DeviceAttributes.Size = Marshal.SizeOf(DeviceAttributes);
            success = HidD_GetAttributes(deviceHandle, ref DeviceAttributes);

            // Compare Vendor ID and Product ID.
            if ((DeviceAttributes.VendorID == myVendorID) && (DeviceAttributes.ProductID == myProductID))
            {
                MessageBoxResult res = System.Windows.MessageBox.Show("Device Found", "K-IX", MessageBoxButton.OK);
                deviceFound = true;

                /* Get pointer to capabilities */
                success = HidD_GetPreparsedData(deviceHandle, ref preparsedData);

                /* Get Device Capabilities */
                Int32 result = 0;
                result = HidP_GetCaps(preparsedData, ref Capabilities);

                return;
            }
            else
            {
                // Not my device
                memberIndex++;
                deviceHandle.Close();
                if (memberIndex == 128)
                { break; }
            }
        } while (!deviceFound);
    }

这是我用来尝试发送到设备的代码:

private void SendUSB()
    {
        Int32 numberOfBytesWritten = 0;
        Byte[] outputReportBuffer = null;
        Boolean success;
        Boolean success2;
        // Set size of the Output report buffer.
        Array.Resize(ref outputReportBuffer, Capabilities.InputReportByteLength);

        // Store Report ID in first byte of header.
        outputReportBuffer[0] = 0;

        // Store report data following the Report ID.
        outputReportBuffer[1] = 0x01;
        //outputReportBuffer[2] = 0x02;
       // outputReportBuffer[3] = 0x03;
        // Send Report
        success = WriteFile
            (deviceHandle,
            outputReportBuffer,
            outputReportBuffer.Length,
            ref numberOfBytesWritten,
            IntPtr.Zero);

        if (!success)
        {
            Int32 lastError = Marshal.GetLastWin32Error();
        }
        success2 = HidD_FreePreparsedData(preparsedData);
    }

我已经验证了该设备的预期报告长度为 2,但我不确定从哪里开始,因为 USB 和 HID 编程对我来说是新的。


您在 CreateFile() 调用中指定了 FILE_FLAG_OVERLAPPED,但在 WriteFile() 调用中为 lpOverlapped 参数传递了 null。那是不合法的。

删除 FILE_FLAG_OVERLAPPED 选项。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WriteFile 返回错误代码 87 的相关文章

随机推荐

  • Angular2访问父组件的@input值

    我正在尝试使用 ComponentResolver 和 ViewContainerRef 服务动态加载组件 子组件加载正常并且模板已渲染 但是我想访问子组件内父级 字段 和 值 的输入 任何帮助将非常感激 父组件 import Compon
  • 如何在 Scala 中使用 >=> ?

    我正在尝试使用 gt gt Kleisli 箭头 在 Scala 中 据我了解 它由返回单子的函数组成 现在我正在尝试如下 scala gt val f i Int gt Some i 1 f Int gt Some Int
  • JFormattedTextField 未正确清除

    我正在做这个作业 制作一个解决数独的程序 我有一个带有 SudokuTextBox 网格扩展 JFormattedTextField 的面板 我有一个 MaskFormatter 因此每个文本框只接受一个整数 然后在我的面板中 当释放按键时
  • 如何跨 AppDomain 边界传递 CancellationToken?

    我有一个命令对象 根据请求队列中的请求执行工作 此特定命令将在子应用程序域中执行其工作 在子应用程序域中执行其工作的一部分涉及阻塞 ConcurrentQueue 操作 例如 添加或获取 我需要能够通过请求队列将中止信号传播到子应用程序域
  • ASP.NET MVC 3 中 ModelState.IsValid 的限制

    我总是用ModelState IsValid用于检查我在服务器端正确验证的所有模型验证 但我认为使用它有一个限制 例如我定义一个Remote验证属性 但如果我禁用javascript then ModelState IsValid不勾选Re
  • Python:有没有办法阻止从 int 到 long int 的自动转换发生?

    考虑这个例子 gt gt gt from sys import maxint gt gt gt type maxint
  • 如何在 Android 上使用 onPause?

    using onSaveInstanceState Bundle and onRestoreInstanceState Bundle was really good and work but it is working when click
  • Java 堆空间与 GSON

    我正在使用 GSON 创建一些大的 JSON 文件 以从 GTFS Google Transit 创建自定义 JSON 问题是当我从对象类转换为 JSON 时 Gson gson new Gson String rutasJSON gson
  • 用于测试是否正在构建应用程序扩展的预处理器宏是什么?

    这个问题纯粹基于公开发布的有关 iOS 中应用程序扩展引入的文档 随着引入应用程序扩展 https developer apple com library prerelease ios documentation General Conce
  • AppCompat v7:21 拆分操作栏损坏?

    我目前正在开发一个应用程序 其中使用经过大量修改的拆分操作栏 以下是应用程序当前状态的链接 您会注意到顶部有一个透明的操作栏 其中有一个自定义视图 底部有一个拆分在一起的操作栏 底部视图实际上是一个单独的操作项 其中包含一个自定义视图 并且
  • 如何设置gridview行颜色,我尝试过,但它显示强制转换无效?

    protected void gvcolors RowDataBound object sender GridViewRowEventArgs e if e Row RowType DataControlRowType DataRow in
  • 如何添加UIActionSheet按钮复选标记?

    我想知道如何以最简单的方式在 actionSheet 按钮右侧添加复选标记 下面是截图Podcasts app 请注意 该解决方案可能会在将来的 iOS 更新中崩溃 我是 访问未记录的私有 API 这样的解决方案非常脆弱 请参阅下面的评论
  • 如何将密码文本与 bcrypt 哈希值进行比较?

    我的应用程序中有一个用例 应该阻止用户在重置密码时选择最近 3 个密码之一 我使用 Angular 作为前端 使用 Spring Boot 作为后端 在我的场景中 用户密码存储为 bcrypt 哈希 如何将用户输入的密码与最近存储的 3 个
  • 如何替换R数据框中多列中的多个值?

    假设我有以下数据框 真正的数据框是 10 个 labelx 列 id lt c 1 2 3 4 5 6 7 8 label1 lt c apple shoe banana hat dog radio tree pie label2 lt c
  • 当焦点从角度输入中移出时触发验证?

    当我们不断在文本框中输入内容时 电子邮件验证将被触发 我希望当用户将焦点移出文本框时触发此验证 下面是我的代码
  • 有没有一种好的方法可以在Linux中禁止屏幕保护程序?

    我正在寻找一种体面的 不蹩脚的方式来抑制 xscreensaver kscreensaver 或 gnome screensaver 无论哪一个可能正在运行 最好以与屏幕保护程序无关的方式 并且它绝对必须执行fast 我读过xscreens
  • 如何使用ABAddressBook删除iPhone通讯录中的记录?

    我正在学习地址簿框架 然后我想从iPhone通讯录中删除记录 我检查了文档并发现了一个名为ABAddressBookRemoveRecord 但我找不到删除记录的方法 比如用户选择一条记录 然后点击删除按钮 然后该记录就会被删除 到目前为止
  • 安卓 |内容观察者 |内容 URI 不包含资源 ID

    我正在尝试检测 Android 应用程序上的屏幕截图 我使用 contentObserver 来检测媒体目录中的更改 而不是使用 FileObserver 因为已知问题 https code google com p android iss
  • 通过 Internet 发送 UDP 数据包

    我正在尝试了解 P2P 去中心化网络的一些细节 我的问题如下 假设我有两台名为 comp1 和 comp2 的机器 现在 comp1 设置在我的家庭网络中的路由器后面 comp2 位于我的办公室中 也位于路由器后面 我是否可以像这样在 In
  • WriteFile 返回错误代码 87

    我正在开发一个写入 HID 设备的程序 但收到错误 87 WriteFile 函数参数无效 我从 Jan Axelson 的 USB Complete 获得了这些功能 所以我不确定为什么会收到错误 我用它来查找我的设备 private vo