@msdn=http://search.microsoft.com/search/results.aspx?qu=$$$ @pinvoke=http://pinvoke.net/$$$.htm Summary: Used with DeviceIoControl and [IOCTL_USB_GET_NODE_INFORMATION] to get connection-related information about a port on a USB Hub !!!!C# Definition: // We need a separate struct to hold the union due to the fact that on 64-bit USB_HUB_NODE gets marshaled // as 8 bytes while on 32-bit it gets marshaled as 4 bytes. We cannot explicitly lay out the members of this // struct since FieldOffset requires a constant but here FieldOffset might be 4 or 8 depending on the platform. [StructLayout(LayoutKind.Sequential)] struct USB_NODE_INFORMATION { public USB_HUB_NODE NodeType; /* hub, mi parent */ public UsbNodeUnion u; } // Simpler version if you do not care about USB_MI_PARENT_INFORMATION [StructLayout(LayoutKind.Sequential)] struct USB_NODE_INFORMATION { public int NodeType; public USB_HUB_INFORMATION HubInformation; // Yeah, I'm assuming we'll just use the first form } !!!!VB Definition: Structure USB_NODE_INFORMATION Public TODO End Structure !!!!User-Defined Field Types: enum USB_HUB_NODE : uint { UsbHub, UsbMIParent } [StructLayout(LayoutKind.Sequential)] struct USB_MI_PARENT_INFORMATION { public uint NumberOfInterfaces; }; // Separate union where we explicitly lay out the members [StructLayout(LayoutKind.Explicit)] struct UsbNodeUnion { [FieldOffset(0)] public USB_HUB_INFORMATION HubInformation; [FieldOffset(0)] public USB_MI_PARENT_INFORMATION MiParentInformation; } !!!!Notes: Although this is a nested structure (and a Union too), you might find it easier to use if you just pick one of the forms typedef struct _USB_NODE_INFORMATION { USB_HUB_NODE NodeType; union { USB_HUB_INFORMATION HubInformation; USB_MI_PARENT_INFORMATION MiParentInformation; } u; } USB_NODE_INFORMATION, *PUSB_NODE_INFORMATION; Documentation: USB_NODE_INFORMATION@msdn on MSDN !!!!Example: IntPtr h = CreateFile(Root.HubDevicePath, GENERIC_WRITE, FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero); if (h.ToInt32() != INVALID_HANDLE_VALUE) { USB_NODE_INFORMATION NodeInfo = new USB_NODE_INFORMATION(); NodeInfo.NodeType = (int)USB_HUB_NODE.UsbHub; int nBytes = Marshal.SizeOf(NodeInfo); IntPtr ptrNodeInfo = Marshal.AllocHGlobal(nBytes); Marshal.StructureToPtr(NodeInfo, ptrNodeInfo, true); // get the Hub Information if (DeviceIoControl(h2, IOCTL_USB_GET_NODE_INFORMATION, ptrNodeInfo, nBytes, ptrNodeInfo, nBytes, out nBytesReturned, IntPtr.Zero)) { NodeInfo = (USB_NODE_INFORMATION)Marshal.PtrToStructure(ptrNodeInfo, typeof(USB_NODE_INFORMATION)); // Do something here } Marshal.FreeHGlobal(ptrNodeInfo); CloseHandle(h); }
Edit Structures.USB_NO...
You do not have permission to change this page. If you feel this is in error, please send feedback with the contact link on the main page.