ホーム › Storage.FileSystem › CreateIoRing
CreateIoRing
関数指定したキューサイズでI/Oリングを作成する。
シグネチャ
// api-ms-win-core-ioring-l1-1-0.dll
#include <windows.h>
HRESULT CreateIoRing(
IORING_VERSION ioringVersion,
IORING_CREATE_FLAGS flags,
DWORD submissionQueueSize,
DWORD completionQueueSize,
HIORING* h
);パラメーター
| 名前 | 型 | 方向 | 説明 |
|---|---|---|---|
| ioringVersion | IORING_VERSION | in | リングを作成する対象の I/O リング API のバージョンを表す UNIT32 です。この値は QueryIoRingCapabilities の呼び出しから取得した値以下である必要があります。 |
| flags | IORING_CREATE_FLAGS | in | 作成フラグを指定する IORING_CREATE_FLAGS 列挙体の値です。 |
| submissionQueueSize | DWORD | in | 要求する送信キューの最小サイズです。システムは実際のサイズが 2 のべき乗になるよう、必要に応じてサイズを切り上げることがあります。実際に割り当てられたキューサイズは GetIoRingInfo を呼び出すことで取得できます。現在のシステムにおける送信キューの最大サイズは QueryIoRingCapabilities を呼び出すことで取得できます。 |
| completionQueueSize | DWORD | in | 要求する完了キューの最小サイズです。システムはこのサイズを、実際の送信キューサイズの 2 倍以上となる 2 のべき乗に切り上げ、一部の操作が進行中であっても送信を行えるようにします。実際に割り当てられたキューサイズは GetIoRingInfo を呼び出すことで取得できます。 |
| h | HIORING* | out | 作成に成功した場合、結果として得られる HIORING ハンドルを受け取ります。返された HIORING リングは、IORING の基盤となるリソースを解放するために、CloseHandle ではなく CloseIoRing を呼び出して閉じる必要があります。 |
戻り値の型: HRESULT
公式ドキュメント
I/O リング送信/完了キューのペアの新しいインスタンスを作成し、その I/O リングを参照するためのハンドルを返します。
戻り値
HRESULT です。以下を含みますが、これらに限定されません。
| 値 | 説明 |
|---|---|
| S_OK | 成功しました。 |
| IORING_E_UNKNOWN_VERSION | ioringVersion に指定されたバージョンが不明です。 |
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での呼び出し定義
// api-ms-win-core-ioring-l1-1-0.dll
#include <windows.h>
HRESULT CreateIoRing(
IORING_VERSION ioringVersion,
IORING_CREATE_FLAGS flags,
DWORD submissionQueueSize,
DWORD completionQueueSize,
HIORING* h
);[DllImport("api-ms-win-core-ioring-l1-1-0.dll", ExactSpelling = true)]
static extern int CreateIoRing(
int ioringVersion, // IORING_VERSION
IORING_CREATE_FLAGS flags, // IORING_CREATE_FLAGS
uint submissionQueueSize, // DWORD
uint completionQueueSize, // DWORD
IntPtr h // HIORING* out
);<DllImport("api-ms-win-core-ioring-l1-1-0.dll", ExactSpelling:=True)>
Public Shared Function CreateIoRing(
ioringVersion As Integer, ' IORING_VERSION
flags As IORING_CREATE_FLAGS, ' IORING_CREATE_FLAGS
submissionQueueSize As UInteger, ' DWORD
completionQueueSize As UInteger, ' DWORD
h As IntPtr ' HIORING* out
) As Integer
End Function' ioringVersion : IORING_VERSION
' flags : IORING_CREATE_FLAGS
' submissionQueueSize : DWORD
' completionQueueSize : DWORD
' h : HIORING* out
Declare PtrSafe Function CreateIoRing Lib "api-ms-win-core-ioring-l1-1-0" ( _
ByVal ioringVersion As Long, _
ByVal flags As LongPtr, _
ByVal submissionQueueSize As Long, _
ByVal completionQueueSize As Long, _
ByVal h As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。import ctypes
from ctypes import wintypes
CreateIoRing = ctypes.windll.LoadLibrary("api-ms-win-core-ioring-l1-1-0.dll").CreateIoRing
CreateIoRing.restype = ctypes.c_int
CreateIoRing.argtypes = [
ctypes.c_int, # ioringVersion : IORING_VERSION
IORING_CREATE_FLAGS, # flags : IORING_CREATE_FLAGS
wintypes.DWORD, # submissionQueueSize : DWORD
wintypes.DWORD, # completionQueueSize : DWORD
ctypes.c_void_p, # h : HIORING* out
]require 'fiddle'
require 'fiddle/import'
lib = Fiddle.dlopen('api-ms-win-core-ioring-l1-1-0.dll')
CreateIoRing = Fiddle::Function.new(
lib['CreateIoRing'],
[
Fiddle::TYPE_INT, # ioringVersion : IORING_VERSION
Fiddle::TYPE_VOIDP, # flags : IORING_CREATE_FLAGS
-Fiddle::TYPE_INT, # submissionQueueSize : DWORD
-Fiddle::TYPE_INT, # completionQueueSize : DWORD
Fiddle::TYPE_VOIDP, # h : HIORING* out
],
Fiddle::TYPE_INT)#[link(name = "api-ms-win-core-ioring-l1-1-0")]
extern "system" {
fn CreateIoRing(
ioringVersion: i32, // IORING_VERSION
flags: IORING_CREATE_FLAGS, // IORING_CREATE_FLAGS
submissionQueueSize: u32, // DWORD
completionQueueSize: u32, // DWORD
h: *mut *mut core::ffi::c_void // HIORING* out
) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.$sig = @"
[DllImport("api-ms-win-core-ioring-l1-1-0.dll")]
public static extern int CreateIoRing(int ioringVersion, IORING_CREATE_FLAGS flags, uint submissionQueueSize, uint completionQueueSize, IntPtr h);
"@
$api = Add-Type -MemberDefinition $sig -Name 'api-ms-win-core-ioring-l1-1-0_CreateIoRing' -Namespace Win32 -PassThru
# $api::CreateIoRing(ioringVersion, flags, submissionQueueSize, completionQueueSize, h)#uselib "api-ms-win-core-ioring-l1-1-0.dll"
#func global CreateIoRing "CreateIoRing" sptr, sptr, sptr, sptr, sptr
; CreateIoRing ioringVersion, flags, submissionQueueSize, completionQueueSize, h ; 戻り値は stat
; ioringVersion : IORING_VERSION -> "sptr"
; flags : IORING_CREATE_FLAGS -> "sptr"
; submissionQueueSize : DWORD -> "sptr"
; completionQueueSize : DWORD -> "sptr"
; h : HIORING* out -> "sptr"
; ※値渡し構造体は直接渡せません。intにパック、または var で構造体変数を渡してください。
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。#uselib "api-ms-win-core-ioring-l1-1-0.dll"
#cfunc global CreateIoRing "CreateIoRing" int, int, int, int, sptr
; res = CreateIoRing(ioringVersion, flags, submissionQueueSize, completionQueueSize, h)
; ioringVersion : IORING_VERSION -> "int"
; flags : IORING_CREATE_FLAGS -> "int"
; submissionQueueSize : DWORD -> "int"
; completionQueueSize : DWORD -> "int"
; h : HIORING* out -> "sptr"
; ※値渡し構造体は直接渡せません。intにパック、または var で構造体変数を渡してください。; HRESULT CreateIoRing(IORING_VERSION ioringVersion, IORING_CREATE_FLAGS flags, DWORD submissionQueueSize, DWORD completionQueueSize, HIORING* h)
#uselib "api-ms-win-core-ioring-l1-1-0.dll"
#cfunc global CreateIoRing "CreateIoRing" int, int, int, int, intptr
; res = CreateIoRing(ioringVersion, flags, submissionQueueSize, completionQueueSize, h)
; ioringVersion : IORING_VERSION -> "int"
; flags : IORING_CREATE_FLAGS -> "int"
; submissionQueueSize : DWORD -> "int"
; completionQueueSize : DWORD -> "int"
; h : HIORING* out -> "intptr"
; ※値渡し構造体は直接渡せません。intにパック、または var で構造体変数を渡してください。import (
"golang.org/x/sys/windows"
"unsafe"
)
var (
api_ms_win_core_ioring_l1_1_0 = windows.NewLazySystemDLL("api-ms-win-core-ioring-l1-1-0.dll")
procCreateIoRing = api_ms_win_core_ioring_l1_1_0.NewProc("CreateIoRing")
)
// ioringVersion (IORING_VERSION), flags (IORING_CREATE_FLAGS), submissionQueueSize (DWORD), completionQueueSize (DWORD), h (HIORING* out)
r1, _, err := procCreateIoRing.Call(
uintptr(ioringVersion),
uintptr(flags),
uintptr(submissionQueueSize),
uintptr(completionQueueSize),
uintptr(h),
)
_ = err // syscall.Errno (valid when the call sets last-error)
_ = r1 // HRESULTfunction CreateIoRing(
ioringVersion: Integer; // IORING_VERSION
flags: IORING_CREATE_FLAGS; // IORING_CREATE_FLAGS
submissionQueueSize: DWORD; // DWORD
completionQueueSize: DWORD; // DWORD
h: Pointer // HIORING* out
): Integer; stdcall;
external 'api-ms-win-core-ioring-l1-1-0.dll' name 'CreateIoRing';result := DllCall("api-ms-win-core-ioring-l1-1-0\CreateIoRing"
, "Int", ioringVersion ; IORING_VERSION
, "Ptr", flags ; IORING_CREATE_FLAGS
, "UInt", submissionQueueSize ; DWORD
, "UInt", completionQueueSize ; DWORD
, "Ptr", h ; HIORING* out
, "Int") ; return: HRESULT●CreateIoRing(ioringVersion, flags, submissionQueueSize, completionQueueSize, h) = DLL("api-ms-win-core-ioring-l1-1-0.dll", "int CreateIoRing(int, void*, dword, dword, void*)")
# 呼び出し: CreateIoRing(ioringVersion, flags, submissionQueueSize, completionQueueSize, h)
# ioringVersion : IORING_VERSION -> "int"
# flags : IORING_CREATE_FLAGS -> "void*"
# submissionQueueSize : DWORD -> "dword"
# completionQueueSize : DWORD -> "dword"
# h : HIORING* out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。const std = @import("std");
extern "api-ms-win-core-ioring-l1-1-0" fn CreateIoRing(
ioringVersion: i32, // IORING_VERSION
flags: IORING_CREATE_FLAGS, // IORING_CREATE_FLAGS
submissionQueueSize: u32, // DWORD
completionQueueSize: u32, // DWORD
h: ?*anyopaque // HIORING* out
) callconv(std.os.windows.WINAPI) i32;proc CreateIoRing(
ioringVersion: int32, # IORING_VERSION
flags: IORING_CREATE_FLAGS, # IORING_CREATE_FLAGS
submissionQueueSize: uint32, # DWORD
completionQueueSize: uint32, # DWORD
h: pointer # HIORING* out
): int32 {.importc: "CreateIoRing", stdcall, dynlib: "api-ms-win-core-ioring-l1-1-0.dll".}pragma(lib, "api-ms-win-core-ioring-l1-1-0");
extern(Windows)
int CreateIoRing(
int ioringVersion, // IORING_VERSION
IORING_CREATE_FLAGS flags, // IORING_CREATE_FLAGS
uint submissionQueueSize, // DWORD
uint completionQueueSize, // DWORD
void* h // HIORING* out
);ccall((:CreateIoRing, "api-ms-win-core-ioring-l1-1-0.dll"), stdcall, Int32,
(Int32, IORING_CREATE_FLAGS, UInt32, UInt32, Ptr{Cvoid}),
ioringVersion, flags, submissionQueueSize, completionQueueSize, h)
# ioringVersion : IORING_VERSION -> Int32
# flags : IORING_CREATE_FLAGS -> IORING_CREATE_FLAGS
# submissionQueueSize : DWORD -> UInt32
# completionQueueSize : DWORD -> UInt32
# h : HIORING* out -> Ptr{Cvoid}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。local ffi = require("ffi")
ffi.cdef[[
int32_t CreateIoRing(
int32_t ioringVersion,
IORING_CREATE_FLAGS flags,
uint32_t submissionQueueSize,
uint32_t completionQueueSize,
void* h);
]]
local api-ms-win-core-ioring-l1-1-0 = ffi.load("api-ms-win-core-ioring-l1-1-0")
-- api-ms-win-core-ioring-l1-1-0.CreateIoRing(ioringVersion, flags, submissionQueueSize, completionQueueSize, h)
-- ioringVersion : IORING_VERSION
-- flags : IORING_CREATE_FLAGS
-- submissionQueueSize : DWORD
-- completionQueueSize : DWORD
-- h : HIORING* out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。const koffi = require('koffi');
const lib = koffi.load('api-ms-win-core-ioring-l1-1-0.dll');
const CreateIoRing = lib.func('__stdcall', 'CreateIoRing', 'int32_t', ['int32_t', 'IORING_CREATE_FLAGS', 'uint32_t', 'uint32_t', 'void *']);
// CreateIoRing(ioringVersion, flags, submissionQueueSize, completionQueueSize, h)
// ioringVersion : IORING_VERSION -> 'int32_t'
// flags : IORING_CREATE_FLAGS -> 'IORING_CREATE_FLAGS'
// submissionQueueSize : DWORD -> 'uint32_t'
// completionQueueSize : DWORD -> 'uint32_t'
// h : HIORING* out -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。const lib = Deno.dlopen("api-ms-win-core-ioring-l1-1-0.dll", {
CreateIoRing: { parameters: ["i32", "buffer", "u32", "u32", "pointer"], result: "i32" },
});
// lib.symbols.CreateIoRing(ioringVersion, flags, submissionQueueSize, completionQueueSize, h)
// ioringVersion : IORING_VERSION -> "i32"
// flags : IORING_CREATE_FLAGS -> "buffer"
// submissionQueueSize : DWORD -> "u32"
// completionQueueSize : DWORD -> "u32"
// h : HIORING* out -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。<?php
$ffi = FFI::cdef(<<<C
int32_t CreateIoRing(
int32_t ioringVersion,
IORING_CREATE_FLAGS flags,
uint32_t submissionQueueSize,
uint32_t completionQueueSize,
void* h);
C, "api-ms-win-core-ioring-l1-1-0.dll");
// $ffi->CreateIoRing(ioringVersion, flags, submissionQueueSize, completionQueueSize, h);
// ioringVersion : IORING_VERSION
// flags : IORING_CREATE_FLAGS
// submissionQueueSize : DWORD
// completionQueueSize : DWORD
// h : HIORING* out
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;
public interface Api-ms-win-core-ioring-l1-1-0 extends StdCallLibrary {
Api-ms-win-core-ioring-l1-1-0 INSTANCE = Native.load("api-ms-win-core-ioring-l1-1-0", Api-ms-win-core-ioring-l1-1-0.class);
int CreateIoRing(
int ioringVersion, // IORING_VERSION
IORING_CREATE_FLAGS /* extends Structure (by value) */ flags, // IORING_CREATE_FLAGS
int submissionQueueSize, // DWORD
int completionQueueSize, // DWORD
Pointer h // HIORING* out
);
}@[Link("api-ms-win-core-ioring-l1-1-0")]
lib Libapi-ms-win-core-ioring-l1-1-0
fun CreateIoRing = CreateIoRing(
ioringVersion : Int32, # IORING_VERSION
flags : IORING_CREATE_FLAGS, # IORING_CREATE_FLAGS
submissionQueueSize : UInt32, # DWORD
completionQueueSize : UInt32, # DWORD
h : Void* # HIORING* out
) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。import 'dart:ffi';
import 'package:ffi/ffi.dart';
typedef CreateIoRingNative = Int32 Function(Int32, IORING_CREATE_FLAGS, Uint32, Uint32, Pointer<Void>);
typedef CreateIoRingDart = int Function(int, int, int, int, Pointer<Void>);
final CreateIoRing = DynamicLibrary.open('api-ms-win-core-ioring-l1-1-0.dll')
.lookupFunction<CreateIoRingNative, CreateIoRingDart>('CreateIoRing');
// ioringVersion : IORING_VERSION -> Int32
// flags : IORING_CREATE_FLAGS -> IORING_CREATE_FLAGS
// submissionQueueSize : DWORD -> Uint32
// completionQueueSize : DWORD -> Uint32
// h : HIORING* out -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。{$mode objfpc}{$H+}
function CreateIoRing(
ioringVersion: Integer; // IORING_VERSION
flags: IORING_CREATE_FLAGS; // IORING_CREATE_FLAGS
submissionQueueSize: DWORD; // DWORD
completionQueueSize: DWORD; // DWORD
h: Pointer // HIORING* out
): Integer; stdcall;
external 'api-ms-win-core-ioring-l1-1-0.dll' name 'CreateIoRing';import Foreign
import Foreign.C.Types
import Foreign.C.String
foreign import stdcall safe "CreateIoRing"
c_CreateIoRing :: Int32 -> IORING_CREATE_FLAGS -> Word32 -> Word32 -> Ptr () -> IO Int32
-- ioringVersion : IORING_VERSION -> Int32
-- flags : IORING_CREATE_FLAGS -> IORING_CREATE_FLAGS
-- submissionQueueSize : DWORD -> Word32
-- completionQueueSize : DWORD -> Word32
-- h : HIORING* out -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
-- ※値渡し構造体は GHC FFI で直接渡せません。Ptr で渡すラッパ(C側)経由にしてください。open Ctypes
open Foreign
let createioring =
foreign "CreateIoRing"
(int32_t @-> IORING_CREATE_FLAGS @-> uint32_t @-> uint32_t @-> (ptr void) @-> returning int32_t)
(* ioringVersion : IORING_VERSION -> int32_t *)
(* flags : IORING_CREATE_FLAGS -> IORING_CREATE_FLAGS *)
(* submissionQueueSize : DWORD -> uint32_t *)
(* completionQueueSize : DWORD -> uint32_t *)
(* h : HIORING* out -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)(cffi:define-foreign-library api-ms-win-core-ioring-l1-1-0 (t "api-ms-win-core-ioring-l1-1-0.dll"))
(cffi:use-foreign-library api-ms-win-core-ioring-l1-1-0)
(cffi:defcfun ("CreateIoRing" create-io-ring :convention :stdcall) :int32
(ioring-version :int32) ; IORING_VERSION
(flags (:struct ioring-create-flags)) ; IORING_CREATE_FLAGS
(submission-queue-size :uint32) ; DWORD
(completion-queue-size :uint32) ; DWORD
(h :pointer)) ; HIORING* out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。use Win32::API;
my $CreateIoRing = Win32::API::More->new('api-ms-win-core-ioring-l1-1-0',
'int CreateIoRing(int ioringVersion, LPVOID flags, DWORD submissionQueueSize, DWORD completionQueueSize, HANDLE h)');
# my $ret = $CreateIoRing->Call($ioringVersion, $flags, $submissionQueueSize, $completionQueueSize, $h);
# ioringVersion : IORING_VERSION -> int
# flags : IORING_CREATE_FLAGS -> LPVOID
# submissionQueueSize : DWORD -> DWORD
# completionQueueSize : DWORD -> DWORD
# h : HIORING* out -> HANDLE
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。