RIO_EXTENSION_FUNCTION_TABLE
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| cbSize | DWORD | 4 | +0 | +0 | 構造体のサイズ (バイト単位)。 |
| RIOReceive | LPFN_RIORECEIVE | 8/4 | +8 | +4 | RIOReceive 関数へのポインター。 |
| RIOReceiveEx | LPFN_RIORECEIVEEX | 8/4 | +16 | +8 | RIOReceiveEx 関数へのポインター。 |
| RIOSend | LPFN_RIOSEND | 8/4 | +24 | +12 | RIOSend 関数へのポインター。 |
| RIOSendEx | LPFN_RIOSENDEX | 8/4 | +32 | +16 | RIOSendEx 関数へのポインター。 |
| RIOCloseCompletionQueue | LPFN_RIOCLOSECOMPLETIONQUEUE | 8/4 | +40 | +20 | RIOCloseCompletionQueue 関数へのポインター。 |
| RIOCreateCompletionQueue | LPFN_RIOCREATECOMPLETIONQUEUE | 8/4 | +48 | +24 | RIOCreateCompletionQueue 関数へのポインター。 |
| RIOCreateRequestQueue | LPFN_RIOCREATEREQUESTQUEUE | 8/4 | +56 | +28 | RIOCreateRequestQueue 関数へのポインター。 |
| RIODequeueCompletion | LPFN_RIODEQUEUECOMPLETION | 8/4 | +64 | +32 | RIODequeueCompletion 関数へのポインター。 |
| RIODeregisterBuffer | LPFN_RIODEREGISTERBUFFER | 8/4 | +72 | +36 | RIODeregisterBuffer 関数へのポインター。 |
| RIONotify | LPFN_RIONOTIFY | 8/4 | +80 | +40 | RIONotify 関数へのポインター。 |
| RIORegisterBuffer | LPFN_RIOREGISTERBUFFER | 8/4 | +88 | +44 | RIORegisterBuffer 関数へのポインター。 |
| RIOResizeCompletionQueue | LPFN_RIORESIZECOMPLETIONQUEUE | 8/4 | +96 | +48 | RIOResizeCompletionQueue 関数へのポインター。 |
| RIOResizeRequestQueue | LPFN_RIORESIZEREQUESTQUEUE | 8/4 | +104 | +52 | RIOResizeRequestQueue 関数へのポインター。 |
公式ドキュメント
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 公式リファレンス: 英語 (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 Structureimport 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: pointerstruct 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