ホーム › Devices.Usb › IO_BLOCK_EX
IO_BLOCK_EX
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| uOffset | DWORD | 4 | +0 | +0 | アクセス対象の開始オフセット。 |
| uLength | DWORD | 4 | +4 | +4 | アクセスするデータの長さ(バイト)。 |
| pbyData | BYTE* | 8/4 | +8 | +8 | データを格納するバッファへのポインタ。 |
| uIndex | DWORD | 4 | +16 | +12 | アクセス対象のインデックス。 |
| bRequest | BYTE | 1 | +20 | +16 | USBセットアップのbRequestフィールド値。 |
| bmRequestType | BYTE | 1 | +21 | +17 | USBセットアップのbmRequestType(要求方向・種別)。 |
| fTransferDirectionIn | BYTE | 1 | +22 | +18 | 転送方向がIN(デバイス→ホスト)か否かのフラグ。 |
各言語での定義
#include <windows.h>
// IO_BLOCK_EX (x64 24 / x86 20 バイト)
typedef struct IO_BLOCK_EX {
DWORD uOffset;
DWORD uLength;
BYTE* pbyData;
DWORD uIndex;
BYTE bRequest;
BYTE bmRequestType;
BYTE fTransferDirectionIn;
} IO_BLOCK_EX;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct IO_BLOCK_EX
{
public uint uOffset;
public uint uLength;
public IntPtr pbyData;
public uint uIndex;
public byte bRequest;
public byte bmRequestType;
public byte fTransferDirectionIn;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure IO_BLOCK_EX
Public uOffset As UInteger
Public uLength As UInteger
Public pbyData As IntPtr
Public uIndex As UInteger
Public bRequest As Byte
Public bmRequestType As Byte
Public fTransferDirectionIn As Byte
End Structureimport ctypes
from ctypes import wintypes
class IO_BLOCK_EX(ctypes.Structure):
_fields_ = [
("uOffset", wintypes.DWORD),
("uLength", wintypes.DWORD),
("pbyData", ctypes.c_void_p),
("uIndex", wintypes.DWORD),
("bRequest", ctypes.c_ubyte),
("bmRequestType", ctypes.c_ubyte),
("fTransferDirectionIn", ctypes.c_ubyte),
]#[repr(C)]
pub struct IO_BLOCK_EX {
pub uOffset: u32,
pub uLength: u32,
pub pbyData: *mut core::ffi::c_void,
pub uIndex: u32,
pub bRequest: u8,
pub bmRequestType: u8,
pub fTransferDirectionIn: u8,
}import "golang.org/x/sys/windows"
type IO_BLOCK_EX struct {
uOffset uint32
uLength uint32
pbyData uintptr
uIndex uint32
bRequest byte
bmRequestType byte
fTransferDirectionIn byte
}type
IO_BLOCK_EX = record
uOffset: DWORD;
uLength: DWORD;
pbyData: Pointer;
uIndex: DWORD;
bRequest: Byte;
bmRequestType: Byte;
fTransferDirectionIn: Byte;
end;const IO_BLOCK_EX = extern struct {
uOffset: u32,
uLength: u32,
pbyData: ?*anyopaque,
uIndex: u32,
bRequest: u8,
bmRequestType: u8,
fTransferDirectionIn: u8,
};type
IO_BLOCK_EX {.bycopy.} = object
uOffset: uint32
uLength: uint32
pbyData: pointer
uIndex: uint32
bRequest: uint8
bmRequestType: uint8
fTransferDirectionIn: uint8struct IO_BLOCK_EX
{
uint uOffset;
uint uLength;
void* pbyData;
uint uIndex;
ubyte bRequest;
ubyte bmRequestType;
ubyte fTransferDirectionIn;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; IO_BLOCK_EX サイズ: 20 バイト(x86)
dim st, 5 ; 4byte整数×5(構造体サイズ 20 / 4 切り上げ)
; uOffset : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; uLength : DWORD (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; pbyData : BYTE* (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; uIndex : DWORD (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; bRequest : BYTE (+16, 1byte) poke st,16,値 / 値 = peek(st,16)
; bmRequestType : BYTE (+17, 1byte) poke st,17,値 / 値 = peek(st,17)
; fTransferDirectionIn : BYTE (+18, 1byte) poke st,18,値 / 値 = peek(st,18)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; IO_BLOCK_EX サイズ: 24 バイト(x64)
dim st, 6 ; 4byte整数×6(構造体サイズ 24 / 4 切り上げ)
; uOffset : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; uLength : DWORD (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; pbyData : BYTE* (+8, 8byte) qpoke st,8,値 / qpeek(st,8) ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; uIndex : DWORD (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; bRequest : BYTE (+20, 1byte) poke st,20,値 / 値 = peek(st,20)
; bmRequestType : BYTE (+21, 1byte) poke st,21,値 / 値 = peek(st,21)
; fTransferDirectionIn : BYTE (+22, 1byte) poke st,22,値 / 値 = peek(st,22)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global IO_BLOCK_EX
#field int uOffset
#field int uLength
#field intptr pbyData
#field int uIndex
#field byte bRequest
#field byte bmRequestType
#field byte fTransferDirectionIn
#endstruct
stdim st, IO_BLOCK_EX ; NSTRUCT 変数を確保
st->uOffset = 100
mes "uOffset=" + st->uOffset