【发布时间】:2016-10-02 05:37:33
【问题描述】:
我正在修改一些查询设备树并报告设备功能的代码,特别是 USB 端口及其速度。我从 DeviceIoControl 调用中取回了 _USB_NODE_CONNECTION_INFORMATION_EX 对象,但它错误地将 USB 3.0 报告为高速。进一步的研究表明,我需要从 DeviceIoControl 获取 _USB_NODE_CONNECTION_INFORMATION_EX_V2 结构以适应 USB 3.0。我正在尝试将新结构从 C 映射到 C#,并且对如何处理作为新(ish)_USB_NODE_CONNECTION_INFORMATION_EX_V2 结构成员存在的两个 C 联合有点困惑。
我在大学里学过 C 哦,比如说,差不多 20 年前。我的大部分职业生涯都在 Powerbuilder(别笑那是很久以前)、Java(别笑那是很久以前),但主要是 C#。任何 C 大师都可以帮助我将这些带有联合的结构映射到 C# 结构中,并可能给我一个关于如何编组它们的线索吗?请注意,我已经映射了 _USB_NODE_CONNECTION_INFORMATION_EX_V2 但并不真正知道如何处理 _USB_PROTOCOLS 和 _USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS 结构。最好将 _USB_PROTOCOLS 结构映射到 C# Flags 枚举中,这样我也可以按位使用 and's 和 or's。
下面的代码显示了注释掉的 C typedef 和我在 C# 中的相应结构(未注释和......好吧,未完成:()。提前谢谢大家!
//typedef struct _USB_NODE_CONNECTION_INFORMATION_EX_V2
//{
// ULONG ConnectionIndex;
// ULONG Length;
// USB_PROTOCOLS SupportedUsbProtocols;
// USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS Flags;
//}
//USB_NODE_CONNECTION_INFORMATION_EX_V2, *PUSB_NODE_CONNECTION_INFORMATION_EX_V2;
struct USB_NODE_CONNECTION_INFORMATION_EX_V2
{
public int ConnectionIndex;
public int Length;
public USB_PROTOCOLS SupportedUsbProtocols;
public USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS Flags;
}
//typedef union _USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS {
// ULONG ul;
// struct {
// ULONG DeviceIsOperatingAtSuperSpeedOrHigher :1;
// ULONG DeviceIsSuperSpeedCapableOrHigher :1;
// ULONG ReservedMBZ :30;
// };
//}
//USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS, * PUSB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS;
struct USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS
{
}
//typedef union _USB_PROTOCOLS {
// ULONG ul;
// struct {
// ULONG Usb110 :1;
// ULONG Usb200 :1;
// ULONG Usb300 :1;
// ULONG ReservedMBZ :29;
// };
//}
//USB_PROTOCOLS, * PUSB_PROTOCOLS;
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct USB_PROTOCOLS
{
}
【问题讨论】: