diff --git a/lib/std/os/win32/types.c3 b/lib/std/os/win32/types.c3 index 443c428bb..12b96579b 100644 --- a/lib/std/os/win32/types.c3 +++ b/lib/std/os/win32/types.c3 @@ -81,6 +81,7 @@ def Win32_LPVOID = void*; def Win32_LPWORD = Win32_WORD*; def Win32_LPWSTR = Win32_WCHAR*; def Win32_LRESULT = Win32_LONG_PTR; +def Win32_NTSTATUS = Win32_LONG; def Win32_PBOOL = Win32_BOOL*; def Win32_PBOOLEAN = Win32_BOOLEAN*; def Win32_PBYTE = Win32_BYTE*; diff --git a/lib/std/os/win32/wincon.c3 b/lib/std/os/win32/wincon.c3 new file mode 100644 index 000000000..70cb951c0 --- /dev/null +++ b/lib/std/os/win32/wincon.c3 @@ -0,0 +1,61 @@ +// console + +module std::os::win32 @if(env::WIN32); + +struct Win32_KEY_EVENT_RECORD +{ + Win32_BOOL bKeyDown; + Win32_WORD wRepeatCount; + Win32_WORD wVirtualKeyCode; + Win32_WORD wVirtualScanCode; + union uChar + { + Win32_WCHAR unicodeChar; + Win32_CHAR asciiChar; + } + Win32_DWORD dwControlKeyState; +} + +struct Win32_COORD +{ + Win32_SHORT x; + Win32_SHORT y; +} + +struct Win32_MOUSE_EVENT_RECORD +{ + Win32_COORD dwMousePosition; + Win32_DWORD dwButtonState; + Win32_DWORD dwControlKeyState; + Win32_DWORD dwEventFlags; +} + +struct Win32_WINDOW_BUFFER_SIZE_RECORD +{ + Win32_COORD dwSize; +} + +struct Win32_MENU_EVENT_RECORD +{ + Win32_UINT dwCommandId; +} + +struct Win32_FOCUS_EVENT_RECORD +{ + Win32_BOOL bSetFocus; +} + +struct Win32_INPUT_RECORD +{ + Win32_WORD eventType; + union event + { + Win32_KEY_EVENT_RECORD keyEvent; + Win32_MOUSE_EVENT_RECORD mouseEvent; + Win32_WINDOW_BUFFER_SIZE_RECORD windowBufferSizeEvent; + Win32_MENU_EVENT_RECORD menuEvent; + Win32_FOCUS_EVENT_RECORD focusEvent; + } +} + +def Win32_PCOORD = Win32_COORD*; \ No newline at end of file diff --git a/lib/std/os/win32/windef.c3 b/lib/std/os/win32/windef.c3 index 1294c3203..05fed41f5 100644 --- a/lib/std/os/win32/windef.c3 +++ b/lib/std/os/win32/windef.c3 @@ -20,6 +20,18 @@ struct Win32_SIZE Win32_LONG cy; } +struct Win32_WSABUF +{ + Win32_ULONG len; + Win32_CHAR* buf; +} + +struct Win32_SOCKADDR +{ + Win32_USHORT sa_family; + Win32_CHAR[14]* sa_data; +} + def Win32_PSIZE = Win32_SIZE*; def Win32_NPSIZE = Win32_SIZE*; def Win32_LPSIZE = Win32_SIZE*; @@ -31,3 +43,9 @@ def Win32_LPOINT = Win32_POINT*; def Win32_PRECT = Win32_RECT*; def Win32_NPRECT = Win32_RECT*; def Win32_LPRECT = Win32_RECT*; + +def Win32_PWSABUF = Win32_WSABUF*; +def Win32_LPWSABUF = Win32_WSABUF*; + +def Win32_PSOCKADDR = Win32_SOCKADDR*; +def Win32_LPSOCKADDR = Win32_SOCKADDR*; \ No newline at end of file diff --git a/lib/std/os/win32/ws2def.c3 b/lib/std/os/win32/ws2def.c3 new file mode 100644 index 000000000..041b62701 --- /dev/null +++ b/lib/std/os/win32/ws2def.c3 @@ -0,0 +1,31 @@ +module std::os::win32 @if(env::WIN32); + +struct Win32_addrinfo +{ + Win32_INT ai_flags; + Win32_INT ai_family; + Win32_INT ai_socktype; + Win32_INT ai_protocol; + Win32_SIZE_T ai_addrlen; + Win32_CHAR* ai_canonname; + Win32_SOCKADDR* ai_addr; + Win32_ADDRINFO* ai_next; +} + +def Win32_ADDRINFO = Win32_addrinfo; +def Win32_ADDRINFOA = Win32_ADDRINFO; +def Win32_PADDRINFOA = Win32_ADDRINFO*; + +struct Win32_addrinfoW { + Win32_INT ai_flags; + Win32_INT ai_family; + Win32_INT ai_socktype; + Win32_INT ai_protocol; + Win32_SIZE_T ai_addrlen; + Win32_PWSTR ai_canonname; + Win32_SOCKADDR *ai_addr; + Win32_addrinfo *ai_next; +} + +def Win32_ADDRINFOW = Win32_addrinfoW; +def Win32_PADDRINFOW = Win32_addrinfoW*; \ No newline at end of file diff --git a/lib/std/os/win32/wsa.c3 b/lib/std/os/win32/wsa.c3 index 15a0dbaf2..d80b238c7 100644 --- a/lib/std/os/win32/wsa.c3 +++ b/lib/std/os/win32/wsa.c3 @@ -3,6 +3,7 @@ module std::os::win32 @if(env::WIN32); // See https://github.com/wine-mirror/wine/blob/master/include/winsock2.h distinct WSAError = int; + struct Win32_pollfd { Win32_SOCKET fd; @@ -13,6 +14,99 @@ def Win32_WSAPOLLFD = Win32_pollfd; def Win32_PWSAPOLLFD = Win32_WSAPOLLFD*; def Win32_LPWSAPOLLFD = Win32_WSAPOLLFD*; +struct Win32_InAddr +{ + union + { + struct s_un_b + { + Win32_UCHAR s_b1; + Win32_UCHAR s_b2; + Win32_UCHAR s_b3; + Win32_UCHAR s_b4; + } + struct s_un_w + { + Win32_USHORT s_w1; + Win32_USHORT s_w2; + } + Win32_ULONG s_addr; + } +} + +struct Win32_SOCKADDR_IN +{ + Win32_SHORT sin_family; + Win32_USHORT sin_port; + Win32_InAddr sin_addr; + Win32_CHAR[8]* sin_zero; +} + +const usz _SS_PAD1SIZE = 6; +const usz _SS_PAD2SIZE = 112; + +struct Win32_SOCKADDR_STORAGE +{ + Win32_USHORT ss_family; + Win32_CHAR[_SS_PAD1SIZE]* __ss_pad1; + Win32_INT64 __ss_align; + Win32_CHAR[_SS_PAD2SIZE]* __ss_pad2; +} + +def Win32_WSAOVERLAPPED = Win32_OVERLAPPED; +def Win32_LPWSAOVERLAPPED = Win32_WSAOVERLAPPED*; + +def Win32_LPWSAOVERLAPPED_COMPLETION_ROUTINE = fn void ( + Win32_DWORD dwError, + Win32_DWORD cbTransferred, + Win32_LPWSAOVERLAPPED + lpOverlapped, + Win32_DWORD dwFlags +); + +def Win32_LPFN_WSARECV = fn CInt( + Win32_SOCKET socket, + Win32_LPWSABUF buffers, + Win32_DWORD buffer_count, + Win32_LPDWORD bytes, + Win32_LPDWORD flags, + Win32_LPWSAOVERLAPPED overlapped, + Win32_LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine +); + +def Win32_LPFN_WSARECVFROM = fn CInt( + Win32_SOCKET socket, + Win32_LPWSABUF buffers, + Win32_DWORD buffer_count, + Win32_LPDWORD bytes, + Win32_LPDWORD flags, + Win32_SOCKADDR* addr, + Win32_LPINT addr_len, + Win32_LPWSAOVERLAPPED overlapped, + Win32_LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine +); + +def Win32_LPFn_CONNECTEX = fn bool( + Win32_SOCKET, + Win32_SOCKADDR*, + Win32_INT, + Win32_PVOID, + Win32_DWORD, + Win32_LPDWORD, + void* +); + +def Win32_LPFn_ACCEPTEX = fn bool( + Win32_SOCKET, + Win32_SOCKET, + Win32_PVOID, + Win32_DWORD, + Win32_DWORD, + Win32_DWORD, + Win32_LPDWORD, + void* +); + const Win32_SHORT POLLERR = 0x0001; const Win32_SHORT POLLHUP = 0x0002; const Win32_SHORT POLLNVAL = 0x0004;