On Monday, 6 June 2016 at 16:13:48 UTC, Vladimir Panteleev wrote:
On Monday, 6 June 2016 at 16:04:30 UTC, Jonathan Marler wrote:
I'm writing some platform specific D code and I've found that
what the druntime exposes for the windows platform is pretty
lean. I'm guessing that the purpose of the druntime version
of the windows api is to implement the minimum required to
support the windows platform and not meant to be a
full-featured interface to windows. Is this the case?
Erm, not since 2.070:
Hmmm...it seems to be missing quite alot though. Especially the
winsock api. Over the weekend I was writing some code that uses
a windows IOCompletionPort and had to add a fair amount of code
that was missing:
import core.sys.windows.windows;
import core.sys.windows.winsock2;
// NOTE: not sure if this stuff should be included in
core.sys.windows.winsock2
alias u_long = uint; // NOTE: not sure if uint is the best
alias for u_long
// The actual sockaddr_in structure in windows is 24 bytes long,
// but the sockaddr_in defined in core.sys.windows.winsock2 is
only 20.
// This caused an error when calling AcceptEx that indicated
the buffer
// size for sockaddr_in was too small.
union real_sockaddr_in {
sockaddr_in addr;
ubyte[24] padding; // make sure the sockaddr_in takes 24 bytes
}
struct WSABUF {
u_long len;
char* buf;
}
alias LPWSABUF = WSABUF*;
// NOTE: WSAOVERLAPPED is supposed to be castable to and from
OVERLAPPED.
// Maybe this doesn't need to be defined, maybe I could
just always use OVERLAPPED?
struct WSAOVERLAPPED {
ULONG* Internal;
ULONG* InternalHigh;
union {
struct {
DWORD Offset;
DWORD OffsetHigh;
}
PVOID Pointer;
}
HANDLE hEvent;
}
alias LPWSAOVERLAPPED = WSAOVERLAPPED*;
alias LPWSAOVERLAPPED_COMPLETION_ROUTINE = void function(uint,
uint, LPWSAOVERLAPPED, uint);
enum : int {
SIO_GET_EXTENSION_FUNCTION_POINTER = 0xc8000006,
}
enum GUID WSAID_ACCEPTEX =
{0xb5367df1,0xcbac,0x11cf,[0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92]};
alias LPFN_ACCEPTEX = extern(Windows) bool function(SOCKET
listenSocket,
SOCKET acceptSocket,
PVOID outputBuffer,
DWORD receiveDataLength,
DWORD localAddressLength,
DWORD remoteAddressLength,
DWORD* bytesReceived,
OVERLAPPED* overlapped)
nothrow @nogc;
extern(Windows) int WSAIoctl(SOCKET s, uint dwIoControlCode,
void* lpvInBuffer, uint cbInBuffer,
void* lpvOutBuffer, uint cbOutBuffer,
uint* lpcbBytesReturned,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine) nothrow
@nogc;
extern(Windows) int WSARecv(SOCKET s, LPWSABUF lpBuffer, DWORD
bufferCount,
LPDWORD numberOfBytesReceived, LPDWORD flags,
LPWSAOVERLAPPED overlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE completionRoutine);