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

PACKET_PARAMETERS

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

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

フィールド

フィールドサイズx64x86説明
DeviceAddressBYTE1+0+0対象デバイスのバスアドレスを示す。
EndpointAddressBYTE1+1+1対象エンドポイントのアドレスを示す。
MaximumPacketSizeWORD2+2+2エンドポイントの最大パケットサイズをバイト単位で示す。
TimeoutDWORD4+4+4転送のタイムアウト時間を示す。
FlagsDWORD4+8+8転送動作を制御するフラグ。
DataLengthDWORD4+12+12送受信するデータの長さをバイト単位で示す。
HubDeviceAddressWORD2+16+16デバイスが接続されているハブのアドレスを示す。
PortTTNumberWORD2+18+18ハブのトランザクショントランスレータポート番号を示す。
ErrorCountBYTE1+20+20発生したエラー回数を示す。
PadBYTE3+21+21アライメント用パディングバイト。
UsbdStatusCodeINT4+24+24転送結果のUSBDステータスコードを示す。
DataBYTE4+28+28送受信するデータの可変長バイト配列。

各言語での定義

#include <windows.h>

// PACKET_PARAMETERS  (x64 32 / x86 32 バイト)
#pragma pack(push, 1)
typedef struct PACKET_PARAMETERS {
    BYTE DeviceAddress;
    BYTE EndpointAddress;
    WORD MaximumPacketSize;
    DWORD Timeout;
    DWORD Flags;
    DWORD DataLength;
    WORD HubDeviceAddress;
    WORD PortTTNumber;
    BYTE ErrorCount;
    BYTE Pad[3];
    INT UsbdStatusCode;
    BYTE Data[4];
} PACKET_PARAMETERS;
#pragma pack(pop)
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
public struct PACKET_PARAMETERS
{
    public byte DeviceAddress;
    public byte EndpointAddress;
    public ushort MaximumPacketSize;
    public uint Timeout;
    public uint Flags;
    public uint DataLength;
    public ushort HubDeviceAddress;
    public ushort PortTTNumber;
    public byte ErrorCount;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] Pad;
    public int UsbdStatusCode;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] Data;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Unicode)>
Public Structure PACKET_PARAMETERS
    Public DeviceAddress As Byte
    Public EndpointAddress As Byte
    Public MaximumPacketSize As UShort
    Public Timeout As UInteger
    Public Flags As UInteger
    Public DataLength As UInteger
    Public HubDeviceAddress As UShort
    Public PortTTNumber As UShort
    Public ErrorCount As Byte
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=3)> Public Pad() As Byte
    Public UsbdStatusCode As Integer
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)> Public Data() As Byte
End Structure
import ctypes
from ctypes import wintypes

class PACKET_PARAMETERS(ctypes.Structure):
    _pack_ = 1
    _fields_ = [
        ("DeviceAddress", ctypes.c_ubyte),
        ("EndpointAddress", ctypes.c_ubyte),
        ("MaximumPacketSize", ctypes.c_ushort),
        ("Timeout", wintypes.DWORD),
        ("Flags", wintypes.DWORD),
        ("DataLength", wintypes.DWORD),
        ("HubDeviceAddress", ctypes.c_ushort),
        ("PortTTNumber", ctypes.c_ushort),
        ("ErrorCount", ctypes.c_ubyte),
        ("Pad", ctypes.c_ubyte * 3),
        ("UsbdStatusCode", ctypes.c_int),
        ("Data", ctypes.c_ubyte * 4),
    ]
#[repr(C, packed(1))]
pub struct PACKET_PARAMETERS {
    pub DeviceAddress: u8,
    pub EndpointAddress: u8,
    pub MaximumPacketSize: u16,
    pub Timeout: u32,
    pub Flags: u32,
    pub DataLength: u32,
    pub HubDeviceAddress: u16,
    pub PortTTNumber: u16,
    pub ErrorCount: u8,
    pub Pad: [u8; 3],
    pub UsbdStatusCode: i32,
    pub Data: [u8; 4],
}
import "golang.org/x/sys/windows"

type PACKET_PARAMETERS struct {
	DeviceAddress byte
	EndpointAddress byte
	MaximumPacketSize uint16
	Timeout uint32
	Flags uint32
	DataLength uint32
	HubDeviceAddress uint16
	PortTTNumber uint16
	ErrorCount byte
	Pad [3]byte
	UsbdStatusCode int32
	Data [4]byte
}
type
  PACKET_PARAMETERS = packed record
    DeviceAddress: Byte;
    EndpointAddress: Byte;
    MaximumPacketSize: Word;
    Timeout: DWORD;
    Flags: DWORD;
    DataLength: DWORD;
    HubDeviceAddress: Word;
    PortTTNumber: Word;
    ErrorCount: Byte;
    Pad: array[0..2] of Byte;
    UsbdStatusCode: Integer;
    Data: array[0..3] of Byte;
  end;
const PACKET_PARAMETERS = extern struct {
    DeviceAddress: u8,
    EndpointAddress: u8,
    MaximumPacketSize: u16,
    Timeout: u32,
    Flags: u32,
    DataLength: u32,
    HubDeviceAddress: u16,
    PortTTNumber: u16,
    ErrorCount: u8,
    Pad: [3]u8,
    UsbdStatusCode: i32,
    Data: [4]u8,
};
type
  PACKET_PARAMETERS {.packed.} = object
    DeviceAddress: uint8
    EndpointAddress: uint8
    MaximumPacketSize: uint16
    Timeout: uint32
    Flags: uint32
    DataLength: uint32
    HubDeviceAddress: uint16
    PortTTNumber: uint16
    ErrorCount: uint8
    Pad: array[3, uint8]
    UsbdStatusCode: int32
    Data: array[4, uint8]
align(1)
struct PACKET_PARAMETERS
{
    ubyte DeviceAddress;
    ubyte EndpointAddress;
    ushort MaximumPacketSize;
    uint Timeout;
    uint Flags;
    uint DataLength;
    ushort HubDeviceAddress;
    ushort PortTTNumber;
    ubyte ErrorCount;
    ubyte[3] Pad;
    int UsbdStatusCode;
    ubyte[4] Data;
}

HSP用 定義

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

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

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