--- source3/include/smb.h.orig 2016-09-06 10:49:56.660999798 +0800 +++ source3/include/smb.h 2016-09-06 10:50:20.317999897 +0800 @@ -533,7 +533,7 @@ /* Remote architectures we know about. */ enum remote_arch_types {RA_UNKNOWN, RA_WFWG, RA_OS2, RA_WIN95, RA_WINNT, - RA_WIN2K, RA_WINXP, RA_WIN2K3, RA_VISTA, + RA_WIN2K, RA_WINXP, RA_WIN2K3, RA_VISTA, RA_WIN7, RA_WIN8, RA_WIN81, RA_WIN10, RA_SAMBA, RA_CIFSFS, RA_WINXP64, RA_OSX}; /* --- source3/lib/util.c.orig 2016-09-06 10:52:25.826000123 +0800 +++ source3/lib/util.c 2016-09-06 10:51:58.919998596 +0800 @@ -1273,6 +1273,18 @@ case RA_VISTA: remote_arch_str = "Vista"; break; + case RA_WIN7: + remote_arch_str = "Win7"; + break; + case RA_WIN8: + remote_arch_str = "Win8"; + break; + case RA_WIN81: + remote_arch_str = "Win8.1"; + break; + case RA_WIN10: + remote_arch_str = "Win10"; + break; case RA_SAMBA: remote_arch_str = "Samba"; break; --- source3/smbd/smb2_negprot.c.orig 2016-03-30 18:19:32.000000000 +0800 +++ source3/smbd/smb2_negprot.c 2016-09-06 12:40:28.743998120 +0800 @@ -194,6 +194,8 @@ dialect_count, &dialect); + enum protocol_types protocol_max = protocol; + for (c=0; protocol == PROTOCOL_NONE && c < dialect_count; c++) { if (lp_server_max_protocol() < PROTOCOL_SMB2_10) { break; @@ -260,13 +260,22 @@ } switch (get_remote_arch()) { - case RA_VISTA: case RA_SAMBA: case RA_CIFSFS: case RA_OSX: break; default: - set_remote_arch(RA_VISTA); + if (protocol_max < PROTOCOL_SMB2_10) { + set_remote_arch(RA_VISTA); + } else if (protocol_max < PROTOCOL_SMB2_22) { + set_remote_arch(RA_WIN7); + } else if (protocol_max < PROTOCOL_SMB3_02) { + set_remote_arch(RA_WIN8); + } else if (protocol_max < PROTOCOL_SMB3_10) { + set_remote_arch(RA_WIN81); + } else { + set_remote_arch(RA_WIN10); + } break; }