ホーム › Devices.Usb › PACKET_PARAMETERS
PACKET_PARAMETERS
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| DeviceAddress | BYTE | 1 | +0 | +0 | 対象デバイスのバスアドレスを示す。 |
| EndpointAddress | BYTE | 1 | +1 | +1 | 対象エンドポイントのアドレスを示す。 |
| MaximumPacketSize | WORD | 2 | +2 | +2 | エンドポイントの最大パケットサイズをバイト単位で示す。 |
| Timeout | DWORD | 4 | +4 | +4 | 転送のタイムアウト時間を示す。 |
| Flags | DWORD | 4 | +8 | +8 | 転送動作を制御するフラグ。 |
| DataLength | DWORD | 4 | +12 | +12 | 送受信するデータの長さをバイト単位で示す。 |
| HubDeviceAddress | WORD | 2 | +16 | +16 | デバイスが接続されているハブのアドレスを示す。 |
| PortTTNumber | WORD | 2 | +18 | +18 | ハブのトランザクショントランスレータポート番号を示す。 |
| ErrorCount | BYTE | 1 | +20 | +20 | 発生したエラー回数を示す。 |
| Pad | BYTE | 3 | +21 | +21 | アライメント用パディングバイト。 |
| UsbdStatusCode | INT | 4 | +24 | +24 | 転送結果のUSBDステータスコードを示す。 |
| Data | BYTE | 4 | +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 Structureimport 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