【问题标题】:c# USB parsing of a _URB_BULK_OR_INTERRUPT_TRANSFER packetc# USB解析_URB_BULK_OR_INTERRUPT_TRANSFER数据包
【发布时间】:2011-12-02 23:54:01
【问题描述】:

我正在使用以下代码解析 http://msdn.microsoft.com/en-us/library/windows/hardware/ff540352(v=vs.85).aspx 中定义的 _URB_BULK_OR_INTERRUPT_TRANSFER 数据包:

            //parse URB Packet
            /*
            _URB_HEADER {
            USHORT      Length;
            USHORT      Function;
            USBD_STATUS Status;
            PVOID       UsbdDeviceHandle;
            ULONG       UsbdFlags;
            }*/

            //start header parse
            UInt16 urb_length = rdr.ReadUInt16();
            UInt16 urb_function = rdr.ReadUInt16();
            UInt32 urb_status = rdr.ReadUInt32();
            rdr.ReadBytes(System.IntPtr.Size);
            UInt32 UsbdFlags = rdr.ReadUInt32();
            //end header parse

            //.. skip code to check if it a _URB_BULK_OR_INTERRUPT_TRANSFER 
            // but assuming it is parse it

            /*struct _URB_BULK_OR_INTERRUPT_TRANSFER {
            struct URB_HEADER  Hdr;//covered above
            USBD_PIPE_HANDLE    PipeHandle;
            ULONG               TransferFlags;
            ULONG               TransferBufferLength;
            PVOID               TransferBuffer;
            PMDL                TransferBufferMDL;
            struct URB  *UrbLink;
            struct URB_HCD_AREA  hca;
            }*/

            rdr.ReadBytes(System.IntPtr.Size);
            UInt32 TransferFlags = rdr.ReadUInt32();
            UInt32 TransferBufferLength = rdr.ReadUInt32();
            byte[] ptr_bytes = rdr.ReadBytes(System.IntPtr.Size);
            System.IntPtr ptr_transfer_buffer = new System.IntPtr(BitConverter.ToUInt32(ptr_bytes, 0));
            ptr_bytes = rdr.ReadBytes(System.IntPtr.Size);
            System.IntPtr mdl_transfer_buffer = new System.IntPtr(BitConverter.ToUInt32(ptr_bytes, 0))

在读取所有值时检查它们,在 PMDL void 指针之前,大多数值似乎是明智的。这最终是一个很大的负数,而不是 0 (NULL) 或有效地址。谁能指出我为什么会发生这种情况的正确方向?谢谢。

【问题讨论】:

    标签: c# windows usb


    【解决方案1】:

    MDL 对象是仅在内核模式下可用的内存描述符。由于用户/内核模式分离,x86 系统(没有 3GB 开关)上超过 2 GB 的虚拟地址位于内核虚拟地址空间中。

    【讨论】:

    • 谢谢,我不知道。那么是否无法读取指向的传输缓冲区?
    • 没有。没有内核驱动程序的帮助,这是不可能的。但是你想用这个做什么?您是如何从内核模式获取此缓冲区的快照的?
    • 我正在使用 USB 嗅探库(来自 HHD),它调用 URB 事件并提供数据包。我正在尝试捕获原始数据。
    • @Richard:这是一个解释 MDL 的 MS 页面:msdn.microsoft.com/en-us/windows/hardware/gg463193 正如 Christopher 所说,您只能从内核驱动程序访问它
    • 嗅探器工具会有某种接口将MDL中的数据读入用户态内存。
    【解决方案2】:

    我不太明白你的问题... TransferBufferMDL 用于 DirectIO 情况,而 TransferBuffer 用于缓冲 IO。

    所以这两个中的一个永远是无效的。

    希望这会有所帮助!

    【讨论】:

    • 感谢您的回答。是的,我知道其中一个总是无效的,但该值是一个很大的负数,我假设这意味着我以某种方式读错了它(我期待 0 表示无效)。
    • 嗯,它是一个指针,所以这是完全可能的。任何大于 0x7FFFFFFF 的十六进制值都将显示为负数(最高位是符号)
    • 但是指向负地址的指针不是无效 - 还是我遗漏了什么?
    • 没有。指针 > 0x7FFFFFFF 最有可能在内核虚拟地址空间中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 2012-12-21
    • 2017-09-27
    • 1970-01-01
    • 2018-08-06
    • 2013-05-23
    • 2012-03-25
    相关资源
    最近更新 更多