ホーム › Networking.WinSock › RIO_EXTENSION_FUNCTION_TABLE
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関数へのポインタ。要求キューを再サイズする。 |
各言語での定義
#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