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(a)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?…
==============================================================================
--- 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=4494…
==============================================================================
--- 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;
+}
+