WSPStartup(): should pass upcall table by reference, not by value. WSPGetProcTable(): lpProcTable should be "LPVOID FAR *" since it is used to query multiple tables, not just the SPI table. WSPSelect(): should not pass nfds parameter, as this is ALWAYS ignored. Forcing SPI entrypoints to honor errors like WSAEINPROGRESS and WSANOTINITIALISED means all service providers must maintain their own per-thread state. For non-overlapped sockets, should they be _IO_ALERT or _IO_NONALERT? Use Reserved field of APC for flags sent to completion routine!