Browse Source

add some wsa based additions to `core:sys/windows`

Laytan Laats 1 year ago
parent
commit
1af84e082c
2 changed files with 46 additions and 15 deletions
  1. 4 0
      core/sys/windows/kernel32.odin
  2. 42 15
      core/sys/windows/ws2_32.odin

+ 4 - 0
core/sys/windows/kernel32.odin

@@ -545,6 +545,10 @@ FILE_MAP_RESERVE         :: DWORD(0x80000000)
 FILE_MAP_TARGETS_INVALID :: DWORD(0x40000000)
 FILE_MAP_TARGETS_INVALID :: DWORD(0x40000000)
 FILE_MAP_LARGE_PAGES     :: DWORD(0x20000000)
 FILE_MAP_LARGE_PAGES     :: DWORD(0x20000000)
 
 
+// Flags for `SetFileCompletionNotificationModes`.
+FILE_SKIP_COMPLETION_PORT_ON_SUCCESS :: 0x1
+FILE_SKIP_SET_EVENT_ON_HANDLE        :: 0x2
+
 PAGE_NOACCESS          :: 0x01
 PAGE_NOACCESS          :: 0x01
 PAGE_READONLY          :: 0x02
 PAGE_READONLY          :: 0x02
 PAGE_READWRITE         :: 0x04
 PAGE_READWRITE         :: 0x04

+ 42 - 15
core/sys/windows/ws2_32.odin

@@ -2,12 +2,12 @@
 package sys_windows
 package sys_windows
 
 
 // Define flags to be used with the WSAAsyncSelect() call.
 // Define flags to be used with the WSAAsyncSelect() call.
-FD_READ :: 0x01
-FD_WRITE :: 0x02
-FD_OOB :: 0x04
-FD_ACCEPT :: 0x08
-FD_CONNECT :: 0x10
-FD_CLOSE :: 0x20
+FD_READ       :: 0x01
+FD_WRITE      :: 0x02
+FD_OOB        :: 0x04
+FD_ACCEPT     :: 0x08
+FD_CONNECT    :: 0x10
+FD_CLOSE      :: 0x20
 FD_MAX_EVENTS :: 10
 FD_MAX_EVENTS :: 10
 
 
 INADDR_LOOPBACK :: 0x7f000001
 INADDR_LOOPBACK :: 0x7f000001
@@ -24,10 +24,10 @@ POLLERR    :: 0x0001
 POLLHUP    :: 0x0002
 POLLHUP    :: 0x0002
 POLLNVAL   :: 0x0004
 POLLNVAL   :: 0x0004
 
 
-WSA_POLLFD::struct{
-	fd:SOCKET,
-	events:c_short,
-	revents:c_short,
+WSA_POLLFD :: struct{
+	fd:      SOCKET,
+	events:  c_short,
+	revents: c_short,
 }
 }
 
 
 WSANETWORKEVENTS :: struct {
 WSANETWORKEVENTS :: struct {
@@ -37,16 +37,43 @@ WSANETWORKEVENTS :: struct {
 
 
 WSAEVENT :: HANDLE
 WSAEVENT :: HANDLE
 
 
-WSAID_ACCEPTEX :: GUID{0xb5367df1, 0xcbac, 0x11cf, {0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}}
+WSAID_ACCEPTEX             :: GUID{0xb5367df1, 0xcbac, 0x11cf, {0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}}
 WSAID_GETACCEPTEXSOCKADDRS :: GUID{0xb5367df2, 0xcbac, 0x11cf, {0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}}
 WSAID_GETACCEPTEXSOCKADDRS :: GUID{0xb5367df2, 0xcbac, 0x11cf, {0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}}
+WSAID_CONNECTX             :: GUID{0x25a207b9, 0xddf3, 0x4660, {0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e}}
+
 SIO_GET_EXTENSION_FUNCTION_POINTER :: IOC_INOUT | IOC_WS2 | 6
 SIO_GET_EXTENSION_FUNCTION_POINTER :: IOC_INOUT | IOC_WS2 | 6
-IOC_OUT :: 0x40000000
-IOC_IN :: 0x80000000
+
+IOC_OUT   :: 0x40000000
+IOC_IN    :: 0x80000000
 IOC_INOUT :: (IOC_IN | IOC_OUT)
 IOC_INOUT :: (IOC_IN | IOC_OUT)
-IOC_WS2 :: 0x08000000
+IOC_WS2   :: 0x08000000
+
+SO_UPDATE_ACCEPT_CONTEXT :: 28683
+
+LPFN_CONNECTEX :: #type proc "system" (
+	s:                SOCKET,
+	sockaddr:         ^SOCKADDR_STORAGE_LH,
+	namelen:          c_int,
+	lpSendBuffer:     PVOID,
+	dwSendDataLength: DWORD,
+	lpdwBytesSent:    LPDWORD,
+	lpOverlapped:     LPOVERLAPPED,
+) -> BOOL
+
+LPFN_ACCEPTEX :: #type proc "system" (
+	sListenSocket:         SOCKET,
+	sAcceptSocket:         SOCKET,
+	lpOutputBuffer:        PVOID,
+	dwReceiveDataLength:   DWORD,
+	dwLocalAddressLength:  DWORD,
+	dwRemoteAddressLength: DWORD,
+	lpdwBytesReceived:     LPDWORD,
+	lpOverlapped:          LPOVERLAPPED,
+) -> BOOL
+
 /*
 /*
 Example Load:
 Example Load:
-	load_accept_ex :: proc(listener: SOCKET, fn_acceptex: rawptr) {
+	load_accept_ex :: proc(listener: SOCKET, fn_acceptex: ^LPFN_ACCEPTEX) {
 		bytes: u32
 		bytes: u32
 		guid_accept_ex := WSAID_ACCEPTEX
 		guid_accept_ex := WSAID_ACCEPTEX
 		rc := WSAIoctl(listener, SIO_GET_EXTENSION_FUNCTION_POINTER, &guid_accept_ex, size_of(guid_accept_ex),
 		rc := WSAIoctl(listener, SIO_GET_EXTENSION_FUNCTION_POINTER, &guid_accept_ex, size_of(guid_accept_ex),