Index: base/services/dhcpcsvc/dhcp/dhclient.c =================================================================== --- base/services/dhcpcsvc/dhcp/dhclient.c (revision 71627) +++ base/services/dhcpcsvc/dhcp/dhclient.c (working copy) @@ -403,6 +403,36 @@ bind_lease(ip); } +void set_domain( PDHCP_ADAPTER Adapter, struct client_lease *new_lease ) { + CHAR Buffer1[MAX_PATH] = "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\"; + CHAR Buffer2[MAX_PATH] = "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters"; + HKEY RegKey1, RegKey2; + + strcat(Buffer1, Adapter->DhclientInfo.name); + if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, Buffer1, 0, KEY_WRITE, &RegKey1 ) != ERROR_SUCCESS) + return; + if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, Buffer2, 0, KEY_WRITE, &RegKey2 ) != ERROR_SUCCESS) { + RegCloseKey( RegKey1 ); + return; + } + + + if( new_lease->options[DHO_DOMAIN_NAME].len ) { + DH_DbgPrint(MID_TRACE,("Setting DhcpDomain: %s\n", new_lease->options[DHO_DOMAIN_NAME].data)); + + RegSetValueExA( RegKey1, "DhcpDomain", 0, REG_SZ, + (LPBYTE)new_lease->options[DHO_DOMAIN_NAME].data, new_lease->options[DHO_DOMAIN_NAME].len ); + RegSetValueExA( RegKey2, "DhcpDomain", 0, REG_SZ, + (LPBYTE)new_lease->options[DHO_DOMAIN_NAME].data, new_lease->options[DHO_DOMAIN_NAME].len ); + } else { + RegDeleteValueW( RegKey1, L"DhcpDomain" ); + RegDeleteValueW( RegKey2, L"DhcpDomain" ); + } + + RegCloseKey( RegKey1 ); + RegCloseKey( RegKey2 ); + +} void set_name_servers( PDHCP_ADAPTER Adapter, struct client_lease *new_lease ) { CHAR Buffer[200] = "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\"; HKEY RegKey; @@ -569,6 +599,7 @@ return; } set_name_servers( Adapter, new_lease ); + set_domain( Adapter, new_lease ); } /* Index: dll/win32/dnsapi/dnsapi/query.c =================================================================== --- dll/win32/dnsapi/dnsapi/query.c (revision 71627) +++ dll/win32/dnsapi/dnsapi/query.c (working copy) @@ -53,7 +53,7 @@ PVOID *Reserved) { adns_state astate; - int quflags = 0; + int quflags = adns_qf_search; int adns_error; adns_answer *answer; LPSTR CurrentName; Index: dll/win32/kernel32/client/compname.c =================================================================== --- dll/win32/kernel32/client/compname.c (revision 71627) +++ dll/win32/kernel32/client/compname.c (working copy) @@ -145,11 +145,18 @@ nSize); case ComputerNameDnsDomain: - return GetComputerNameFromRegistry(L"\\Registry\\Machine\\System\\CurrentControlSet" + if (!GetComputerNameFromRegistry(L"\\Registry\\Machine\\System\\CurrentControlSet" L"\\Services\\Tcpip\\Parameters", + L"DhcpDomain", + lpBuffer, + nSize)) + return GetComputerNameFromRegistry(L"\\Registry\\Machine\\System\\CurrentControlSet" + L"\\Services\\Tcpip\\Parameters", L"Domain", lpBuffer, nSize); + else + return TRUE; case ComputerNameDnsFullyQualified: ResultString.Length = 0; @@ -185,7 +192,7 @@ RtlFreeUnicodeString(&DomainPart); RtlInitUnicodeString(&DomainPart, NULL); - QueryTable[0].Name = L"Domain"; + QueryTable[0].Name = L"DhcpDomain"; QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT; QueryTable[0].EntryContext = &DomainPart; @@ -197,7 +204,7 @@ NULL, NULL); - if (NT_SUCCESS(Status)) + if (NT_SUCCESS(Status) && DomainPart.Buffer != NULL && wcslen(DomainPart.Buffer) > 0) { Status = RtlAppendUnicodeStringToString(&ResultString, &DomainPart); if ((!NT_SUCCESS(Status)) || (!ret)) @@ -211,6 +218,36 @@ *nSize = ResultString.Length / sizeof(WCHAR) - 1; return TRUE; } + else + { + RtlInitUnicodeString(&DomainPart, NULL); + QueryTable[0].Name = L"Domain"; + QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT; + QueryTable[0].EntryContext = &DomainPart; + + Status = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE, + L"\\Registry\\Machine\\System" + L"\\CurrentControlSet\\Services\\Tcpip" + L"\\Parameters", + QueryTable, + NULL, + NULL); + + if (NT_SUCCESS(Status)) + { + Status = RtlAppendUnicodeStringToString(&ResultString, &DomainPart); + if ((!NT_SUCCESS(Status)) || (!ret)) + { + *nSize = HostSize + DomainPart.Length; + SetLastError(ERROR_MORE_DATA); + RtlFreeUnicodeString(&DomainPart); + return FALSE; + } + RtlFreeUnicodeString(&DomainPart); + *nSize = ResultString.Length / sizeof(WCHAR) - 1; + return TRUE; + } + } } return FALSE; @@ -222,11 +259,18 @@ nSize); case ComputerNamePhysicalDnsDomain: - return GetComputerNameFromRegistry(L"\\Registry\\Machine\\System\\CurrentControlSet" + if (!GetComputerNameFromRegistry(L"\\Registry\\Machine\\System\\CurrentControlSet" L"\\Services\\Tcpip\\Parameters", + L"DhcpDomain", + lpBuffer, + nSize)) + return GetComputerNameFromRegistry(L"\\Registry\\Machine\\System\\CurrentControlSet" + L"\\Services\\Tcpip\\Parameters", L"Domain", lpBuffer, nSize); + else + return TRUE; /* XXX Redo these */ case ComputerNamePhysicalDnsFullyQualified: Index: sdk/lib/3rdparty/adns/src/setup.c =================================================================== --- sdk/lib/3rdparty/adns/src/setup.c (revision 71627) +++ sdk/lib/3rdparty/adns/src/setup.c (working copy) @@ -572,9 +572,8 @@ #define SECURE_PATH_LEN (MAX_PATH - 64) char PathBuf[MAX_PATH]; struct in_addr addr; - #define ADNS_PFIXED_INFO_BLEN (2048) - PFIXED_INFO network_info = (PFIXED_INFO)_alloca(ADNS_PFIXED_INFO_BLEN); - ULONG network_info_blen = ADNS_PFIXED_INFO_BLEN; + PFIXED_INFO network_info; + ULONG network_info_blen = 0; DWORD network_info_result; PIP_ADDR_STRING pip; const char *network_err_str = ""; @@ -601,6 +600,8 @@ GetWindowsDirectory(PathBuf, SECURE_PATH_LEN); strcat(PathBuf,"\\System32\\Drivers\\etc\\resolv-adns.conf"); readconfig(ads,PathBuf,0); + network_info_result = GetNetworkParams(NULL, &network_info_blen); + network_info = (PFIXED_INFO)_alloca((size_t)network_info_blen); network_info_result = GetNetworkParams(network_info, &network_info_blen); if (network_info_result != ERROR_SUCCESS){ switch(network_info_result) { @@ -617,6 +618,8 @@ if ((addr.s_addr != INADDR_ANY) && (addr.s_addr != INADDR_NONE)) addserver(ads, addr); } + if (network_info->DomainName) + ccf_search(ads,"LOCALDOMAIN",-1,network_info->DomainName); } #else readconfig(ads,"/etc/resolv.conf",1);