master
  1/**
  2 * This file has no copyright assigned and is placed in the Public Domain.
  3 * This file is part of the mingw-w64 runtime package.
  4 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
  5 */
  6
  7#ifndef _APISET_IORING_
  8#define _APISET_IORING_
  9
 10#include <apiset.h>
 11#include <apisetcconv.h>
 12#include <minwindef.h>
 13#include <minwinbase.h>
 14#include <ntioring_x.h>
 15
 16#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
 17#if NTDDI_VERSION >= NTDDI_WIN10_CO
 18
 19DECLARE_HANDLE(HIORING);
 20
 21typedef enum IORING_SQE_FLAGS {
 22  IOSQE_FLAGS_NONE = 0
 23#if NTDDI_VERSION >= NTDDI_WIN10_NI
 24  , IOSQE_FLAGS_DRAIN_PRECEDING_OPS = 0x00000001
 25#endif
 26} IORING_SQE_FLAGS;
 27DEFINE_ENUM_FLAG_OPERATORS(IORING_SQE_FLAGS)
 28
 29typedef enum IORING_CREATE_REQUIRED_FLAGS {
 30  IORING_CREATE_REQUIRED_FLAGS_NONE = 0
 31} IORING_CREATE_REQUIRED_FLAGS;
 32DEFINE_ENUM_FLAG_OPERATORS(IORING_CREATE_REQUIRED_FLAGS)
 33
 34typedef enum IORING_CREATE_ADVISORY_FLAGS {
 35  IORING_CREATE_ADVISORY_FLAGS_NONE = 0,
 36  IORING_CREATE_SKIP_BUILDER_PARAM_CHECKS = 0x00000001
 37} IORING_CREATE_ADVISORY_FLAGS;
 38DEFINE_ENUM_FLAG_OPERATORS(IORING_CREATE_ADVISORY_FLAGS)
 39
 40typedef struct IORING_CREATE_FLAGS {
 41  IORING_CREATE_REQUIRED_FLAGS Required;
 42  IORING_CREATE_ADVISORY_FLAGS Advisory;
 43} IORING_CREATE_FLAGS;
 44
 45typedef struct IORING_INFO {
 46  IORING_VERSION IoRingVersion;
 47  IORING_CREATE_FLAGS Flags;
 48  UINT32 SubmissionQueueSize;
 49  UINT32 CompletionQueueSize;
 50} IORING_INFO;
 51
 52typedef struct IORING_CAPABILITIES {
 53  IORING_VERSION MaxVersion;
 54  UINT32 MaxSubmissionQueueSize;
 55  UINT32 MaxCompletionQueueSize;
 56  IORING_FEATURE_FLAGS FeatureFlags;
 57} IORING_CAPABILITIES;
 58
 59typedef enum IORING_REF_KIND {
 60  IORING_REF_RAW,
 61  IORING_REF_REGISTERED
 62} IORING_REF_KIND;
 63
 64typedef struct IORING_HANDLE_REF {
 65#ifdef __cplusplus
 66  explicit IORING_HANDLE_REF(HANDLE h) : Kind(IORING_REF_KIND::IORING_REF_RAW), Handle(h) {}
 67  explicit IORING_HANDLE_REF(UINT32 index) : Kind(IORING_REF_KIND::IORING_REF_REGISTERED), Handle(index) {}
 68#endif
 69
 70  IORING_REF_KIND Kind;
 71  union HandleUnion {
 72#ifdef __cplusplus
 73    HandleUnion(HANDLE h) : Handle(h) {}
 74    HandleUnion(UINT32 index) : Index(index) {}
 75#endif
 76    HANDLE Handle;
 77    UINT32 Index;
 78  } Handle;
 79} IORING_HANDLE_REF;
 80
 81#ifdef __cplusplus
 82#define IoRingHandleRefFromHandle(h) IORING_HANDLE_REF(static_cast<HANDLE>(h))
 83#define IoRingHandleRefFromIndex(i) IORING_HANDLE_REF(static_cast<UINT32>(i))
 84#else
 85#define IoRingHandleRefFromHandle(h) {IORING_REF_RAW, {.Handle = h}}
 86#define IoRingHandleRefFromIndex(i) {IORING_REF_REGISTERED, {.Index = i}}
 87#endif
 88
 89typedef struct IORING_BUFFER_REF {
 90#ifdef __cplusplus
 91  explicit IORING_BUFFER_REF(void* address) : Kind(IORING_REF_KIND::IORING_REF_RAW), Buffer(address) {}
 92  explicit IORING_BUFFER_REF(IORING_REGISTERED_BUFFER registeredBuffer) : Kind(IORING_REF_KIND::IORING_REF_REGISTERED), Buffer(registeredBuffer) {}
 93  IORING_BUFFER_REF(UINT32 index, UINT32 offset) : IORING_BUFFER_REF(IORING_REGISTERED_BUFFER{index, offset}) {}
 94#endif
 95
 96  IORING_REF_KIND Kind;
 97  union BufferUnion {
 98#ifdef __cplusplus
 99    BufferUnion(void* address) : Address(address) {}
100    BufferUnion(IORING_REGISTERED_BUFFER indexAndOffset) : IndexAndOffset(indexAndOffset) {}
101#endif
102    void* Address;
103    IORING_REGISTERED_BUFFER IndexAndOffset;
104  }Buffer;
105} IORING_BUFFER_REF;
106
107#ifdef __cplusplus
108#define IoRingBufferRefFromPointer(p) IORING_BUFFER_REF(static_cast<void*>(p))
109#define IoRingBufferRefFromIndexAndOffset(i,o) IORING_BUFFER_REF((i),(o))
110#else
111#define IoRingBufferRefFromPointer(p) {IORING_REF_RAW, {.Address = p}}
112#define IoRingBufferRefFromIndexAndOffset(i,o) {IORING_REF_REGISTERED, {.IndexAndOffset = {(i),(o)}}}
113#endif
114
115typedef struct IORING_CQE {
116  UINT_PTR UserData;
117  HRESULT ResultCode;
118  ULONG_PTR Information;
119} IORING_CQE;
120
121#ifdef __cplusplus
122extern "C" {
123#endif
124
125STDAPI QueryIoRingCapabilities(IORING_CAPABILITIES* capabilities);
126STDAPI_(WINBOOL) IsIoRingOpSupported(HIORING ioRing, IORING_OP_CODE op);
127STDAPI CreateIoRing(IORING_VERSION ioringVersion, IORING_CREATE_FLAGS flags, UINT32 submissionQueueSize, UINT32 completionQueueSize, HIORING* h);
128STDAPI GetIoRingInfo(HIORING ioRing, IORING_INFO* info);
129STDAPI SubmitIoRing(HIORING ioRing, UINT32 waitOperations, UINT32 milliseconds, UINT32* submittedEntries);
130STDAPI CloseIoRing(HIORING ioRing);
131STDAPI PopIoRingCompletion(HIORING ioRing, IORING_CQE* cqe);
132STDAPI SetIoRingCompletionEvent(HIORING ioRing, HANDLE hEvent);
133STDAPI BuildIoRingCancelRequest(HIORING ioRing, IORING_HANDLE_REF file, UINT_PTR opToCancel, UINT_PTR userData);
134STDAPI BuildIoRingReadFile(HIORING ioRing, IORING_HANDLE_REF fileRef, IORING_BUFFER_REF dataRef, UINT32 numberOfBytesToRead, UINT64 fileOffset, UINT_PTR userData, IORING_SQE_FLAGS flags);
135STDAPI BuildIoRingRegisterFileHandles(HIORING ioRing, UINT32 count, HANDLE const handles[], UINT_PTR userData);
136STDAPI BuildIoRingRegisterBuffers(HIORING ioRing, UINT32 count, IORING_BUFFER_INFO const buffers[], UINT_PTR userData);
137#if NTDDI_VERSION >= NTDDI_WIN10_NI
138STDAPI BuildIoRingWriteFile(HIORING ioRing, IORING_HANDLE_REF fileRef, IORING_BUFFER_REF bufferRef, UINT32 numberOfBytesToWrite, UINT64 fileOffset, FILE_WRITE_FLAGS writeFlags, UINT_PTR userData, IORING_SQE_FLAGS sqeFlags);
139STDAPI BuildIoRingFlushFile(HIORING ioRing, IORING_HANDLE_REF fileRef, FILE_FLUSH_MODE flushMode, UINT_PTR userData, IORING_SQE_FLAGS sqeFlags);
140STDAPI BuildIoRingReadFileScatter(HIORING ioRing, IORING_HANDLE_REF fileRef, UINT32 segmentCount, FILE_SEGMENT_ELEMENT segmentArray[], UINT32 numberOfBytesToRead, UINT64 fileOffset, UINT_PTR userData, IORING_SQE_FLAGS sqeFlags);
141STDAPI BuildIoRingWriteFileGather(HIORING ioRing, IORING_HANDLE_REF fileRef, UINT32 segmentCount, FILE_SEGMENT_ELEMENT segmentArray[], UINT32 numberOfBytesToWrite, UINT64 fileOffset, FILE_WRITE_FLAGS writeFlags, UINT_PTR userData, IORING_SQE_FLAGS sqeFlags);
142#endif
143
144#ifdef __cplusplus
145}
146#endif
147
148#endif /* NTDDI_WIN10_CO */
149#endif /* WINAPI_PARTITION_APP */
150#endif /* _APISET_IORING_ */