Win32 API 日本語リファレンス
ホームNetworking.WinSock › RIO_EXTENSION_FUNCTION_TABLE

RIO_EXTENSION_FUNCTION_TABLE

構造体
サイズx64: 112 バイト / x86: 56 バイト

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

フィールド

フィールドサイズx64x86説明
cbSizeDWORD4+0+0構造体のサイズ (バイト単位)。
RIOReceiveLPFN_RIORECEIVE8/4+8+4RIOReceive 関数へのポインター。
RIOReceiveExLPFN_RIORECEIVEEX8/4+16+8RIOReceiveEx 関数へのポインター。
RIOSendLPFN_RIOSEND8/4+24+12RIOSend 関数へのポインター。
RIOSendExLPFN_RIOSENDEX8/4+32+16RIOSendEx 関数へのポインター。
RIOCloseCompletionQueueLPFN_RIOCLOSECOMPLETIONQUEUE8/4+40+20RIOCloseCompletionQueue 関数へのポインター。
RIOCreateCompletionQueueLPFN_RIOCREATECOMPLETIONQUEUE8/4+48+24RIOCreateCompletionQueue 関数へのポインター。
RIOCreateRequestQueueLPFN_RIOCREATEREQUESTQUEUE8/4+56+28RIOCreateRequestQueue 関数へのポインター。
RIODequeueCompletionLPFN_RIODEQUEUECOMPLETION8/4+64+32RIODequeueCompletion 関数へのポインター。
RIODeregisterBufferLPFN_RIODEREGISTERBUFFER8/4+72+36RIODeregisterBuffer 関数へのポインター。
RIONotifyLPFN_RIONOTIFY8/4+80+40RIONotify 関数へのポインター。
RIORegisterBufferLPFN_RIOREGISTERBUFFER8/4+88+44RIORegisterBuffer 関数へのポインター。
RIOResizeCompletionQueueLPFN_RIORESIZECOMPLETIONQUEUE8/4+96+48RIOResizeCompletionQueue 関数へのポインター。
RIOResizeRequestQueueLPFN_RIORESIZEREQUESTQUEUE8/4+104+52RIOResizeRequestQueue 関数へのポインター。

公式ドキュメント

RIO_EXTENSION_FUNCTION_TABLE 構造体は、Winsock 登録済み I/O 拡張を実装する関数に関する情報を格納します。

解説(Remarks)

RIO_EXTENSION_FUNCTION_TABLE 構造体は、Winsock 登録済み I/O 拡張を実装する関数に関する情報を格納します。

Winsock 登録済み I/O 拡張関数の関数ポインターは、SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER オペコードを指定して WSAIoctl 関数を呼び出すことにより、実行時に取得する必要があります。WSAIoctl 関数に渡す入力バッファーには、Winsock 登録済み I/O 拡張関数を識別する値を持つグローバル一意識別子 (GUID) である WSAID_MULTIPLE_RIO を格納する必要があります。成功した場合、WSAIoctl 関数が返す出力には、Winsock 登録済み I/O 拡張関数へのポインターを格納した RIO_EXTENSION_FUNCTION_TABLE 構造体へのポインターが含まれます。SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER IOCTL は Ws2def.h ヘッダーファイルで定義されています。WSAID_MULTIPLE_RIO GUID は Mswsock.h ヘッダーファイルで定義されています。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// RIO_EXTENSION_FUNCTION_TABLE  (x64 112 / x86 56 バイト)
typedef struct RIO_EXTENSION_FUNCTION_TABLE {
    DWORD cbSize;
    LPFN_RIORECEIVE RIOReceive;
    LPFN_RIORECEIVEEX RIOReceiveEx;
    LPFN_RIOSEND RIOSend;
    LPFN_RIOSENDEX RIOSendEx;
    LPFN_RIOCLOSECOMPLETIONQUEUE RIOCloseCompletionQueue;
    LPFN_RIOCREATECOMPLETIONQUEUE RIOCreateCompletionQueue;
    LPFN_RIOCREATEREQUESTQUEUE RIOCreateRequestQueue;
    LPFN_RIODEQUEUECOMPLETION RIODequeueCompletion;
    LPFN_RIODEREGISTERBUFFER RIODeregisterBuffer;
    LPFN_RIONOTIFY RIONotify;
    LPFN_RIOREGISTERBUFFER RIORegisterBuffer;
    LPFN_RIORESIZECOMPLETIONQUEUE RIOResizeCompletionQueue;
    LPFN_RIORESIZEREQUESTQUEUE RIOResizeRequestQueue;
} RIO_EXTENSION_FUNCTION_TABLE;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct RIO_EXTENSION_FUNCTION_TABLE
{
    public uint cbSize;
    public IntPtr RIOReceive;
    public IntPtr RIOReceiveEx;
    public IntPtr RIOSend;
    public IntPtr RIOSendEx;
    public IntPtr RIOCloseCompletionQueue;
    public IntPtr RIOCreateCompletionQueue;
    public IntPtr RIOCreateRequestQueue;
    public IntPtr RIODequeueCompletion;
    public IntPtr RIODeregisterBuffer;
    public IntPtr RIONotify;
    public IntPtr RIORegisterBuffer;
    public IntPtr RIOResizeCompletionQueue;
    public IntPtr RIOResizeRequestQueue;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure RIO_EXTENSION_FUNCTION_TABLE
    Public cbSize As UInteger
    Public RIOReceive As IntPtr
    Public RIOReceiveEx As IntPtr
    Public RIOSend As IntPtr
    Public RIOSendEx As IntPtr
    Public RIOCloseCompletionQueue As IntPtr
    Public RIOCreateCompletionQueue As IntPtr
    Public RIOCreateRequestQueue As IntPtr
    Public RIODequeueCompletion As IntPtr
    Public RIODeregisterBuffer As IntPtr
    Public RIONotify As IntPtr
    Public RIORegisterBuffer As IntPtr
    Public RIOResizeCompletionQueue As IntPtr
    Public RIOResizeRequestQueue As IntPtr
End Structure
import ctypes
from ctypes import wintypes

class RIO_EXTENSION_FUNCTION_TABLE(ctypes.Structure):
    _fields_ = [
        ("cbSize", wintypes.DWORD),
        ("RIOReceive", ctypes.c_void_p),
        ("RIOReceiveEx", ctypes.c_void_p),
        ("RIOSend", ctypes.c_void_p),
        ("RIOSendEx", ctypes.c_void_p),
        ("RIOCloseCompletionQueue", ctypes.c_void_p),
        ("RIOCreateCompletionQueue", ctypes.c_void_p),
        ("RIOCreateRequestQueue", ctypes.c_void_p),
        ("RIODequeueCompletion", ctypes.c_void_p),
        ("RIODeregisterBuffer", ctypes.c_void_p),
        ("RIONotify", ctypes.c_void_p),
        ("RIORegisterBuffer", ctypes.c_void_p),
        ("RIOResizeCompletionQueue", ctypes.c_void_p),
        ("RIOResizeRequestQueue", ctypes.c_void_p),
    ]
#[repr(C)]
pub struct RIO_EXTENSION_FUNCTION_TABLE {
    pub cbSize: u32,
    pub RIOReceive: *mut core::ffi::c_void,
    pub RIOReceiveEx: *mut core::ffi::c_void,
    pub RIOSend: *mut core::ffi::c_void,
    pub RIOSendEx: *mut core::ffi::c_void,
    pub RIOCloseCompletionQueue: *mut core::ffi::c_void,
    pub RIOCreateCompletionQueue: *mut core::ffi::c_void,
    pub RIOCreateRequestQueue: *mut core::ffi::c_void,
    pub RIODequeueCompletion: *mut core::ffi::c_void,
    pub RIODeregisterBuffer: *mut core::ffi::c_void,
    pub RIONotify: *mut core::ffi::c_void,
    pub RIORegisterBuffer: *mut core::ffi::c_void,
    pub RIOResizeCompletionQueue: *mut core::ffi::c_void,
    pub RIOResizeRequestQueue: *mut core::ffi::c_void,
}
import "golang.org/x/sys/windows"

type RIO_EXTENSION_FUNCTION_TABLE struct {
	cbSize uint32
	RIOReceive uintptr
	RIOReceiveEx uintptr
	RIOSend uintptr
	RIOSendEx uintptr
	RIOCloseCompletionQueue uintptr
	RIOCreateCompletionQueue uintptr
	RIOCreateRequestQueue uintptr
	RIODequeueCompletion uintptr
	RIODeregisterBuffer uintptr
	RIONotify uintptr
	RIORegisterBuffer uintptr
	RIOResizeCompletionQueue uintptr
	RIOResizeRequestQueue uintptr
}
type
  RIO_EXTENSION_FUNCTION_TABLE = record
    cbSize: DWORD;
    RIOReceive: Pointer;
    RIOReceiveEx: Pointer;
    RIOSend: Pointer;
    RIOSendEx: Pointer;
    RIOCloseCompletionQueue: Pointer;
    RIOCreateCompletionQueue: Pointer;
    RIOCreateRequestQueue: Pointer;
    RIODequeueCompletion: Pointer;
    RIODeregisterBuffer: Pointer;
    RIONotify: Pointer;
    RIORegisterBuffer: Pointer;
    RIOResizeCompletionQueue: Pointer;
    RIOResizeRequestQueue: Pointer;
  end;
const RIO_EXTENSION_FUNCTION_TABLE = extern struct {
    cbSize: u32,
    RIOReceive: ?*anyopaque,
    RIOReceiveEx: ?*anyopaque,
    RIOSend: ?*anyopaque,
    RIOSendEx: ?*anyopaque,
    RIOCloseCompletionQueue: ?*anyopaque,
    RIOCreateCompletionQueue: ?*anyopaque,
    RIOCreateRequestQueue: ?*anyopaque,
    RIODequeueCompletion: ?*anyopaque,
    RIODeregisterBuffer: ?*anyopaque,
    RIONotify: ?*anyopaque,
    RIORegisterBuffer: ?*anyopaque,
    RIOResizeCompletionQueue: ?*anyopaque,
    RIOResizeRequestQueue: ?*anyopaque,
};
type
  RIO_EXTENSION_FUNCTION_TABLE {.bycopy.} = object
    cbSize: uint32
    RIOReceive: pointer
    RIOReceiveEx: pointer
    RIOSend: pointer
    RIOSendEx: pointer
    RIOCloseCompletionQueue: pointer
    RIOCreateCompletionQueue: pointer
    RIOCreateRequestQueue: pointer
    RIODequeueCompletion: pointer
    RIODeregisterBuffer: pointer
    RIONotify: pointer
    RIORegisterBuffer: pointer
    RIOResizeCompletionQueue: pointer
    RIOResizeRequestQueue: pointer
struct RIO_EXTENSION_FUNCTION_TABLE
{
    uint cbSize;
    void* RIOReceive;
    void* RIOReceiveEx;
    void* RIOSend;
    void* RIOSendEx;
    void* RIOCloseCompletionQueue;
    void* RIOCreateCompletionQueue;
    void* RIOCreateRequestQueue;
    void* RIODequeueCompletion;
    void* RIODeregisterBuffer;
    void* RIONotify;
    void* RIORegisterBuffer;
    void* RIOResizeCompletionQueue;
    void* RIOResizeRequestQueue;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; RIO_EXTENSION_FUNCTION_TABLE サイズ: 56 バイト(x86)
dim st, 14    ; 4byte整数×14(構造体サイズ 56 / 4 切り上げ)
; cbSize : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; RIOReceive : LPFN_RIORECEIVE (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; RIOReceiveEx : LPFN_RIORECEIVEEX (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; RIOSend : LPFN_RIOSEND (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; RIOSendEx : LPFN_RIOSENDEX (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; RIOCloseCompletionQueue : LPFN_RIOCLOSECOMPLETIONQUEUE (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; RIOCreateCompletionQueue : LPFN_RIOCREATECOMPLETIONQUEUE (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; RIOCreateRequestQueue : LPFN_RIOCREATEREQUESTQUEUE (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; RIODequeueCompletion : LPFN_RIODEQUEUECOMPLETION (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; RIODeregisterBuffer : LPFN_RIODEREGISTERBUFFER (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; RIONotify : LPFN_RIONOTIFY (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; RIORegisterBuffer : LPFN_RIOREGISTERBUFFER (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; RIOResizeCompletionQueue : LPFN_RIORESIZECOMPLETIONQUEUE (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; RIOResizeRequestQueue : LPFN_RIORESIZEREQUESTQUEUE (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; RIO_EXTENSION_FUNCTION_TABLE サイズ: 112 バイト(x64)
dim st, 28    ; 4byte整数×28(構造体サイズ 112 / 4 切り上げ)
; cbSize : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; RIOReceive : LPFN_RIORECEIVE (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; RIOReceiveEx : LPFN_RIORECEIVEEX (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; RIOSend : LPFN_RIOSEND (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; RIOSendEx : LPFN_RIOSENDEX (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; RIOCloseCompletionQueue : LPFN_RIOCLOSECOMPLETIONQUEUE (+40, 8byte)  qpoke st,40,値 / qpeek(st,40)  ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; RIOCreateCompletionQueue : LPFN_RIOCREATECOMPLETIONQUEUE (+48, 8byte)  qpoke st,48,値 / qpeek(st,48)  ※IronHSPのみ。3.7/3.8は lpoke st,48,下位 : lpoke st,52,上位
; RIOCreateRequestQueue : LPFN_RIOCREATEREQUESTQUEUE (+56, 8byte)  qpoke st,56,値 / qpeek(st,56)  ※IronHSPのみ。3.7/3.8は lpoke st,56,下位 : lpoke st,60,上位
; RIODequeueCompletion : LPFN_RIODEQUEUECOMPLETION (+64, 8byte)  qpoke st,64,値 / qpeek(st,64)  ※IronHSPのみ。3.7/3.8は lpoke st,64,下位 : lpoke st,68,上位
; RIODeregisterBuffer : LPFN_RIODEREGISTERBUFFER (+72, 8byte)  qpoke st,72,値 / qpeek(st,72)  ※IronHSPのみ。3.7/3.8は lpoke st,72,下位 : lpoke st,76,上位
; RIONotify : LPFN_RIONOTIFY (+80, 8byte)  qpoke st,80,値 / qpeek(st,80)  ※IronHSPのみ。3.7/3.8は lpoke st,80,下位 : lpoke st,84,上位
; RIORegisterBuffer : LPFN_RIOREGISTERBUFFER (+88, 8byte)  qpoke st,88,値 / qpeek(st,88)  ※IronHSPのみ。3.7/3.8は lpoke st,88,下位 : lpoke st,92,上位
; RIOResizeCompletionQueue : LPFN_RIORESIZECOMPLETIONQUEUE (+96, 8byte)  qpoke st,96,値 / qpeek(st,96)  ※IronHSPのみ。3.7/3.8は lpoke st,96,下位 : lpoke st,100,上位
; RIOResizeRequestQueue : LPFN_RIORESIZEREQUESTQUEUE (+104, 8byte)  qpoke st,104,値 / qpeek(st,104)  ※IronHSPのみ。3.7/3.8は lpoke st,104,下位 : lpoke st,108,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global RIO_EXTENSION_FUNCTION_TABLE
    #field int cbSize
    #field intptr RIOReceive
    #field intptr RIOReceiveEx
    #field intptr RIOSend
    #field intptr RIOSendEx
    #field intptr RIOCloseCompletionQueue
    #field intptr RIOCreateCompletionQueue
    #field intptr RIOCreateRequestQueue
    #field intptr RIODequeueCompletion
    #field intptr RIODeregisterBuffer
    #field intptr RIONotify
    #field intptr RIORegisterBuffer
    #field intptr RIOResizeCompletionQueue
    #field intptr RIOResizeRequestQueue
#endstruct

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