diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec index a9ef04aa176..5b3e10f85b9 100644 --- a/dlls/kernelbase/kernelbase.spec +++ b/dlls/kernelbase/kernelbase.spec @@ -267,7 +267,7 @@ @ stdcall DisassociateCurrentThreadFromCallback(ptr) ntdll.TpDisassociateCallback # @ stub DiscardVirtualMemory @ stdcall DisconnectNamedPipe(long) -# @ stub DnsHostnameToComputerNameExW +@ stdcall DnsHostnameToComputerNameExW(wstr ptr ptr) # @ stub DsBindWithSpnExW # @ stub DsCrackNamesW # @ stub DsFreeDomainControllerInfoW diff --git a/dlls/kernelbase/registry.c b/dlls/kernelbase/registry.c index e482d11cb29..b3297a3ad54 100644 --- a/dlls/kernelbase/registry.c +++ b/dlls/kernelbase/registry.c @@ -3046,6 +3046,38 @@ LSTATUS WINAPI RegLoadAppKeyW(const WCHAR *file, HKEY *result, REGSAM sam, DWORD } +/*********************************************************************** + * DnsHostnameToComputerNameExW (kernelbase.@) + * + * FIXME: how is this different from the non-Ex function? + */ +BOOL WINAPI DECLSPEC_HOTPATCH DnsHostnameToComputerNameExW( const WCHAR *hostname, WCHAR *computername, + DWORD *size ) +{ + static const WCHAR allowed[] = L"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&')(-_{}"; + WCHAR buffer[MAX_COMPUTERNAME_LENGTH + 1]; + DWORD i, len; + + lstrcpynW( buffer, hostname, MAX_COMPUTERNAME_LENGTH + 1 ); + len = lstrlenW( buffer ); + if (*size < len + 1) + { + *size = len; + SetLastError( ERROR_MORE_DATA ); + return FALSE; + } + *size = len; + if (!computername) return FALSE; + for (i = 0; i < len; i++) + { + if (buffer[i] >= 'a' && buffer[i] <= 'z') computername[i] = buffer[i] + 'A' - 'a'; + else computername[i] = wcschr( allowed, buffer[i] ) ? buffer[i] : '_'; + } + computername[len] = 0; + return TRUE; +} + + struct USKEY { HKEY HKCUstart; /* Start key in CU hive */ diff --git a/include/winbase.h b/include/winbase.h index 320e2430342..c550ed816d7 100644 --- a/include/winbase.h +++ b/include/winbase.h @@ -1958,6 +1958,7 @@ WINBASEAPI BOOL WINAPI DisconnectNamedPipe(HANDLE); WINBASEAPI BOOL WINAPI DnsHostnameToComputerNameA(LPCSTR,LPSTR,LPDWORD); WINBASEAPI BOOL WINAPI DnsHostnameToComputerNameW(LPCWSTR,LPWSTR,LPDWORD); #define DnsHostnameToComputerName WINELIB_NAME_AW(DnsHostnameToComputerName) +WINBASEAPI BOOL WINAPI DnsHostnameToComputerNameExW(LPCWSTR,LPWSTR,LPDWORD); WINBASEAPI BOOL WINAPI DosDateTimeToFileTime(WORD,WORD,LPFILETIME); WINBASEAPI BOOL WINAPI DuplicateHandle(HANDLE,HANDLE,HANDLE,HANDLE*,DWORD,BOOL,DWORD); WINADVAPI BOOL WINAPI DuplicateToken(HANDLE,SECURITY_IMPERSONATION_LEVEL,PHANDLE);