Vanara/PInvoke/Ws2_32/mswsockdef.cs

144 lines
8.0 KiB
C#

global using PRIO_BUF = System.IntPtr;
global using RIO_BUFFERID = System.IntPtr;
global using RIO_CQ = System.IntPtr;
global using RIO_RQ = System.IntPtr;
using System;
using System.Runtime.InteropServices;
namespace Vanara.PInvoke;
public static partial class Ws2_32
{
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
public const int RIO_MAX_CQ_SIZE = 0x8000000;
public static readonly RIO_CQ RIO_CORRUPT_CQ = (RIO_CQ)0xFFFFFFFF;
public static readonly RIO_BUFFERID RIO_INVALID_BUFFERID = (RIO_BUFFERID)0xFFFFFFFF;
public static readonly RIO_CQ RIO_INVALID_CQ = (RIO_CQ)0;
public static readonly RIO_RQ RIO_INVALID_RQ = (RIO_RQ)0;
public static readonly uint SIO_SET_COMPATIBILITY_MODE = _WSAIOW(IOC_VENDOR, 300);
#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member
/// <summary>A set of flags that modify the behavior of the <c>RIOSendEx</c> function.</summary>
[PInvokeData("mswsockdef.h", MSDNShortId = "NC:mswsock.LPFN_RIORECEIVE")]
[Flags]
public enum RIO_MSG
{
/// <summary>
/// The request should not trigger the <c>RIONotify</c> function when request completion is inserted into its completion queue.
/// </summary>
RIO_MSG_DONT_NOTIFY = 0x00000001,
/// <summary>
/// The request does not need to be executed immediately. This will insert the request into the request queue, but it may or may not
/// trigger the execution of the request. Sending data may be delayed until a send request is made on the <c>RIO_RQ</c> passed in the
/// <c>SocketQueue</c> parameter without the <c>RIO_MSG_DEFER</c> flag set. To trigger execution for all sends in a send queue, call
/// the <c>RIOSend</c> or <c>RIOSendEx</c> function without the <c>RIO_MSG_DEFER</c> flag set. <c>Note</c> The send request is
/// charged against the outstanding I/O capacity on the <c>RIO_RQ</c> passed in the <c>SocketQueue</c> parameter regardless of
/// whether <c>RIO_MSG_DEFER</c> is set.
/// </summary>
RIO_MSG_DEFER = 0x00000002,
/// <summary>
/// Causes the recv call to only complete when the buffer slice supplied is full, an error occurs, or the connection is terminated.
/// </summary>
RIO_MSG_WAITALL = 0x00000004,
/// <summary>
/// Previous requests added with <c>RIO_MSG_DEFER</c> flag will be committed. When the <c>RIO_MSG_COMMIT_ONLY</c> flag is set, no
/// other flags may be specified. When the <c>RIO_MSG_COMMIT_ONLY</c> flag is set, the <c>pData</c>, <c>pLocalAddress</c>,
/// <c>pRemoteAddress</c>, <c>pControlContext</c>, <c>pFlags</c>, and <c>RequestContext</c> parameters must be NULL and the
/// <c>DataBufferCount</c> parameter must be zero. This flag would normally be used occasionally after a number of requests were
/// issued with the <c>RIO_MSG_DEFER</c> flag set. This eliminates the need when using the <c>RIO_MSG_DEFER</c> flag to make the last
/// request without the <c>RIO_MSG_DEFER</c> flag, which causes the last request to complete much slower than other requests. Unlike
/// other calls to the <c>RIOSendEx</c> function, when the <c>RIO_MSG_COMMIT_ONLY</c> flag is set calls to the <c>RIOSendEx</c>
/// function do not need to be serialized. For a single <c>RIO_RQ</c>, the <c>RIOSendEx</c> function can be called with
/// <c>RIO_MSG_COMMIT_ONLY</c> on one thread while calling the <c>RIOSendEx</c> function on another thread.
/// </summary>
RIO_MSG_COMMIT_ONLY = 0x00000008,
}
/// <summary>
/// The <c>RIO_BUF</c> structure specifies a portion of a registered buffer used for sending or receiving network data with the Winsock
/// registered I/O extensions.
/// </summary>
/// <remarks>
/// <para>
/// The Winsock registered I/O extensions often operate on portions of registered buffers sometimes called buffer slices. The
/// <c>RIO_BUF</c> structure is used by an application that needs to use a small amount of registered memory for sending or receiving
/// network data. The application can often increase performance by registering one large buffer and then using small chunks of the
/// buffer as needed. The <c>RIO_BUF</c> structure may describe any contiguous segment of memory contained in a single buffer registration.
/// </para>
/// <para>
/// A pointer to a <c>RIO_BUF</c> structure is passed as the <c>pData</c> parameter to the RIOSend, RIOSendEx, RIOReceive, and
/// RIOReceiveEx functions to send or receive network data.
/// </para>
/// <para>
/// An application cannot resize a registered buffer simply by using a buffer slice with values larger than the original buffer that was
/// registered using the RIORegisterBuffer function.
/// </para>
/// <para>
/// The <c>RIO_BUF</c> structure is defined in the <c>Mswsockdef.h</c> header file which is automatically included in the
/// <c>Mswsock.h</c> header file. The <c>Mswsockdef.h</c> header file should never be used directly.
/// </para>
/// </remarks>
// https://learn.microsoft.com/en-us/windows/win32/api/mswsockdef/ns-mswsockdef-rio_buf typedef struct _RIO_BUF { RIO_BUFFERID BufferId;
// ULONG Offset; ULONG Length; } RIO_BUF, *PRIO_BUF;
[PInvokeData("mswsockdef.h", MSDNShortId = "NS:mswsockdef._RIO_BUF")]
[StructLayout(LayoutKind.Sequential)]
public struct RIO_BUF
{
/// <summary>The registered buffer descriptor for a Winsock registered I/O buffer used with send and receive requests.</summary>
public RIO_BUFFERID BufferId;
/// <summary>
/// The offset, in bytes, into the buffer specified by the <c>BufferId</c> member. An <c>Offset</c> value of zero points to the
/// beginning of the buffer
/// </summary>
public uint Offset;
/// <summary>A length, in bytes, of the buffer to use from the <c>Offset</c> member.</summary>
public uint Length;
}
/// <summary>
/// The <c>RIORESULT</c> structure contains data used to indicate request completion results used with the Winsock registered I/O extensions.
/// </summary>
/// <remarks>
/// <para>
/// The <c>RIORESULT</c> structure defines the data format used to indicate request completion by the Winsock registered I/O extensions.
/// An application requests completion indications by allocating an array of <c>RIORESULT</c> structures and passing the array of
/// <c>RIORESULT</c> structures to the RIODequeueCompletion function along with the element count. The application need not perform any
/// initialization of the <c>RIORESULT</c> structure elements before calling the <c>RIODequeueCompletion</c> function.
/// </para>
/// <para>
/// The <c>SocketContext</c> member of the <c>RIORESULT</c> structure can be used by an application to identify the RIO_CQ object or the
/// associated application object on which the Winsock registered I/O request was issued. The <c>RequestContext</c> member of the
/// <c>RIORESULT</c> structure can similarly be used to identify the particular Winsock registered I/O request that was completed.
/// </para>
/// <para>
/// The <c>RIORESULT</c> structure is defined in the <c>Mswsockdef.h</c> header file which is automatically included in the
/// <c>Mswsock.h</c> header file. The <c>Mswsockdef.h</c> header file should never be used directly.
/// </para>
/// </remarks>
// https://learn.microsoft.com/en-us/windows/win32/api/mswsockdef/ns-mswsockdef-rioresult typedef struct _RIORESULT { LONG Status; ULONG
// BytesTransferred; ULONGLONG SocketContext; ULONGLONG RequestContext; } RIORESULT, *PRIORESULT;
[PInvokeData("mswsockdef.h", MSDNShortId = "NS:mswsockdef._RIORESULT")]
[StructLayout(LayoutKind.Sequential)]
public struct RIORESULT
{
/// <summary>The completion status of the Winsock registered I/O request.</summary>
public int Status;
/// <summary>The number of bytes sent or received in the I/O request.</summary>
public uint BytesTransferred;
/// <summary>An application-provided context specified in call to the RIOCreateRequestQueue function.</summary>
public ulong SocketContext;
/// <summary>
/// An application-provided context specified with the registered I/O request to the RIOReceive, RIOReceiveEx, RIOSend, and RIOSendEx functions.
/// </summary>
public ulong RequestContext;
}
}