Win32 API 日本語リファレンス
ホームDevices.Usb › USB_TOPOLOGY_ADDRESS

USB_TOPOLOGY_ADDRESS

構造体
サイズx64: 32 バイト / x86: 32 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
PciBusNumberDWORD4+0+0ホストコントローラのPCIバス番号を示す。
PciDeviceNumberDWORD4+4+4ホストコントローラのPCIデバイス番号を示す。
PciFunctionNumberDWORD4+8+8ホストコントローラのPCIファンクション番号を示す。
ReservedDWORD4+12+12予約フィールド。
RootHubPortNumberWORD2+16+16ルートハブのポート番号を示す。
HubPortNumberWORD10+18+18各階層のハブポート番号を示す配列。
Reserved2WORD2+28+28予約フィールド。

各言語での定義

#include <windows.h>

// USB_TOPOLOGY_ADDRESS  (x64 32 / x86 32 バイト)
typedef struct USB_TOPOLOGY_ADDRESS {
    DWORD PciBusNumber;
    DWORD PciDeviceNumber;
    DWORD PciFunctionNumber;
    DWORD Reserved;
    WORD RootHubPortNumber;
    WORD HubPortNumber[5];
    WORD Reserved2;
} USB_TOPOLOGY_ADDRESS;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct USB_TOPOLOGY_ADDRESS
{
    public uint PciBusNumber;
    public uint PciDeviceNumber;
    public uint PciFunctionNumber;
    public uint Reserved;
    public ushort RootHubPortNumber;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] public ushort[] HubPortNumber;
    public ushort Reserved2;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure USB_TOPOLOGY_ADDRESS
    Public PciBusNumber As UInteger
    Public PciDeviceNumber As UInteger
    Public PciFunctionNumber As UInteger
    Public Reserved As UInteger
    Public RootHubPortNumber As UShort
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=5)> Public HubPortNumber() As UShort
    Public Reserved2 As UShort
End Structure
import ctypes
from ctypes import wintypes

class USB_TOPOLOGY_ADDRESS(ctypes.Structure):
    _fields_ = [
        ("PciBusNumber", wintypes.DWORD),
        ("PciDeviceNumber", wintypes.DWORD),
        ("PciFunctionNumber", wintypes.DWORD),
        ("Reserved", wintypes.DWORD),
        ("RootHubPortNumber", ctypes.c_ushort),
        ("HubPortNumber", ctypes.c_ushort * 5),
        ("Reserved2", ctypes.c_ushort),
    ]
#[repr(C)]
pub struct USB_TOPOLOGY_ADDRESS {
    pub PciBusNumber: u32,
    pub PciDeviceNumber: u32,
    pub PciFunctionNumber: u32,
    pub Reserved: u32,
    pub RootHubPortNumber: u16,
    pub HubPortNumber: [u16; 5],
    pub Reserved2: u16,
}
import "golang.org/x/sys/windows"

type USB_TOPOLOGY_ADDRESS struct {
	PciBusNumber uint32
	PciDeviceNumber uint32
	PciFunctionNumber uint32
	Reserved uint32
	RootHubPortNumber uint16
	HubPortNumber [5]uint16
	Reserved2 uint16
}
type
  USB_TOPOLOGY_ADDRESS = record
    PciBusNumber: DWORD;
    PciDeviceNumber: DWORD;
    PciFunctionNumber: DWORD;
    Reserved: DWORD;
    RootHubPortNumber: Word;
    HubPortNumber: array[0..4] of Word;
    Reserved2: Word;
  end;
const USB_TOPOLOGY_ADDRESS = extern struct {
    PciBusNumber: u32,
    PciDeviceNumber: u32,
    PciFunctionNumber: u32,
    Reserved: u32,
    RootHubPortNumber: u16,
    HubPortNumber: [5]u16,
    Reserved2: u16,
};
type
  USB_TOPOLOGY_ADDRESS {.bycopy.} = object
    PciBusNumber: uint32
    PciDeviceNumber: uint32
    PciFunctionNumber: uint32
    Reserved: uint32
    RootHubPortNumber: uint16
    HubPortNumber: array[5, uint16]
    Reserved2: uint16
struct USB_TOPOLOGY_ADDRESS
{
    uint PciBusNumber;
    uint PciDeviceNumber;
    uint PciFunctionNumber;
    uint Reserved;
    ushort RootHubPortNumber;
    ushort[5] HubPortNumber;
    ushort Reserved2;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; USB_TOPOLOGY_ADDRESS サイズ: 32 バイト(x64)
dim st, 8    ; 4byte整数×8(構造体サイズ 32 / 4 切り上げ)
; PciBusNumber : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; PciDeviceNumber : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; PciFunctionNumber : DWORD (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; Reserved : DWORD (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; RootHubPortNumber : WORD (+16, 2byte)  wpoke st,16,値  /  値 = wpeek(st,16)
; HubPortNumber : WORD (+18, 10byte)  varptr(st)+18 を基点に操作(10byte:入れ子/配列)
; Reserved2 : WORD (+28, 2byte)  wpoke st,28,値  /  値 = wpeek(st,28)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global USB_TOPOLOGY_ADDRESS
    #field int PciBusNumber
    #field int PciDeviceNumber
    #field int PciFunctionNumber
    #field int Reserved
    #field short RootHubPortNumber
    #field short HubPortNumber 5
    #field short Reserved2
#endstruct

stdim st, USB_TOPOLOGY_ADDRESS        ; NSTRUCT 変数を確保
st->PciBusNumber = 100
mes "PciBusNumber=" + st->PciBusNumber