diff --git a/contrib/win32/openssh/sshd-session.vcxproj b/contrib/win32/openssh/sshd-session.vcxproj
index 7f759dcecf6..ceb8e630ea3 100644
--- a/contrib/win32/openssh/sshd-session.vcxproj
+++ b/contrib/win32/openssh/sshd-session.vcxproj
@@ -187,7 +187,7 @@
Level1
Disabled
- _CRT_DECLARE_NONSTDC_NAMES=0;_WIN32_WINNT=0x601;;WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)
+ _CRT_DECLARE_NONSTDC_NAMES=0;_WIN32_WINNT=0x0A00;;WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)
false
$(SolutionDir);$(LibreSSL-Path)include;$(ZLib-Path);$(OpenSSH-Src-Path)includes;$(OpenSSH-Src-Path);$(OpenSSH-Src-Path)contrib\win32\win32compat;$(OpenSSH-Src-Path)libkrb;$(OpenSSH-Src-Path)libkrb\libKrb5;%(AdditionalIncludeDirectories)
MultiThreadedDebug
@@ -215,7 +215,7 @@
Level1
Disabled
- _CRT_DECLARE_NONSTDC_NAMES=0;_WIN32_WINNT=0x601;;WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)
+ _CRT_DECLARE_NONSTDC_NAMES=0;_WIN32_WINNT=0x0A00;;WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)
false
$(SolutionDir);$(LibreSSL-Path)include;$(ZLib-Path);$(OpenSSH-Src-Path)includes;$(OpenSSH-Src-Path);$(OpenSSH-Src-Path)contrib\win32\win32compat;$(OpenSSH-Src-Path)libkrb;$(OpenSSH-Src-Path)libkrb\libKrb5;%(AdditionalIncludeDirectories)
MultiThreadedDebug
@@ -243,7 +243,7 @@
Level1
Disabled
- _CRT_DECLARE_NONSTDC_NAMES=0;_WIN32_WINNT=0x601;;WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)
+ _CRT_DECLARE_NONSTDC_NAMES=0;_WIN32_WINNT=0x0A00;;WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)
false
$(SolutionDir);$(LibreSSL-Path)include;$(ZLib-Path);$(OpenSSH-Src-Path)includes;$(OpenSSH-Src-Path);$(OpenSSH-Src-Path)contrib\win32\win32compat;$(OpenSSH-Src-Path)libkrb;$(OpenSSH-Src-Path)libkrb\libKrb5;%(AdditionalIncludeDirectories)
MultiThreadedDebug
@@ -271,7 +271,7 @@
Level1
Disabled
- _CRT_DECLARE_NONSTDC_NAMES=0;_WIN32_WINNT=0x601;;WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)
+ _CRT_DECLARE_NONSTDC_NAMES=0;_WIN32_WINNT=0x0A00;;WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)
false
$(SolutionDir);$(LibreSSL-Path)include;$(ZLib-Path);$(OpenSSH-Src-Path)includes;$(OpenSSH-Src-Path);$(OpenSSH-Src-Path)contrib\win32\win32compat;$(OpenSSH-Src-Path)libkrb;$(OpenSSH-Src-Path)libkrb\libKrb5;%(AdditionalIncludeDirectories)
MultiThreadedDebug
@@ -301,7 +301,7 @@
MaxSpeed
true
true
- _CRT_DECLARE_NONSTDC_NAMES=0;_WIN32_WINNT=0x601;;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ _CRT_DECLARE_NONSTDC_NAMES=0;_WIN32_WINNT=0x0A00;;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
true
$(SolutionDir);$(LibreSSL-Path)include;$(ZLib-Path);$(OpenSSH-Src-Path)includes;$(OpenSSH-Src-Path);$(OpenSSH-Src-Path)contrib\win32\win32compat;$(OpenSSH-Src-Path)libkrb;$(OpenSSH-Src-Path)libkrb\libKrb5;%(AdditionalIncludeDirectories)
MultiThreaded
@@ -333,7 +333,7 @@
MaxSpeed
true
true
- _CRT_DECLARE_NONSTDC_NAMES=0;_WIN32_WINNT=0x601;;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ _CRT_DECLARE_NONSTDC_NAMES=0;_WIN32_WINNT=0x0A00;;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
true
$(SolutionDir);$(LibreSSL-Path)include;$(ZLib-Path);$(OpenSSH-Src-Path)includes;$(OpenSSH-Src-Path);$(OpenSSH-Src-Path)contrib\win32\win32compat;$(OpenSSH-Src-Path)libkrb;$(OpenSSH-Src-Path)libkrb\libKrb5;%(AdditionalIncludeDirectories)
MultiThreaded
@@ -366,7 +366,7 @@
MaxSpeed
true
true
- _CRT_DECLARE_NONSTDC_NAMES=0;_WIN32_WINNT=0x601;;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ _CRT_DECLARE_NONSTDC_NAMES=0;_WIN32_WINNT=0x0A00;;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
true
$(SolutionDir);$(LibreSSL-Path)include;$(ZLib-Path);$(OpenSSH-Src-Path)includes;$(OpenSSH-Src-Path);$(OpenSSH-Src-Path)contrib\win32\win32compat;$(OpenSSH-Src-Path)libkrb;$(OpenSSH-Src-Path)libkrb\libKrb5;%(AdditionalIncludeDirectories)
MultiThreaded
@@ -399,7 +399,7 @@
MaxSpeed
true
true
- _CRT_DECLARE_NONSTDC_NAMES=0;_WIN32_WINNT=0x601;;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ _CRT_DECLARE_NONSTDC_NAMES=0;_WIN32_WINNT=0x0A00;;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
true
$(SolutionDir);$(LibreSSL-Path)include;$(ZLib-Path);$(OpenSSH-Src-Path)includes;$(OpenSSH-Src-Path);$(OpenSSH-Src-Path)contrib\win32\win32compat;$(OpenSSH-Src-Path)libkrb;$(OpenSSH-Src-Path)libkrb\libKrb5;%(AdditionalIncludeDirectories)
MultiThreaded
diff --git a/contrib/win32/openssh/sshd.vcxproj b/contrib/win32/openssh/sshd.vcxproj
index 7a5d07ddc1a..9d2268d9a84 100644
--- a/contrib/win32/openssh/sshd.vcxproj
+++ b/contrib/win32/openssh/sshd.vcxproj
@@ -187,7 +187,7 @@
Level1
Disabled
- _CRT_DECLARE_NONSTDC_NAMES=0;_WIN32_WINNT=0x601;;WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)
+ _CRT_DECLARE_NONSTDC_NAMES=0;_WIN32_WINNT=0x0A00;;WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)
false
$(SolutionDir);$(LibreSSL-Path)include;$(ZLib-Path);$(OpenSSH-Src-Path)includes;$(OpenSSH-Src-Path);$(OpenSSH-Src-Path)contrib\win32\win32compat;$(OpenSSH-Src-Path)libkrb;$(OpenSSH-Src-Path)libkrb\libKrb5;%(AdditionalIncludeDirectories)
MultiThreadedDebug
@@ -215,7 +215,7 @@
Level1
Disabled
- _CRT_DECLARE_NONSTDC_NAMES=0;_WIN32_WINNT=0x601;;WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)
+ _CRT_DECLARE_NONSTDC_NAMES=0;_WIN32_WINNT=0x0A00;;WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)
false
$(SolutionDir);$(LibreSSL-Path)include;$(ZLib-Path);$(OpenSSH-Src-Path)includes;$(OpenSSH-Src-Path);$(OpenSSH-Src-Path)contrib\win32\win32compat;$(OpenSSH-Src-Path)libkrb;$(OpenSSH-Src-Path)libkrb\libKrb5;%(AdditionalIncludeDirectories)
MultiThreadedDebug
@@ -243,7 +243,7 @@
Level1
Disabled
- _CRT_DECLARE_NONSTDC_NAMES=0;_WIN32_WINNT=0x601;;WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)
+ _CRT_DECLARE_NONSTDC_NAMES=0;_WIN32_WINNT=0x0A00;;WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)
false
$(SolutionDir);$(LibreSSL-Path)include;$(ZLib-Path);$(OpenSSH-Src-Path)includes;$(OpenSSH-Src-Path);$(OpenSSH-Src-Path)contrib\win32\win32compat;$(OpenSSH-Src-Path)libkrb;$(OpenSSH-Src-Path)libkrb\libKrb5;%(AdditionalIncludeDirectories)
MultiThreadedDebug
@@ -271,7 +271,7 @@
Level1
Disabled
- _CRT_DECLARE_NONSTDC_NAMES=0;_WIN32_WINNT=0x601;;WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)
+ _CRT_DECLARE_NONSTDC_NAMES=0;_WIN32_WINNT=0x0A00;;WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)
false
$(SolutionDir);$(LibreSSL-Path)include;$(ZLib-Path);$(OpenSSH-Src-Path)includes;$(OpenSSH-Src-Path);$(OpenSSH-Src-Path)contrib\win32\win32compat;$(OpenSSH-Src-Path)libkrb;$(OpenSSH-Src-Path)libkrb\libKrb5;%(AdditionalIncludeDirectories)
MultiThreadedDebug
@@ -301,7 +301,7 @@
MaxSpeed
true
true
- _CRT_DECLARE_NONSTDC_NAMES=0;_WIN32_WINNT=0x601;;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ _CRT_DECLARE_NONSTDC_NAMES=0;_WIN32_WINNT=0x0A00;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
true
$(SolutionDir);$(LibreSSL-Path)include;$(ZLib-Path);$(OpenSSH-Src-Path)includes;$(OpenSSH-Src-Path);$(OpenSSH-Src-Path)contrib\win32\win32compat;$(OpenSSH-Src-Path)libkrb;$(OpenSSH-Src-Path)libkrb\libKrb5;%(AdditionalIncludeDirectories)
MultiThreaded
@@ -333,7 +333,7 @@
MaxSpeed
true
true
- _CRT_DECLARE_NONSTDC_NAMES=0;_WIN32_WINNT=0x601;;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ _CRT_DECLARE_NONSTDC_NAMES=0;_WIN32_WINNT=0x0A00;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
true
$(SolutionDir);$(LibreSSL-Path)include;$(ZLib-Path);$(OpenSSH-Src-Path)includes;$(OpenSSH-Src-Path);$(OpenSSH-Src-Path)contrib\win32\win32compat;$(OpenSSH-Src-Path)libkrb;$(OpenSSH-Src-Path)libkrb\libKrb5;%(AdditionalIncludeDirectories)
MultiThreaded
@@ -366,7 +366,7 @@
MaxSpeed
true
true
- _CRT_DECLARE_NONSTDC_NAMES=0;_WIN32_WINNT=0x601;;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ _CRT_DECLARE_NONSTDC_NAMES=0;_WIN32_WINNT=0x0A00;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
true
$(SolutionDir);$(LibreSSL-Path)include;$(ZLib-Path);$(OpenSSH-Src-Path)includes;$(OpenSSH-Src-Path);$(OpenSSH-Src-Path)contrib\win32\win32compat;$(OpenSSH-Src-Path)libkrb;$(OpenSSH-Src-Path)libkrb\libKrb5;%(AdditionalIncludeDirectories)
MultiThreaded
@@ -399,7 +399,7 @@
MaxSpeed
true
true
- _CRT_DECLARE_NONSTDC_NAMES=0;_WIN32_WINNT=0x601;;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ _CRT_DECLARE_NONSTDC_NAMES=0;_WIN32_WINNT=0x0A00;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
true
$(SolutionDir);$(LibreSSL-Path)include;$(ZLib-Path);$(OpenSSH-Src-Path)includes;$(OpenSSH-Src-Path);$(OpenSSH-Src-Path)contrib\win32\win32compat;$(OpenSSH-Src-Path)libkrb;$(OpenSSH-Src-Path)libkrb\libKrb5;%(AdditionalIncludeDirectories)
MultiThreaded
diff --git a/contrib/win32/openssh/sshd_config b/contrib/win32/openssh/sshd_config
index 52083290fa9..61c83ab57aa 100644
--- a/contrib/win32/openssh/sshd_config
+++ b/contrib/win32/openssh/sshd_config
@@ -10,6 +10,8 @@
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
+#Bind on a AF_HYPERV socket (must be explicitly enabled)
+#ListenAddress 00000000-0000-0000-0000-000000000000
#HostKey __PROGRAMDATA__/ssh/ssh_host_rsa_key
#HostKey __PROGRAMDATA__/ssh/ssh_host_ecdsa_key
diff --git a/contrib/win32/openssh/win32iocompat.vcxproj b/contrib/win32/openssh/win32iocompat.vcxproj
index ec9e4f0604a..209e72c94e9 100644
--- a/contrib/win32/openssh/win32iocompat.vcxproj
+++ b/contrib/win32/openssh/win32iocompat.vcxproj
@@ -163,7 +163,7 @@
Disabled
- _CRT_DECLARE_NONSTDC_NAMES=0;USE_MSCNG;_WIN32_WINNT=0x601;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)
+ _CRT_DECLARE_NONSTDC_NAMES=0;USE_MSCNG;_WIN32_WINNT=0x0A00;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)
true
EnableFastChecks
MultiThreadedDebug
@@ -181,7 +181,7 @@
Disabled
- _CRT_DECLARE_NONSTDC_NAMES=0;USE_MSCNG;_WIN32_WINNT=0x601;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)
+ _CRT_DECLARE_NONSTDC_NAMES=0;USE_MSCNG;_WIN32_WINNT=0x0A00;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)
EnableFastChecks
MultiThreadedDebug
NotUsing
@@ -197,7 +197,7 @@
Disabled
- _CRT_DECLARE_NONSTDC_NAMES=0;USE_MSCNG;_WIN32_WINNT=0x601;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)
+ _CRT_DECLARE_NONSTDC_NAMES=0;USE_MSCNG;_WIN32_WINNT=0x0A00;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)
EnableFastChecks
MultiThreadedDebug
NotUsing
@@ -213,7 +213,7 @@
Disabled
- _CRT_DECLARE_NONSTDC_NAMES=0;USE_MSCNG;_WIN32_WINNT=0x601;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)
+ _CRT_DECLARE_NONSTDC_NAMES=0;USE_MSCNG;_WIN32_WINNT=0x0A00;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)
EnableFastChecks
MultiThreadedDebug
NotUsing
@@ -228,7 +228,7 @@
- _CRT_DECLARE_NONSTDC_NAMES=0;_LIB;USE_MSCNG;_WIN32_WINNT=0x601;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)
+ _CRT_DECLARE_NONSTDC_NAMES=0;_LIB;USE_MSCNG;_WIN32_WINNT=0x0A00;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)
MultiThreaded
NotUsing
Level3
@@ -246,7 +246,7 @@
- _CRT_DECLARE_NONSTDC_NAMES=0;_LIB;USE_MSCNG;_WIN32_WINNT=0x601;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)
+ _CRT_DECLARE_NONSTDC_NAMES=0;_LIB;USE_MSCNG;_WIN32_WINNT=0x0A00;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)
MultiThreaded
NotUsing
Level3
@@ -264,7 +264,7 @@
- _CRT_DECLARE_NONSTDC_NAMES=0;_LIB;USE_MSCNG;_WIN32_WINNT=0x601;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)
+ _CRT_DECLARE_NONSTDC_NAMES=0;_LIB;USE_MSCNG;_WIN32_WINNT=0x0A00;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)
MultiThreaded
NotUsing
Level3
@@ -282,7 +282,7 @@
- _CRT_DECLARE_NONSTDC_NAMES=0;_LIB;USE_MSCNG;_WIN32_WINNT=0x601;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)
+ _CRT_DECLARE_NONSTDC_NAMES=0;_LIB;USE_MSCNG;_WIN32_WINNT=0x0A00;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)
MultiThreaded
NotUsing
Level3
diff --git a/contrib/win32/win32compat/socketio.c b/contrib/win32/win32compat/socketio.c
index c4eceaea8f7..1c3a0161e3e 100644
--- a/contrib/win32/win32compat/socketio.c
+++ b/contrib/win32/win32compat/socketio.c
@@ -31,6 +31,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -118,7 +119,10 @@ socketio_acceptEx(struct w32_io* pio)
}
/* create accepting socket */
- context->accept_socket = socket(addr.ss_family, SOCK_STREAM, IPPROTO_TCP);
+ if (addr.ss_family == AF_HYPERV)
+ context->accept_socket = socket(addr.ss_family, SOCK_STREAM, HV_PROTOCOL_RAW);
+ else
+ context->accept_socket = socket(addr.ss_family, SOCK_STREAM, IPPROTO_TCP);
if (context->accept_socket == INVALID_SOCKET) {
errno = errno_from_WSALastError();
debug3("acceptEx - socket() ERROR:%d, io:%p", WSAGetLastError(), pio);
diff --git a/servconf.c b/servconf.c
index adae64b4cdf..2c31d73db93 100644
--- a/servconf.c
+++ b/servconf.c
@@ -14,6 +14,7 @@
#ifdef WINDOWS
#include
#include
+#include
#endif // WINDOWS
#include
@@ -840,6 +841,10 @@ add_one_listen_addr(ServerOptions *options, const char *addr,
char strport[NI_MAXSERV];
int gaierr;
u_int i;
+#ifdef WINDOWS
+ GUID guid;
+ HRESULT hr;
+#endif // WINDOWS
/* Find listen_addrs entry for this rdomain */
for (i = 0; i < options->num_listen_addrs; i++) {
@@ -863,19 +868,49 @@ add_one_listen_addr(ServerOptions *options, const char *addr,
}
/* options->listen_addrs[i] points to the addresses for this rdomain */
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = options->address_family;
- hints.ai_socktype = SOCK_STREAM;
- hints.ai_flags = (addr == NULL) ? AI_PASSIVE : 0;
- snprintf(strport, sizeof strport, "%d", port);
- if ((gaierr = getaddrinfo(addr, strport, &hints, &aitop)) != 0)
- fatal("bad addr or host: %s (%s)",
- addr ? addr : "",
- ssh_gai_strerror(gaierr));
- for (ai = aitop; ai->ai_next; ai = ai->ai_next)
- ;
- ai->ai_next = options->listen_addrs[i].addrs;
- options->listen_addrs[i].addrs = aitop;
+#ifdef WINDOWS
+ /* Check whether the address is a GUID or not (for Hyper-V addresses) */
+ hr = UuidFromStringA(addr, &guid);
+ if (hr == S_OK)
+ {
+ PSOCKADDR_HV psa;
+
+ ai = xmalloc(sizeof(ADDRINFOA)); // aitop;
+ memset(ai, 0, sizeof(ADDRINFOA));
+ ai->ai_family = AF_HYPERV;
+ ai->ai_protocol = HV_PROTOCOL_RAW;
+ ai->ai_socktype = SOCK_STREAM;
+ ai->ai_addrlen = sizeof(SOCKADDR_HV);
+
+ ai->ai_addr = xmalloc(ai->ai_addrlen);
+ memset(ai->ai_addr, 0, ai->ai_addrlen);
+ psa = (PSOCKADDR_HV)ai->ai_addr;
+
+ psa->Family = AF_HYPERV;
+ memcpy(&psa->VmId, &guid, sizeof(GUID));
+ hr = UuidFromStringA("00000000-facb-11e6-bd58-64006a7986d3", &psa->ServiceId);
+ psa->ServiceId.Data1 = port;
+
+ ai->ai_next = options->listen_addrs[i].addrs;
+ options->listen_addrs[i].addrs = ai;
+ } else {
+#endif // WINDOWS
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = options->address_family;
+ hints.ai_socktype = SOCK_STREAM;
+ hints.ai_flags = (addr == NULL) ? AI_PASSIVE : 0;
+ snprintf(strport, sizeof strport, "%d", port);
+ if ((gaierr = getaddrinfo(addr, strport, &hints, &aitop)) != 0)
+ fatal("bad addr or host: %s (%s)",
+ addr ? addr : "",
+ ssh_gai_strerror(gaierr));
+ for (ai = aitop; ai->ai_next; ai = ai->ai_next)
+ ;
+ ai->ai_next = options->listen_addrs[i].addrs;
+ options->listen_addrs[i].addrs = aitop;
+#ifdef WINDOWS
+ }
+#endif // WINDOWS
}
/* Returns nonzero if the routing domain name is valid */
@@ -1284,6 +1319,9 @@ process_server_config_line_depth(ServerOptions *options, char *line,
int ret = -1;
char **strs = NULL; /* string array arguments; freed implicitly */
u_int nstrs = 0;
+#ifdef WINDOWS
+ GUID guid;
+#endif // WINDOWS
/* Strip trailing whitespace. Allow \f (form feed) at EOL only */
if ((len = strlen(line)) == 0)
@@ -1396,6 +1434,12 @@ process_server_config_line_depth(ServerOptions *options, char *line,
&& strchr(p+1, ':') != NULL) {
port = 0;
p = arg;
+#ifdef WINDOWS
+ /* Check whether the address is a GUID or not (for Hyper-V addresses) */
+ } else if (UuidFromStringA(arg, &guid) == S_OK) {
+ port = 0;
+ p = arg;
+#endif // WINDOWS
} else {
arg2 = NULL;
p = hpdelim(&arg);
diff --git a/sshd.c b/sshd.c
index 3124748a344..6189b9eec48 100644
--- a/sshd.c
+++ b/sshd.c
@@ -70,6 +70,8 @@
#endif
#ifdef WINDOWS
+#include
+#include
#include "sshTelemetry.h"
#endif
@@ -824,18 +826,41 @@ listen_on_addrs(struct listenaddr *la)
char ntop[NI_MAXHOST], strport[NI_MAXSERV];
for (ai = la->addrs; ai; ai = ai->ai_next) {
+#ifdef WINDOWS
+ if (ai->ai_family != AF_INET && ai->ai_family != AF_INET6 && ai->ai_family != AF_HYPERV)
+#else
if (ai->ai_family != AF_INET && ai->ai_family != AF_INET6)
+#endif /* WINDOWS */
continue;
if (num_listen_socks >= MAX_LISTEN_SOCKS)
fatal("Too many listen sockets. "
"Enlarge MAX_LISTEN_SOCKS");
- if ((ret = getnameinfo(ai->ai_addr, ai->ai_addrlen,
- ntop, sizeof(ntop), strport, sizeof(strport),
- NI_NUMERICHOST|NI_NUMERICSERV)) != 0) {
- error("getnameinfo failed: %.100s",
- ssh_gai_strerror(ret));
- continue;
+#ifdef WINDOWS
+ if (ai->ai_family != AF_HYPERV)
+ {
+#endif /* WINDOWS */
+ if ((ret = getnameinfo(ai->ai_addr, ai->ai_addrlen,
+ ntop, sizeof(ntop), strport, sizeof(strport),
+ NI_NUMERICHOST|NI_NUMERICSERV)) != 0) {
+ error("getnameinfo failed: %.100s",
+ ssh_gai_strerror(ret));
+ continue;
+ }
+#ifdef WINDOWS
}
+ else
+ {
+ /* ai_family == AF_HYPERV */
+ PSOCKADDR_HV psa;
+ RPC_CSTR guid;
+
+ psa = (PSOCKADDR_HV)ai->ai_addr;
+ UuidToString(&psa->VmId, &guid);
+ sprintf_s(ntop, NI_MAXHOST, "%s", guid);
+ sprintf_s(strport, NI_MAXSERV, "%u", psa->ServiceId.Data1);
+ RpcStringFree(&guid);
+ }
+#endif /* WINDOWS */
/* Create socket for listening. */
listen_sock = socket(ai->ai_family, ai->ai_socktype,
ai->ai_protocol);