This is a extremely rough patch that 'fixes' Samba3 nmbd to allow a join from a WinXP client to a Samba4 server. Note that it hard-codes the domain GUID. Please only use for testing Samba4 - do not apply this to Samba3 svn. Index: nmbd/nmbd_processlogon.c =================================================================== --- nmbd/nmbd_processlogon.c (revision 4247) +++ nmbd/nmbd_processlogon.c (working copy) @@ -58,10 +58,37 @@ tdb_close(tdb); } + +int push_components(unsigned char *q, const char *s) +{ + char *p; + int l, len = 0; + + if (*s == 0) { + q[0] = 0; + return 1; + } + + while ((p = strchr(s, '.'))) { + l = (p-s); + q[0] = l; + memcpy(q+1, s, l); + s += l + 1; + q += l+1; + len += l+1; + } + + l = strlen(s); + q[0] = l; + memcpy(q+1, s, l+1); + len += strlen(s)+2; + + return len; +} + /**************************************************************************** Process a domain logon packet **************************************************************************/ - void process_logon_packet(struct packet_struct *p, char *buf,int len, const char *mailslot) { @@ -393,6 +420,8 @@ get_mydnsdomname(domain); get_myname(hostname); + + pstrcpy(domain, "bludom.tridgell.net"); if (SVAL(uniuser, 0) == 0) { SIVAL(q, 0, SAMLOGON_AD_UNK_R); /* user unknown */ @@ -403,6 +432,9 @@ SIVAL(q, 0, ADS_PDC|ADS_GC|ADS_LDAP|ADS_DS| ADS_KDC|ADS_TIMESERV|ADS_CLOSEST|ADS_WRITABLE); + SIVAL(q, 0, 0x3fd); + SIVAL(q, 0, ADS_PDC|ADS_DS| + ADS_TIMESERV|ADS_CLOSEST|ADS_WRITABLE); q += 4; /* Push Domain GUID */ @@ -411,80 +443,34 @@ return; } + smb_string_to_uuid("b0eac516-4a33-8675-4127-6bf058911234", &domain_guid); + + dump_data(0, domain_guid.node, 6); + smb_uuid_pack(domain_guid, &flat_guid); memcpy(q, &flat_guid.info, UUID_FLAT_SIZE); - q += UUID_FLAT_SIZE; - /* Forest */ - str_offset = q - q_orig; - dc = domain; - q1 = q; - while ((component = strtok(dc, "."))) { - dc = NULL; - size = push_ascii(&q[1], component, -1, 0); - SCVAL(q, 0, size); - q += (size + 1); - } + dump_data(0, q, 16); - /* Unk0 */ - SCVAL(q, 0, 0); - q++; + q += UUID_FLAT_SIZE; - /* Domain */ - SCVAL(q, 0, 0xc0 | ((str_offset >> 8) & 0x3F)); - SCVAL(q, 1, str_offset & 0xFF); - q += 2; + const char *dnsname = "192.168.115.1"; - /* Hostname */ - size = push_ascii(&q[1], hostname, -1, 0); - SCVAL(q, 0, size); - q += (size + 1); - SCVAL(q, 0, 0xc0 | ((str_offset >> 8) & 0x3F)); - SCVAL(q, 1, str_offset & 0xFF); - q += 2; - - /* NETBIOS of domain */ - size = push_ascii(&q[1], lp_workgroup(), -1, STR_UPPER); - SCVAL(q, 0, size); - q += (size + 1); - - /* Unk1 */ - SCVAL(q, 0, 0); - q++; - - /* NETBIOS of hostname */ - size = push_ascii(&q[1], my_name, -1, 0); - SCVAL(q, 0, size); - q += (size + 1); - - /* Unk2 */ - SCVAL(q, 0, 0); - q++; - - /* User name */ - if (SVAL(uniuser, 0) != 0) { - size = push_ascii(&q[1], ascuser, -1, 0); - SCVAL(q, 0, size); - q += (size + 1); + q += push_components(q, domain); + q += push_components(q, domain); + q += push_components(q, dnsname); + q += push_components(q, lp_workgroup()); + q += push_components(q, my_name); + q += push_components(q, ""); + if (SVAL(uniuser, 0)) { + q += push_components(q, ascuser); } + q += push_components(q, "Default-First-Site-Name"); + q += push_components(q, "Default-First-Site-Name"); - q_orig = q; - /* Site name */ - size = push_ascii(&q[1], "Default-First-Site-Name", -1, 0); - SCVAL(q, 0, size); - q += (size + 1); - - /* Site name (2) */ - str_offset = q - q_orig; - SCVAL(q, 0, 0xc0 | ((str_offset >> 8) & 0x3F)); - SCVAL(q, 1, str_offset & 0xFF); - q += 2; - - SCVAL(q, 0, PTR_DIFF(q,q1)); - SCVAL(q, 1, 0x10); /* unknown */ - - SIVAL(q, 0, 0x00000002); - q += 4; /* unknown */ + SCVAL(q, 0, 0x10); /* unknown */ + SIVAL(q, 1, 0x00000002); + q += 5; SIVAL(q, 0, (iface_ip(p->ip))->s_addr); q += 4; SIVAL(q, 0, 0x00000000); @@ -495,7 +481,7 @@ #endif /* tell the client what version we are */ - SIVAL(q, 0, ((ntversion < 11) || (SEC_ADS != lp_security())) ? 1 : 13); + SIVAL(q, 0, 13); /* our ntversion */ SSVAL(q, 4, 0xffff); /* our lmnttoken */ SSVAL(q, 6, 0xffff); /* our lm20token */