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

HCD_STAT_INFORMATION_2

構造体
サイズx64: 120 バイト / x86: 120 バイトパッキング1

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

フィールド

フィールドサイズx64x86説明
Reserved1DWORD4+0+0予約フィールド。未使用。
Reserved2DWORD4+4+4予約フィールド。未使用。
ResetCountersDWORD4+8+8非0を設定するとカウンタをリセットする要求フラグ。
TimeReadLONGLONG8+12+12統計を読み出した時刻(QPCティック等)。
LockedMemoryUsedINT4+20+20ロックされた使用メモリ量(バイト)。
CountersHCD_STAT_COUNTERS24+24+24ホストコントローラの各種統計カウンタ。
IsoCountersHCD_ISO_STAT_COUNTERS72+48+48アイソクロナス転送に関する統計カウンタ。

各言語での定義

#include <windows.h>

// HCD_STAT_COUNTERS  (x64 24 / x86 24 バイト)
#pragma pack(push, 1)
typedef struct HCD_STAT_COUNTERS {
    DWORD BytesTransferred;
    WORD IsoMissedCount;
    WORD DataOverrunErrorCount;
    WORD CrcErrorCount;
    WORD ScheduleOverrunCount;
    WORD TimeoutErrorCount;
    WORD InternalHcErrorCount;
    WORD BufferOverrunErrorCount;
    WORD SWErrorCount;
    WORD StallPidCount;
    WORD PortDisableCount;
} HCD_STAT_COUNTERS;
#pragma pack(pop)

// HCD_ISO_STAT_COUNTERS  (x64 72 / x86 72 バイト)
#pragma pack(push, 1)
typedef struct HCD_ISO_STAT_COUNTERS {
    WORD LateUrbs;
    WORD DoubleBufferedPackets;
    WORD TransfersCF_5ms;
    WORD TransfersCF_2ms;
    WORD TransfersCF_1ms;
    WORD MaxInterruptLatency;
    WORD BadStartFrame;
    WORD StaleUrbs;
    WORD IsoPacketNotAccesed;
    WORD IsoPacketHWError;
    WORD SmallestUrbPacketCount;
    WORD LargestUrbPacketCount;
    WORD IsoCRC_Error;
    WORD IsoOVERRUN_Error;
    WORD IsoINTERNAL_Error;
    WORD IsoUNKNOWN_Error;
    DWORD IsoBytesTransferred;
    WORD LateMissedCount;
    WORD HWIsoMissedCount;
    DWORD Reserved7[8];
} HCD_ISO_STAT_COUNTERS;
#pragma pack(pop)

// HCD_STAT_INFORMATION_2  (x64 120 / x86 120 バイト)
#pragma pack(push, 1)
typedef struct HCD_STAT_INFORMATION_2 {
    DWORD Reserved1;
    DWORD Reserved2;
    DWORD ResetCounters;
    LONGLONG TimeRead;
    INT LockedMemoryUsed;
    HCD_STAT_COUNTERS Counters;
    HCD_ISO_STAT_COUNTERS IsoCounters;
} HCD_STAT_INFORMATION_2;
#pragma pack(pop)
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
public struct HCD_STAT_COUNTERS
{
    public uint BytesTransferred;
    public ushort IsoMissedCount;
    public ushort DataOverrunErrorCount;
    public ushort CrcErrorCount;
    public ushort ScheduleOverrunCount;
    public ushort TimeoutErrorCount;
    public ushort InternalHcErrorCount;
    public ushort BufferOverrunErrorCount;
    public ushort SWErrorCount;
    public ushort StallPidCount;
    public ushort PortDisableCount;
}

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
public struct HCD_ISO_STAT_COUNTERS
{
    public ushort LateUrbs;
    public ushort DoubleBufferedPackets;
    public ushort TransfersCF_5ms;
    public ushort TransfersCF_2ms;
    public ushort TransfersCF_1ms;
    public ushort MaxInterruptLatency;
    public ushort BadStartFrame;
    public ushort StaleUrbs;
    public ushort IsoPacketNotAccesed;
    public ushort IsoPacketHWError;
    public ushort SmallestUrbPacketCount;
    public ushort LargestUrbPacketCount;
    public ushort IsoCRC_Error;
    public ushort IsoOVERRUN_Error;
    public ushort IsoINTERNAL_Error;
    public ushort IsoUNKNOWN_Error;
    public uint IsoBytesTransferred;
    public ushort LateMissedCount;
    public ushort HWIsoMissedCount;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public uint[] Reserved7;
}

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
public struct HCD_STAT_INFORMATION_2
{
    public uint Reserved1;
    public uint Reserved2;
    public uint ResetCounters;
    public long TimeRead;
    public int LockedMemoryUsed;
    public HCD_STAT_COUNTERS Counters;
    public HCD_ISO_STAT_COUNTERS IsoCounters;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Unicode)>
Public Structure HCD_STAT_COUNTERS
    Public BytesTransferred As UInteger
    Public IsoMissedCount As UShort
    Public DataOverrunErrorCount As UShort
    Public CrcErrorCount As UShort
    Public ScheduleOverrunCount As UShort
    Public TimeoutErrorCount As UShort
    Public InternalHcErrorCount As UShort
    Public BufferOverrunErrorCount As UShort
    Public SWErrorCount As UShort
    Public StallPidCount As UShort
    Public PortDisableCount As UShort
End Structure

<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Unicode)>
Public Structure HCD_ISO_STAT_COUNTERS
    Public LateUrbs As UShort
    Public DoubleBufferedPackets As UShort
    Public TransfersCF_5ms As UShort
    Public TransfersCF_2ms As UShort
    Public TransfersCF_1ms As UShort
    Public MaxInterruptLatency As UShort
    Public BadStartFrame As UShort
    Public StaleUrbs As UShort
    Public IsoPacketNotAccesed As UShort
    Public IsoPacketHWError As UShort
    Public SmallestUrbPacketCount As UShort
    Public LargestUrbPacketCount As UShort
    Public IsoCRC_Error As UShort
    Public IsoOVERRUN_Error As UShort
    Public IsoINTERNAL_Error As UShort
    Public IsoUNKNOWN_Error As UShort
    Public IsoBytesTransferred As UInteger
    Public LateMissedCount As UShort
    Public HWIsoMissedCount As UShort
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=8)> Public Reserved7() As UInteger
End Structure

<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Unicode)>
Public Structure HCD_STAT_INFORMATION_2
    Public Reserved1 As UInteger
    Public Reserved2 As UInteger
    Public ResetCounters As UInteger
    Public TimeRead As Long
    Public LockedMemoryUsed As Integer
    Public Counters As HCD_STAT_COUNTERS
    Public IsoCounters As HCD_ISO_STAT_COUNTERS
End Structure
import ctypes
from ctypes import wintypes

class HCD_STAT_COUNTERS(ctypes.Structure):
    _pack_ = 1
    _fields_ = [
        ("BytesTransferred", wintypes.DWORD),
        ("IsoMissedCount", ctypes.c_ushort),
        ("DataOverrunErrorCount", ctypes.c_ushort),
        ("CrcErrorCount", ctypes.c_ushort),
        ("ScheduleOverrunCount", ctypes.c_ushort),
        ("TimeoutErrorCount", ctypes.c_ushort),
        ("InternalHcErrorCount", ctypes.c_ushort),
        ("BufferOverrunErrorCount", ctypes.c_ushort),
        ("SWErrorCount", ctypes.c_ushort),
        ("StallPidCount", ctypes.c_ushort),
        ("PortDisableCount", ctypes.c_ushort),
    ]

class HCD_ISO_STAT_COUNTERS(ctypes.Structure):
    _pack_ = 1
    _fields_ = [
        ("LateUrbs", ctypes.c_ushort),
        ("DoubleBufferedPackets", ctypes.c_ushort),
        ("TransfersCF_5ms", ctypes.c_ushort),
        ("TransfersCF_2ms", ctypes.c_ushort),
        ("TransfersCF_1ms", ctypes.c_ushort),
        ("MaxInterruptLatency", ctypes.c_ushort),
        ("BadStartFrame", ctypes.c_ushort),
        ("StaleUrbs", ctypes.c_ushort),
        ("IsoPacketNotAccesed", ctypes.c_ushort),
        ("IsoPacketHWError", ctypes.c_ushort),
        ("SmallestUrbPacketCount", ctypes.c_ushort),
        ("LargestUrbPacketCount", ctypes.c_ushort),
        ("IsoCRC_Error", ctypes.c_ushort),
        ("IsoOVERRUN_Error", ctypes.c_ushort),
        ("IsoINTERNAL_Error", ctypes.c_ushort),
        ("IsoUNKNOWN_Error", ctypes.c_ushort),
        ("IsoBytesTransferred", wintypes.DWORD),
        ("LateMissedCount", ctypes.c_ushort),
        ("HWIsoMissedCount", ctypes.c_ushort),
        ("Reserved7", wintypes.DWORD * 8),
    ]

class HCD_STAT_INFORMATION_2(ctypes.Structure):
    _pack_ = 1
    _fields_ = [
        ("Reserved1", wintypes.DWORD),
        ("Reserved2", wintypes.DWORD),
        ("ResetCounters", wintypes.DWORD),
        ("TimeRead", ctypes.c_longlong),
        ("LockedMemoryUsed", ctypes.c_int),
        ("Counters", HCD_STAT_COUNTERS),
        ("IsoCounters", HCD_ISO_STAT_COUNTERS),
    ]
#[repr(C, packed(1))]
pub struct HCD_STAT_COUNTERS {
    pub BytesTransferred: u32,
    pub IsoMissedCount: u16,
    pub DataOverrunErrorCount: u16,
    pub CrcErrorCount: u16,
    pub ScheduleOverrunCount: u16,
    pub TimeoutErrorCount: u16,
    pub InternalHcErrorCount: u16,
    pub BufferOverrunErrorCount: u16,
    pub SWErrorCount: u16,
    pub StallPidCount: u16,
    pub PortDisableCount: u16,
}

#[repr(C, packed(1))]
pub struct HCD_ISO_STAT_COUNTERS {
    pub LateUrbs: u16,
    pub DoubleBufferedPackets: u16,
    pub TransfersCF_5ms: u16,
    pub TransfersCF_2ms: u16,
    pub TransfersCF_1ms: u16,
    pub MaxInterruptLatency: u16,
    pub BadStartFrame: u16,
    pub StaleUrbs: u16,
    pub IsoPacketNotAccesed: u16,
    pub IsoPacketHWError: u16,
    pub SmallestUrbPacketCount: u16,
    pub LargestUrbPacketCount: u16,
    pub IsoCRC_Error: u16,
    pub IsoOVERRUN_Error: u16,
    pub IsoINTERNAL_Error: u16,
    pub IsoUNKNOWN_Error: u16,
    pub IsoBytesTransferred: u32,
    pub LateMissedCount: u16,
    pub HWIsoMissedCount: u16,
    pub Reserved7: [u32; 8],
}

#[repr(C, packed(1))]
pub struct HCD_STAT_INFORMATION_2 {
    pub Reserved1: u32,
    pub Reserved2: u32,
    pub ResetCounters: u32,
    pub TimeRead: i64,
    pub LockedMemoryUsed: i32,
    pub Counters: HCD_STAT_COUNTERS,
    pub IsoCounters: HCD_ISO_STAT_COUNTERS,
}
import "golang.org/x/sys/windows"

type HCD_STAT_COUNTERS struct {
	BytesTransferred uint32
	IsoMissedCount uint16
	DataOverrunErrorCount uint16
	CrcErrorCount uint16
	ScheduleOverrunCount uint16
	TimeoutErrorCount uint16
	InternalHcErrorCount uint16
	BufferOverrunErrorCount uint16
	SWErrorCount uint16
	StallPidCount uint16
	PortDisableCount uint16
}

type HCD_ISO_STAT_COUNTERS struct {
	LateUrbs uint16
	DoubleBufferedPackets uint16
	TransfersCF_5ms uint16
	TransfersCF_2ms uint16
	TransfersCF_1ms uint16
	MaxInterruptLatency uint16
	BadStartFrame uint16
	StaleUrbs uint16
	IsoPacketNotAccesed uint16
	IsoPacketHWError uint16
	SmallestUrbPacketCount uint16
	LargestUrbPacketCount uint16
	IsoCRC_Error uint16
	IsoOVERRUN_Error uint16
	IsoINTERNAL_Error uint16
	IsoUNKNOWN_Error uint16
	IsoBytesTransferred uint32
	LateMissedCount uint16
	HWIsoMissedCount uint16
	Reserved7 [8]uint32
}

type HCD_STAT_INFORMATION_2 struct {
	Reserved1 uint32
	Reserved2 uint32
	ResetCounters uint32
	TimeRead int64
	LockedMemoryUsed int32
	Counters HCD_STAT_COUNTERS
	IsoCounters HCD_ISO_STAT_COUNTERS
}
type
  HCD_STAT_COUNTERS = packed record
    BytesTransferred: DWORD;
    IsoMissedCount: Word;
    DataOverrunErrorCount: Word;
    CrcErrorCount: Word;
    ScheduleOverrunCount: Word;
    TimeoutErrorCount: Word;
    InternalHcErrorCount: Word;
    BufferOverrunErrorCount: Word;
    SWErrorCount: Word;
    StallPidCount: Word;
    PortDisableCount: Word;
  end;

  HCD_ISO_STAT_COUNTERS = packed record
    LateUrbs: Word;
    DoubleBufferedPackets: Word;
    TransfersCF_5ms: Word;
    TransfersCF_2ms: Word;
    TransfersCF_1ms: Word;
    MaxInterruptLatency: Word;
    BadStartFrame: Word;
    StaleUrbs: Word;
    IsoPacketNotAccesed: Word;
    IsoPacketHWError: Word;
    SmallestUrbPacketCount: Word;
    LargestUrbPacketCount: Word;
    IsoCRC_Error: Word;
    IsoOVERRUN_Error: Word;
    IsoINTERNAL_Error: Word;
    IsoUNKNOWN_Error: Word;
    IsoBytesTransferred: DWORD;
    LateMissedCount: Word;
    HWIsoMissedCount: Word;
    Reserved7: array[0..7] of DWORD;
  end;

  HCD_STAT_INFORMATION_2 = packed record
    Reserved1: DWORD;
    Reserved2: DWORD;
    ResetCounters: DWORD;
    TimeRead: Int64;
    LockedMemoryUsed: Integer;
    Counters: HCD_STAT_COUNTERS;
    IsoCounters: HCD_ISO_STAT_COUNTERS;
  end;
const HCD_STAT_COUNTERS = extern struct {
    BytesTransferred: u32,
    IsoMissedCount: u16,
    DataOverrunErrorCount: u16,
    CrcErrorCount: u16,
    ScheduleOverrunCount: u16,
    TimeoutErrorCount: u16,
    InternalHcErrorCount: u16,
    BufferOverrunErrorCount: u16,
    SWErrorCount: u16,
    StallPidCount: u16,
    PortDisableCount: u16,
};

const HCD_ISO_STAT_COUNTERS = extern struct {
    LateUrbs: u16,
    DoubleBufferedPackets: u16,
    TransfersCF_5ms: u16,
    TransfersCF_2ms: u16,
    TransfersCF_1ms: u16,
    MaxInterruptLatency: u16,
    BadStartFrame: u16,
    StaleUrbs: u16,
    IsoPacketNotAccesed: u16,
    IsoPacketHWError: u16,
    SmallestUrbPacketCount: u16,
    LargestUrbPacketCount: u16,
    IsoCRC_Error: u16,
    IsoOVERRUN_Error: u16,
    IsoINTERNAL_Error: u16,
    IsoUNKNOWN_Error: u16,
    IsoBytesTransferred: u32,
    LateMissedCount: u16,
    HWIsoMissedCount: u16,
    Reserved7: [8]u32,
};

const HCD_STAT_INFORMATION_2 = extern struct {
    Reserved1: u32,
    Reserved2: u32,
    ResetCounters: u32,
    TimeRead: i64,
    LockedMemoryUsed: i32,
    Counters: HCD_STAT_COUNTERS,
    IsoCounters: HCD_ISO_STAT_COUNTERS,
};
type
  HCD_STAT_COUNTERS {.packed.} = object
    BytesTransferred: uint32
    IsoMissedCount: uint16
    DataOverrunErrorCount: uint16
    CrcErrorCount: uint16
    ScheduleOverrunCount: uint16
    TimeoutErrorCount: uint16
    InternalHcErrorCount: uint16
    BufferOverrunErrorCount: uint16
    SWErrorCount: uint16
    StallPidCount: uint16
    PortDisableCount: uint16

  HCD_ISO_STAT_COUNTERS {.packed.} = object
    LateUrbs: uint16
    DoubleBufferedPackets: uint16
    TransfersCF_5ms: uint16
    TransfersCF_2ms: uint16
    TransfersCF_1ms: uint16
    MaxInterruptLatency: uint16
    BadStartFrame: uint16
    StaleUrbs: uint16
    IsoPacketNotAccesed: uint16
    IsoPacketHWError: uint16
    SmallestUrbPacketCount: uint16
    LargestUrbPacketCount: uint16
    IsoCRC_Error: uint16
    IsoOVERRUN_Error: uint16
    IsoINTERNAL_Error: uint16
    IsoUNKNOWN_Error: uint16
    IsoBytesTransferred: uint32
    LateMissedCount: uint16
    HWIsoMissedCount: uint16
    Reserved7: array[8, uint32]

  HCD_STAT_INFORMATION_2 {.packed.} = object
    Reserved1: uint32
    Reserved2: uint32
    ResetCounters: uint32
    TimeRead: int64
    LockedMemoryUsed: int32
    Counters: HCD_STAT_COUNTERS
    IsoCounters: HCD_ISO_STAT_COUNTERS
align(1)
struct HCD_STAT_COUNTERS
{
    uint BytesTransferred;
    ushort IsoMissedCount;
    ushort DataOverrunErrorCount;
    ushort CrcErrorCount;
    ushort ScheduleOverrunCount;
    ushort TimeoutErrorCount;
    ushort InternalHcErrorCount;
    ushort BufferOverrunErrorCount;
    ushort SWErrorCount;
    ushort StallPidCount;
    ushort PortDisableCount;
}

align(1)
struct HCD_ISO_STAT_COUNTERS
{
    ushort LateUrbs;
    ushort DoubleBufferedPackets;
    ushort TransfersCF_5ms;
    ushort TransfersCF_2ms;
    ushort TransfersCF_1ms;
    ushort MaxInterruptLatency;
    ushort BadStartFrame;
    ushort StaleUrbs;
    ushort IsoPacketNotAccesed;
    ushort IsoPacketHWError;
    ushort SmallestUrbPacketCount;
    ushort LargestUrbPacketCount;
    ushort IsoCRC_Error;
    ushort IsoOVERRUN_Error;
    ushort IsoINTERNAL_Error;
    ushort IsoUNKNOWN_Error;
    uint IsoBytesTransferred;
    ushort LateMissedCount;
    ushort HWIsoMissedCount;
    uint[8] Reserved7;
}

align(1)
struct HCD_STAT_INFORMATION_2
{
    uint Reserved1;
    uint Reserved2;
    uint ResetCounters;
    long TimeRead;
    int LockedMemoryUsed;
    HCD_STAT_COUNTERS Counters;
    HCD_ISO_STAT_COUNTERS IsoCounters;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; HCD_STAT_INFORMATION_2 サイズ: 120 バイト(x64)
dim st, 30    ; 4byte整数×30(構造体サイズ 120 / 4 切り上げ)
; Reserved1 : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; Reserved2 : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; ResetCounters : DWORD (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; TimeRead : LONGLONG (+12, 8byte)  qpoke st,12,値 / qpeek(st,12)  ※IronHSPのみ。3.7/3.8は lpoke st,12,下位 : lpoke st,16,上位
; LockedMemoryUsed : INT (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; Counters : HCD_STAT_COUNTERS (+24, 24byte)  varptr(st)+24 を基点に操作(24byte:入れ子/配列)
; IsoCounters : HCD_ISO_STAT_COUNTERS (+48, 72byte)  varptr(st)+48 を基点に操作(72byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global HCD_STAT_COUNTERS, pack=1
    #field int BytesTransferred
    #field short IsoMissedCount
    #field short DataOverrunErrorCount
    #field short CrcErrorCount
    #field short ScheduleOverrunCount
    #field short TimeoutErrorCount
    #field short InternalHcErrorCount
    #field short BufferOverrunErrorCount
    #field short SWErrorCount
    #field short StallPidCount
    #field short PortDisableCount
#endstruct

#defstruct global HCD_ISO_STAT_COUNTERS, pack=1
    #field short LateUrbs
    #field short DoubleBufferedPackets
    #field short TransfersCF_5ms
    #field short TransfersCF_2ms
    #field short TransfersCF_1ms
    #field short MaxInterruptLatency
    #field short BadStartFrame
    #field short StaleUrbs
    #field short IsoPacketNotAccesed
    #field short IsoPacketHWError
    #field short SmallestUrbPacketCount
    #field short LargestUrbPacketCount
    #field short IsoCRC_Error
    #field short IsoOVERRUN_Error
    #field short IsoINTERNAL_Error
    #field short IsoUNKNOWN_Error
    #field int IsoBytesTransferred
    #field short LateMissedCount
    #field short HWIsoMissedCount
    #field int Reserved7 8
#endstruct

#defstruct global HCD_STAT_INFORMATION_2, pack=1
    #field int Reserved1
    #field int Reserved2
    #field int ResetCounters
    #field int64 TimeRead
    #field int LockedMemoryUsed
    #field HCD_STAT_COUNTERS Counters
    #field HCD_ISO_STAT_COUNTERS IsoCounters
#endstruct

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