msvcrXXX.dll exported __pioinfo but ucrtbase.dll doesn't.
I understand why __pioinfo is no longer exported; it is clearly internal implementation.
However CRuby (a.k.a. MRI; Ruby C implementation) uses __pioinfo.
CRuby needs __pioinfo
* to associate socket and fd: CRuby creates fd with dummy file handle and set socket
* to implement overlapped I/O for Windows 2000/XP
* to emulate fcntl(2)
If Visual C++ 14 really no longer export __pioinfo, CRuby want crtbase.dll to add and export functions to achieve above usage.
Following are detail of above usage.
= to associate socket and fd
CRuby needs unified handling files, pipes, sockets and so on through file descriptors because of its specification derived from Unix culture.
A socket must be associated with a fd, and a Ruby script handle a socket through such fds.
Therefore CRuby associate fd and socket with __pioinfo. After CRuby accept a socket, it creates dummy file handle with NUL device, associate a new fd with the file handle by _open_osfhandle, and set the socket as operating-system file handle into __pioinfo[fd]->osfhnd.
= to implement overlapped I/O for Windows 2000/XP
CRuby needs a Cancelable I/O because it want to implement an asyncronous I/O. Usually on Windows it uses CancelIoEx function. However it is only supported Windows Vista or later. At that time Microsoft still supported Windows XP and CRuby also want to support Windows XP. Therefore CRuby implements overlapped I/O itself, and it requires __pioinfo[fd]->osfile and ->lock.
= to emulate fcntl(2)
To emulate fcntl(fd, F_DUPFD) CRuby need to get flags of given fd. So CRuby sees __pioinfo[fd]->osfile.