ioringapi.h (5953B) - Raw
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 19 DECLARE_HANDLE(HIORING); 20 21 typedef 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; 27 DEFINE_ENUM_FLAG_OPERATORS(IORING_SQE_FLAGS) 28 29 typedef enum IORING_CREATE_REQUIRED_FLAGS { 30 IORING_CREATE_REQUIRED_FLAGS_NONE = 0 31 } IORING_CREATE_REQUIRED_FLAGS; 32 DEFINE_ENUM_FLAG_OPERATORS(IORING_CREATE_REQUIRED_FLAGS) 33 34 typedef 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; 38 DEFINE_ENUM_FLAG_OPERATORS(IORING_CREATE_ADVISORY_FLAGS) 39 40 typedef struct IORING_CREATE_FLAGS { 41 IORING_CREATE_REQUIRED_FLAGS Required; 42 IORING_CREATE_ADVISORY_FLAGS Advisory; 43 } IORING_CREATE_FLAGS; 44 45 typedef struct IORING_INFO { 46 IORING_VERSION IoRingVersion; 47 IORING_CREATE_FLAGS Flags; 48 UINT32 SubmissionQueueSize; 49 UINT32 CompletionQueueSize; 50 } IORING_INFO; 51 52 typedef struct IORING_CAPABILITIES { 53 IORING_VERSION MaxVersion; 54 UINT32 MaxSubmissionQueueSize; 55 UINT32 MaxCompletionQueueSize; 56 IORING_FEATURE_FLAGS FeatureFlags; 57 } IORING_CAPABILITIES; 58 59 typedef enum IORING_REF_KIND { 60 IORING_REF_RAW, 61 IORING_REF_REGISTERED 62 } IORING_REF_KIND; 63 64 typedef 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 89 typedef 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 115 typedef struct IORING_CQE { 116 UINT_PTR UserData; 117 HRESULT ResultCode; 118 ULONG_PTR Information; 119 } IORING_CQE; 120 121 #ifdef __cplusplus 122 extern "C" { 123 #endif 124 125 STDAPI QueryIoRingCapabilities(IORING_CAPABILITIES* capabilities); 126 STDAPI_(WINBOOL) IsIoRingOpSupported(HIORING ioRing, IORING_OP_CODE op); 127 STDAPI CreateIoRing(IORING_VERSION ioringVersion, IORING_CREATE_FLAGS flags, UINT32 submissionQueueSize, UINT32 completionQueueSize, HIORING* h); 128 STDAPI GetIoRingInfo(HIORING ioRing, IORING_INFO* info); 129 STDAPI SubmitIoRing(HIORING ioRing, UINT32 waitOperations, UINT32 milliseconds, UINT32* submittedEntries); 130 STDAPI CloseIoRing(HIORING ioRing); 131 STDAPI PopIoRingCompletion(HIORING ioRing, IORING_CQE* cqe); 132 STDAPI SetIoRingCompletionEvent(HIORING ioRing, HANDLE hEvent); 133 STDAPI BuildIoRingCancelRequest(HIORING ioRing, IORING_HANDLE_REF file, UINT_PTR opToCancel, UINT_PTR userData); 134 STDAPI BuildIoRingReadFile(HIORING ioRing, IORING_HANDLE_REF fileRef, IORING_BUFFER_REF dataRef, UINT32 numberOfBytesToRead, UINT64 fileOffset, UINT_PTR userData, IORING_SQE_FLAGS flags); 135 STDAPI BuildIoRingRegisterFileHandles(HIORING ioRing, UINT32 count, HANDLE const handles[], UINT_PTR userData); 136 STDAPI BuildIoRingRegisterBuffers(HIORING ioRing, UINT32 count, IORING_BUFFER_INFO const buffers[], UINT_PTR userData); 137 #if NTDDI_VERSION >= NTDDI_WIN10_NI 138 STDAPI 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); 139 STDAPI BuildIoRingFlushFile(HIORING ioRing, IORING_HANDLE_REF fileRef, FILE_FLUSH_MODE flushMode, UINT_PTR userData, IORING_SQE_FLAGS sqeFlags); 140 STDAPI BuildIoRingReadFileScatter(HIORING ioRing, IORING_HANDLE_REF fileRef, UINT32 segmentCount, FILE_SEGMENT_ELEMENT segmentArray[], UINT32 numberOfBytesToRead, UINT64 fileOffset, UINT_PTR userData, IORING_SQE_FLAGS sqeFlags); 141 STDAPI 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_ */