Author: fireball Date: Tue Jan 5 17:37:32 2010 New Revision: 44948
URL: http://svn.reactos.org/svn/reactos?rev=44948&view=rev Log: Daniel Zimmermann netzimme@aim.com - Implement RtlDnsHostNameToComputerName. See issue #5092 for more details.
Modified: trunk/reactos/dll/ntdll/def/ntdll.pspec trunk/reactos/lib/rtl/unicode.c
Modified: trunk/reactos/dll/ntdll/def/ntdll.pspec URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/ntdll/def/ntdll.pspec?r... ============================================================================== --- trunk/reactos/dll/ntdll/def/ntdll.pspec [iso-8859-1] (original) +++ trunk/reactos/dll/ntdll/def/ntdll.pspec [iso-8859-1] Tue Jan 5 17:37:32 2010 @@ -562,7 +562,7 @@ @ stdcall RtlDestroyQueryDebugBuffer(ptr) @ stdcall RtlDetermineDosPathNameType_U(wstr) @ stdcall RtlDllShutdownInProgress() -//@ stdcall RtlDnsHostNameToComputerName +@ stdcall RtlDnsHostNameToComputerName(ptr ptr long) @ stdcall RtlDoesFileExists_U(wstr) //@ stdcall RtlDosApplyFileIsolationRedirection_Ustr @ stdcall RtlDosPathNameToNtPathName_U(wstr ptr ptr ptr)
Modified: trunk/reactos/lib/rtl/unicode.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/unicode.c?rev=44948... ============================================================================== --- trunk/reactos/lib/rtl/unicode.c [iso-8859-1] (original) +++ trunk/reactos/lib/rtl/unicode.c [iso-8859-1] Tue Jan 5 17:37:32 2010 @@ -2436,3 +2436,74 @@
return STATUS_NOT_FOUND; } + +/* + * @implemented + * + * NOTES + * Get the maximum of MAX_COMPUTERNAME_LENGTH characters from the dns.host name until the dot is found. + * Convert is to an uppercase oem string and check for unmapped characters. + * Then convert the oem string back to an unicode string. + */ +NTSTATUS +NTAPI +RtlDnsHostNameToComputerName(PUNICODE_STRING ComputerName,PUNICODE_STRING DnsHostName,BOOLEAN AllocateComputerNameString) +{ + NTSTATUS Status; + ULONG Length; + ULONG ComputerNameLength; + ULONG ComputerNameOemNLength; + OEM_STRING ComputerNameOem; + CHAR ComputerNameOemN[MAX_COMPUTERNAME_LENGTH + 1]; + + Status = STATUS_INVALID_COMPUTER_NAME; + ComputerNameLength = DnsHostName->Length; + + /* find the first dot in the dns host name */ + for (Length = 0;Length < DnsHostName->Length/sizeof(WCHAR);Length++) + { + if (DnsHostName->Buffer[Length] == L'.') + { + /* dot found, so set the length for the oem translation */ + ComputerNameLength = Length*sizeof(WCHAR); + break; + } + } + + /* the computername must have one character */ + if (ComputerNameLength > 0) + { + ComputerNameOemNLength = 0; + /* convert to oem string and use uppercase letters */ + Status = RtlUpcaseUnicodeToOemN(ComputerNameOemN, + MAX_COMPUTERNAME_LENGTH, + &ComputerNameOemNLength, + DnsHostName->Buffer, + ComputerNameLength); + /* status STATUS_BUFFER_OVERFLOW is not a problem since the computername shoud only + have MAX_COMPUTERNAME_LENGTH characters */ + if ((Status == STATUS_SUCCESS) || + (Status == STATUS_BUFFER_OVERFLOW)) + { + /* set the termination for the oem string */ + ComputerNameOemN[MAX_COMPUTERNAME_LENGTH] = 0; + /* set status for the case the next function failed */ + Status = STATUS_INVALID_COMPUTER_NAME; + /* fillup the oem string structure with the converted computername + and check it for unmapped characters */ + ComputerNameOem.Buffer = ComputerNameOemN; + ComputerNameOem.Length = (USHORT)ComputerNameOemNLength; + ComputerNameOem.MaximumLength = (USHORT)(MAX_COMPUTERNAME_LENGTH + 1); + if (RtlpDidUnicodeToOemWork(DnsHostName, &ComputerNameOem) == TRUE) + { + /* no unmapped character so convert it back to an unicode string */ + Status = RtlOemStringToUnicodeString(ComputerName, + &ComputerNameOem, + AllocateComputerNameString); + } + } + } + + return Status; +} +