ホーム › Devices.Usb › HCD_STAT_INFORMATION_2
HCD_STAT_INFORMATION_2
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| Reserved1 | DWORD | 4 | +0 | +0 | 予約フィールド。未使用。 |
| Reserved2 | DWORD | 4 | +4 | +4 | 予約フィールド。未使用。 |
| ResetCounters | DWORD | 4 | +8 | +8 | 非0を設定するとカウンタをリセットする要求フラグ。 |
| TimeRead | LONGLONG | 8 | +12 | +12 | 統計を読み出した時刻(QPCティック等)。 |
| LockedMemoryUsed | INT | 4 | +20 | +20 | ロックされた使用メモリ量(バイト)。 |
| Counters | HCD_STAT_COUNTERS | 24 | +24 | +24 | ホストコントローラの各種統計カウンタ。 |
| IsoCounters | HCD_ISO_STAT_COUNTERS | 72 | +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 Structureimport 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_COUNTERSalign(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