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

IO_BLOCK_EX

構造体
サイズx64: 24 バイト / x86: 20 バイト

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

フィールド

フィールドサイズx64x86説明
uOffsetDWORD4+0+0アクセス対象の開始オフセット。
uLengthDWORD4+4+4アクセスするデータの長さ(バイト)。
pbyDataBYTE*8/4+8+8データを格納するバッファへのポインタ。
uIndexDWORD4+16+12アクセス対象のインデックス。
bRequestBYTE1+20+16USBセットアップのbRequestフィールド値。
bmRequestTypeBYTE1+21+17USBセットアップのbmRequestType(要求方向・種別)。
fTransferDirectionInBYTE1+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 Structure
import 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: uint8
struct 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