ホーム › Devices.Usb › HUB_DEVICE_CONFIG_INFO
HUB_DEVICE_CONFIG_INFO
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| Version | DWORD | 4 | +0 | +0 | 本構成情報構造体のバージョン番号。 |
| Length | DWORD | 4 | +4 | +4 | 構造体全体のバイト長。可変長部分を含む総サイズ。 |
| HubFlags | USB_HUB_CAP_FLAGS | 4 | +8 | +8 | ハブの機能を示すUSB_HUB_CAP_FLAGSフラグ集合。 |
| HardwareIds | USB_ID_STRING | 16/12 | +12 | +12 | ハブのハードウェアID文字列情報。 |
| CompatibleIds | USB_ID_STRING | 16/12 | +28 | +24 | ハブの互換ID文字列情報。 |
| DeviceDescription | USB_ID_STRING | 16/12 | +44 | +36 | ハブのデバイス説明文字列情報。 |
| Reserved | DWORD | 76 | +60 | +48 | 将来拡張用の予約領域。0を設定する。 |
| UxdSettings | USB_HUB_DEVICE_UXD_SETTINGS | 68 | +136 | +124 | ハブに関連するUXD割り当て設定。 |
各言語での定義
#include <windows.h>
// USB_HUB_CAP_FLAGS (x64 4 / x86 4 バイト)
#pragma pack(push, 1)
typedef struct USB_HUB_CAP_FLAGS {
DWORD ul;
_Anonymous_e__Struct Anonymous;
} USB_HUB_CAP_FLAGS;
#pragma pack(pop)
// USB_ID_STRING (x64 16 / x86 12 バイト)
#pragma pack(push, 1)
typedef struct USB_ID_STRING {
WORD LanguageId;
WORD Pad;
DWORD LengthInBytes;
LPWSTR Buffer;
} USB_ID_STRING;
#pragma pack(pop)
// USB_HUB_DEVICE_UXD_SETTINGS (x64 68 / x86 68 バイト)
#pragma pack(push, 1)
typedef struct USB_HUB_DEVICE_UXD_SETTINGS {
DWORD Version;
GUID PnpGuid;
GUID OwnerGuid;
DWORD DeleteOnShutdown;
DWORD DeleteOnReload;
DWORD DeleteOnDisconnect;
DWORD Reserved[5];
} USB_HUB_DEVICE_UXD_SETTINGS;
#pragma pack(pop)
// HUB_DEVICE_CONFIG_INFO (x64 204 / x86 192 バイト)
#pragma pack(push, 1)
typedef struct HUB_DEVICE_CONFIG_INFO {
DWORD Version;
DWORD Length;
USB_HUB_CAP_FLAGS HubFlags;
USB_ID_STRING HardwareIds;
USB_ID_STRING CompatibleIds;
USB_ID_STRING DeviceDescription;
DWORD Reserved[19];
USB_HUB_DEVICE_UXD_SETTINGS UxdSettings;
} HUB_DEVICE_CONFIG_INFO;
#pragma pack(pop)using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
public struct USB_HUB_CAP_FLAGS
{
public uint ul;
public _Anonymous_e__Struct Anonymous;
}
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
public struct USB_ID_STRING
{
public ushort LanguageId;
public ushort Pad;
public uint LengthInBytes;
public IntPtr Buffer;
}
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
public struct USB_HUB_DEVICE_UXD_SETTINGS
{
public uint Version;
public Guid PnpGuid;
public Guid OwnerGuid;
public uint DeleteOnShutdown;
public uint DeleteOnReload;
public uint DeleteOnDisconnect;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] public uint[] Reserved;
}
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
public struct HUB_DEVICE_CONFIG_INFO
{
public uint Version;
public uint Length;
public USB_HUB_CAP_FLAGS HubFlags;
public USB_ID_STRING HardwareIds;
public USB_ID_STRING CompatibleIds;
public USB_ID_STRING DeviceDescription;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 19)] public uint[] Reserved;
public USB_HUB_DEVICE_UXD_SETTINGS UxdSettings;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Unicode)>
Public Structure USB_HUB_CAP_FLAGS
Public ul As UInteger
Public Anonymous As _Anonymous_e__Struct
End Structure
<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Unicode)>
Public Structure USB_ID_STRING
Public LanguageId As UShort
Public Pad As UShort
Public LengthInBytes As UInteger
Public Buffer As IntPtr
End Structure
<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Unicode)>
Public Structure USB_HUB_DEVICE_UXD_SETTINGS
Public Version As UInteger
Public PnpGuid As Guid
Public OwnerGuid As Guid
Public DeleteOnShutdown As UInteger
Public DeleteOnReload As UInteger
Public DeleteOnDisconnect As UInteger
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=5)> Public Reserved() As UInteger
End Structure
<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Unicode)>
Public Structure HUB_DEVICE_CONFIG_INFO
Public Version As UInteger
Public Length As UInteger
Public HubFlags As USB_HUB_CAP_FLAGS
Public HardwareIds As USB_ID_STRING
Public CompatibleIds As USB_ID_STRING
Public DeviceDescription As USB_ID_STRING
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=19)> Public Reserved() As UInteger
Public UxdSettings As USB_HUB_DEVICE_UXD_SETTINGS
End Structureimport ctypes
from ctypes import wintypes
class USB_HUB_CAP_FLAGS(ctypes.Structure):
_pack_ = 1
_fields_ = [
("ul", wintypes.DWORD),
("Anonymous", _Anonymous_e__Struct),
]
class USB_ID_STRING(ctypes.Structure):
_pack_ = 1
_fields_ = [
("LanguageId", ctypes.c_ushort),
("Pad", ctypes.c_ushort),
("LengthInBytes", wintypes.DWORD),
("Buffer", ctypes.c_void_p),
]
class USB_HUB_DEVICE_UXD_SETTINGS(ctypes.Structure):
_pack_ = 1
_fields_ = [
("Version", wintypes.DWORD),
("PnpGuid", GUID),
("OwnerGuid", GUID),
("DeleteOnShutdown", wintypes.DWORD),
("DeleteOnReload", wintypes.DWORD),
("DeleteOnDisconnect", wintypes.DWORD),
("Reserved", wintypes.DWORD * 5),
]
class HUB_DEVICE_CONFIG_INFO(ctypes.Structure):
_pack_ = 1
_fields_ = [
("Version", wintypes.DWORD),
("Length", wintypes.DWORD),
("HubFlags", USB_HUB_CAP_FLAGS),
("HardwareIds", USB_ID_STRING),
("CompatibleIds", USB_ID_STRING),
("DeviceDescription", USB_ID_STRING),
("Reserved", wintypes.DWORD * 19),
("UxdSettings", USB_HUB_DEVICE_UXD_SETTINGS),
]#[repr(C, packed(1))]
pub struct USB_HUB_CAP_FLAGS {
pub ul: u32,
pub Anonymous: _Anonymous_e__Struct,
}
#[repr(C, packed(1))]
pub struct USB_ID_STRING {
pub LanguageId: u16,
pub Pad: u16,
pub LengthInBytes: u32,
pub Buffer: *mut core::ffi::c_void,
}
#[repr(C, packed(1))]
pub struct USB_HUB_DEVICE_UXD_SETTINGS {
pub Version: u32,
pub PnpGuid: GUID,
pub OwnerGuid: GUID,
pub DeleteOnShutdown: u32,
pub DeleteOnReload: u32,
pub DeleteOnDisconnect: u32,
pub Reserved: [u32; 5],
}
#[repr(C, packed(1))]
pub struct HUB_DEVICE_CONFIG_INFO {
pub Version: u32,
pub Length: u32,
pub HubFlags: USB_HUB_CAP_FLAGS,
pub HardwareIds: USB_ID_STRING,
pub CompatibleIds: USB_ID_STRING,
pub DeviceDescription: USB_ID_STRING,
pub Reserved: [u32; 19],
pub UxdSettings: USB_HUB_DEVICE_UXD_SETTINGS,
}import "golang.org/x/sys/windows"
type USB_HUB_CAP_FLAGS struct {
ul uint32
Anonymous _Anonymous_e__Struct
}
type USB_ID_STRING struct {
LanguageId uint16
Pad uint16
LengthInBytes uint32
Buffer uintptr
}
type USB_HUB_DEVICE_UXD_SETTINGS struct {
Version uint32
PnpGuid windows.GUID
OwnerGuid windows.GUID
DeleteOnShutdown uint32
DeleteOnReload uint32
DeleteOnDisconnect uint32
Reserved [5]uint32
}
type HUB_DEVICE_CONFIG_INFO struct {
Version uint32
Length uint32
HubFlags USB_HUB_CAP_FLAGS
HardwareIds USB_ID_STRING
CompatibleIds USB_ID_STRING
DeviceDescription USB_ID_STRING
Reserved [19]uint32
UxdSettings USB_HUB_DEVICE_UXD_SETTINGS
}type
USB_HUB_CAP_FLAGS = packed record
ul: DWORD;
Anonymous: _Anonymous_e__Struct;
end;
USB_ID_STRING = packed record
LanguageId: Word;
Pad: Word;
LengthInBytes: DWORD;
Buffer: Pointer;
end;
USB_HUB_DEVICE_UXD_SETTINGS = packed record
Version: DWORD;
PnpGuid: TGUID;
OwnerGuid: TGUID;
DeleteOnShutdown: DWORD;
DeleteOnReload: DWORD;
DeleteOnDisconnect: DWORD;
Reserved: array[0..4] of DWORD;
end;
HUB_DEVICE_CONFIG_INFO = packed record
Version: DWORD;
Length: DWORD;
HubFlags: USB_HUB_CAP_FLAGS;
HardwareIds: USB_ID_STRING;
CompatibleIds: USB_ID_STRING;
DeviceDescription: USB_ID_STRING;
Reserved: array[0..18] of DWORD;
UxdSettings: USB_HUB_DEVICE_UXD_SETTINGS;
end;const USB_HUB_CAP_FLAGS = extern struct {
ul: u32,
Anonymous: _Anonymous_e__Struct,
};
const USB_ID_STRING = extern struct {
LanguageId: u16,
Pad: u16,
LengthInBytes: u32,
Buffer: ?*anyopaque,
};
const USB_HUB_DEVICE_UXD_SETTINGS = extern struct {
Version: u32,
PnpGuid: GUID,
OwnerGuid: GUID,
DeleteOnShutdown: u32,
DeleteOnReload: u32,
DeleteOnDisconnect: u32,
Reserved: [5]u32,
};
const HUB_DEVICE_CONFIG_INFO = extern struct {
Version: u32,
Length: u32,
HubFlags: USB_HUB_CAP_FLAGS,
HardwareIds: USB_ID_STRING,
CompatibleIds: USB_ID_STRING,
DeviceDescription: USB_ID_STRING,
Reserved: [19]u32,
UxdSettings: USB_HUB_DEVICE_UXD_SETTINGS,
};type
USB_HUB_CAP_FLAGS {.packed.} = object
ul: uint32
Anonymous: _Anonymous_e__Struct
USB_ID_STRING {.packed.} = object
LanguageId: uint16
Pad: uint16
LengthInBytes: uint32
Buffer: pointer
USB_HUB_DEVICE_UXD_SETTINGS {.packed.} = object
Version: uint32
PnpGuid: GUID
OwnerGuid: GUID
DeleteOnShutdown: uint32
DeleteOnReload: uint32
DeleteOnDisconnect: uint32
Reserved: array[5, uint32]
HUB_DEVICE_CONFIG_INFO {.packed.} = object
Version: uint32
Length: uint32
HubFlags: USB_HUB_CAP_FLAGS
HardwareIds: USB_ID_STRING
CompatibleIds: USB_ID_STRING
DeviceDescription: USB_ID_STRING
Reserved: array[19, uint32]
UxdSettings: USB_HUB_DEVICE_UXD_SETTINGSalign(1)
struct USB_HUB_CAP_FLAGS
{
uint ul;
_Anonymous_e__Struct Anonymous;
}
align(1)
struct USB_ID_STRING
{
ushort LanguageId;
ushort Pad;
uint LengthInBytes;
void* Buffer;
}
align(1)
struct USB_HUB_DEVICE_UXD_SETTINGS
{
uint Version;
GUID PnpGuid;
GUID OwnerGuid;
uint DeleteOnShutdown;
uint DeleteOnReload;
uint DeleteOnDisconnect;
uint[5] Reserved;
}
align(1)
struct HUB_DEVICE_CONFIG_INFO
{
uint Version;
uint Length;
USB_HUB_CAP_FLAGS HubFlags;
USB_ID_STRING HardwareIds;
USB_ID_STRING CompatibleIds;
USB_ID_STRING DeviceDescription;
uint[19] Reserved;
USB_HUB_DEVICE_UXD_SETTINGS UxdSettings;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; HUB_DEVICE_CONFIG_INFO サイズ: 192 バイト(x86)
dim st, 48 ; 4byte整数×48(構造体サイズ 192 / 4 切り上げ)
; Version : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; Length : DWORD (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; HubFlags : USB_HUB_CAP_FLAGS (+8, 4byte) varptr(st)+8 を基点に操作(4byte:入れ子/配列)
; HardwareIds : USB_ID_STRING (+12, 12byte) varptr(st)+12 を基点に操作(12byte:入れ子/配列)
; CompatibleIds : USB_ID_STRING (+24, 12byte) varptr(st)+24 を基点に操作(12byte:入れ子/配列)
; DeviceDescription : USB_ID_STRING (+36, 12byte) varptr(st)+36 を基点に操作(12byte:入れ子/配列)
; Reserved : DWORD (+48, 76byte) varptr(st)+48 を基点に操作(76byte:入れ子/配列)
; UxdSettings : USB_HUB_DEVICE_UXD_SETTINGS (+124, 68byte) varptr(st)+124 を基点に操作(68byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; HUB_DEVICE_CONFIG_INFO サイズ: 204 バイト(x64)
dim st, 51 ; 4byte整数×51(構造体サイズ 204 / 4 切り上げ)
; Version : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; Length : DWORD (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; HubFlags : USB_HUB_CAP_FLAGS (+8, 4byte) varptr(st)+8 を基点に操作(4byte:入れ子/配列)
; HardwareIds : USB_ID_STRING (+12, 16byte) varptr(st)+12 を基点に操作(16byte:入れ子/配列)
; CompatibleIds : USB_ID_STRING (+28, 16byte) varptr(st)+28 を基点に操作(16byte:入れ子/配列)
; DeviceDescription : USB_ID_STRING (+44, 16byte) varptr(st)+44 を基点に操作(16byte:入れ子/配列)
; Reserved : DWORD (+60, 76byte) varptr(st)+60 を基点に操作(76byte:入れ子/配列)
; UxdSettings : USB_HUB_DEVICE_UXD_SETTINGS (+136, 68byte) varptr(st)+136 を基点に操作(68byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global USB_ID_STRING, pack=1
#field short LanguageId
#field short Pad
#field int LengthInBytes
#field intptr Buffer
#endstruct
#defstruct global GUID, pack=1
#field int Data1
#field short Data2
#field short Data3
#field byte Data4 8
#endstruct
#defstruct global USB_HUB_DEVICE_UXD_SETTINGS, pack=1
#field int Version
#field GUID PnpGuid
#field GUID OwnerGuid
#field int DeleteOnShutdown
#field int DeleteOnReload
#field int DeleteOnDisconnect
#field int Reserved 5
#endstruct
#defstruct global HUB_DEVICE_CONFIG_INFO, pack=1
#field int Version
#field int Length
#field byte HubFlags 4
#field USB_ID_STRING HardwareIds
#field USB_ID_STRING CompatibleIds
#field USB_ID_STRING DeviceDescription
#field int Reserved 19
#field USB_HUB_DEVICE_UXD_SETTINGS UxdSettings
#endstruct
stdim st, HUB_DEVICE_CONFIG_INFO ; NSTRUCT 変数を確保
st->Version = 100
mes "Version=" + st->Version
; ※union フィールドは byte 列で確保(NSTRUCT は union 非対応)。必要に応じ手動でアクセス。