return Error;
}
+INT
+WSAAPI
+MapUnicodeProtocolInfoToAnsi(IN LPWSAPROTOCOL_INFOW UnicodeInfo,
+ OUT LPWSAPROTOCOL_INFOA AnsiInfo)
+{
+ INT ReturnValue;
+
+ /* Copy all the data that doesn't need converting */
+ RtlCopyMemory(AnsiInfo,
+ UnicodeInfo,
+ FIELD_OFFSET(WSAPROTOCOL_INFOA, szProtocol));
+
+ /* Now convert the protocol string */
+ ReturnValue = WideCharToMultiByte(CP_ACP,
+ 0,
+ UnicodeInfo->szProtocol,
+ -1,
+ AnsiInfo->szProtocol,
+ sizeof(AnsiInfo->szProtocol),
+ NULL,
+ NULL);
+ if (!ReturnValue) return WSASYSCALLFAILURE;
+
+ /* Return success */
+ return ERROR_SUCCESS;
+}
/*
* @implemented
PCATALOG_ENTRY Provider;
INT Errno;
int Error;
+ WSAPROTOCOL_INFOW ProtocolInfo;
+ PCHAR OldOptVal = NULL;
+ INT OldOptLen = 0;
if (!WSAINITIALIZED)
{
return SOCKET_ERROR;
}
+ /* Check if ANSI data was requested */
+ if ((level == SOL_SOCKET) && (optname == SO_PROTOCOL_INFOA))
+ {
+ /* Validate size and pointers */
+ Errno = NO_ERROR;
+ _SEH2_TRY
+ {
+ if (!(optval) ||
+ !(optlen) ||
+ (*optlen < sizeof(WSAPROTOCOL_INFOA)))
+ {
+ /* Set return size and error code */
+ *optlen = sizeof(WSAPROTOCOL_INFOA);
+ Errno = WSAEFAULT;
+ _SEH2_LEAVE;
+ }
+
+ /* It worked. Save the values */
+ OldOptLen = *optlen;
+ OldOptVal = optval;
+
+ /* Hack them so WSP will know how to deal with it */
+ *optlen = sizeof(WSAPROTOCOL_INFOW);
+ optval = (PCHAR)&ProtocolInfo;
+ optname = SO_PROTOCOL_INFOW;
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ Errno = WSAEFAULT;
+ }
+ _SEH2_END;
+
+ /* Did we encounter invalid parameters? */
+ if (Errno != NO_ERROR)
+ {
+ /* Fail */
+ Error = SOCKET_ERROR;
+ goto Exit;
+ }
+ }
+
Error = Provider->ProcTable.lpWSPGetSockOpt(s,
level,
optname,
optlen,
&Errno);
+ /* Did we use the A->W hack? */
+ if (Error == ERROR_SUCCESS && OldOptVal)
+ {
+ /* We did, so we have to convert the unicode info to ansi */
+ Errno = MapUnicodeProtocolInfoToAnsi(&ProtocolInfo,
+ (LPWSAPROTOCOL_INFOA)
+ OldOptVal);
+
+ /* Return the length */
+ _SEH2_TRY
+ {
+ *optlen = OldOptLen;
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ Errno = WSAEFAULT;
+ Error = SOCKET_ERROR;
+ }
+ _SEH2_END;
+ }
+
+Exit:
DereferenceProviderByPointer(Provider);
if (Error == SOCKET_ERROR)