Win32 API 日本語リファレンス
ホームStorage.FileSystem › CreateIoRing

CreateIoRing

関数
指定したキューサイズでI/Oリングを作成する。
DLLapi-ms-win-core-ioring-l1-1-0.dll呼出規約winapi

シグネチャ

// 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
);

パラメーター

名前方向説明
ioringVersionIORING_VERSIONinリングを作成する対象の I/O リング API のバージョンを表す UNIT32 です。この値は QueryIoRingCapabilities の呼び出しから取得した値以下である必要があります。
flagsIORING_CREATE_FLAGSin作成フラグを指定する IORING_CREATE_FLAGS 列挙体の値です。
submissionQueueSizeDWORDin要求する送信キューの最小サイズです。システムは実際のサイズが 2 のべき乗になるよう、必要に応じてサイズを切り上げることがあります。実際に割り当てられたキューサイズは GetIoRingInfo を呼び出すことで取得できます。現在のシステムにおける送信キューの最大サイズは QueryIoRingCapabilities を呼び出すことで取得できます。
completionQueueSizeDWORDin要求する完了キューの最小サイズです。システムはこのサイズを、実際の送信キューサイズの 2 倍以上となる 2 のべき乗に切り上げ、一部の操作が進行中であっても送信を行えるようにします。実際に割り当てられたキューサイズは GetIoRingInfo を呼び出すことで取得できます。
hHIORING*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)

各言語での呼び出し定義

// 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   // HRESULT
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';
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 を使用。

関連項目

使用する型