Author: tkreuzer Date: Sun Sep 18 22:15:37 2011 New Revision: 53739
URL: http://svn.reactos.org/svn/reactos?rev=53739&view=rev Log: [RTL] Improve formatting, no code change
Modified: trunk/reactos/lib/rtl/unicode.c
Modified: trunk/reactos/lib/rtl/unicode.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/unicode.c?rev=53739... ============================================================================== --- trunk/reactos/lib/rtl/unicode.c [iso-8859-1] (original) +++ trunk/reactos/lib/rtl/unicode.c [iso-8859-1] Sun Sep 18 22:15:37 2011 @@ -22,9 +22,9 @@ extern BOOLEAN NlsMbCodePageTag; extern BOOLEAN NlsMbOemCodePageTag; extern PUSHORT NlsLeadByteInfo; - extern USHORT NlsOemDefaultChar; extern USHORT NlsUnicodeDefaultChar; +
/* FUNCTIONS *****************************************************************/
@@ -38,7 +38,6 @@ ULONG Size; NTSTATUS Status; WCHAR UnicodeChar = L' '; - PAGED_CODE_RTL();
if (NlsLeadByteInfo) @@ -76,9 +75,9 @@ NTSTATUS NTAPI RtlAnsiStringToUnicodeString( - IN OUT PUNICODE_STRING UniDest, - IN PANSI_STRING AnsiSource, - IN BOOLEAN AllocateDestinationString) + IN OUT PUNICODE_STRING UniDest, + IN PANSI_STRING AnsiSource, + IN BOOLEAN AllocateDestinationString) { NTSTATUS Status; ULONG Length; @@ -124,6 +123,7 @@ RtlpFreeStringMemory(UniDest->Buffer, TAG_USTR); UniDest->Buffer = NULL; } + return Status; }
@@ -142,7 +142,6 @@ RtlxAnsiStringToUnicodeSize(IN PCANSI_STRING AnsiString) { ULONG Size; - PAGED_CODE_RTL();
/* Convert from Mb String to Unicode Size */ @@ -196,15 +195,15 @@ NTSTATUS NTAPI RtlAppendUnicodeStringToString( - IN OUT PUNICODE_STRING Destination, - IN PCUNICODE_STRING Source) + IN OUT PUNICODE_STRING Destination, + IN PCUNICODE_STRING Source) { USHORT SourceLength = Source->Length; PWCHAR Buffer = &Destination->Buffer[Destination->Length / sizeof(WCHAR)];
if (SourceLength) { - if ((SourceLength+ Destination->Length) > Destination->MaximumLength) + if ((SourceLength + Destination->Length) > Destination->MaximumLength) { return STATUS_BUFFER_TOO_SMALL; } @@ -255,58 +254,81 @@ ULONG RunningTotal = 0; char bMinus = 0;
- while (*str != '\0' && *str <= ' ') { - str++; - } /* while */ - - if (*str == '+') { - str++; - } else if (*str == '-') { - bMinus = 1; - str++; - } /* if */ - - if (base == 0) { - base = 10; - if (str[0] == '0') { - if (str[1] == 'b') { - str += 2; - base = 2; - } else if (str[1] == 'o') { - str += 2; - base = 8; - } else if (str[1] == 'x') { - str += 2; - base = 16; - } /* if */ - } /* if */ - } else if (base != 2 && base != 8 && base != 10 && base != 16) { - return STATUS_INVALID_PARAMETER; - } /* if */ - - if (value == NULL) { - return STATUS_ACCESS_VIOLATION; - } /* if */ - - while (*str != '\0') { - chCurrent = *str; - if (chCurrent >= '0' && chCurrent <= '9') { - digit = chCurrent - '0'; - } else if (chCurrent >= 'A' && chCurrent <= 'Z') { - digit = chCurrent - 'A' + 10; - } else if (chCurrent >= 'a' && chCurrent <= 'z') { - digit = chCurrent - 'a' + 10; - } else { - digit = -1; - } /* if */ - if (digit < 0 || digit >= (int)base) { - *value = bMinus ? -RunningTotal : RunningTotal; - return STATUS_SUCCESS; - } /* if */ - - RunningTotal = RunningTotal * base + digit; - str++; - } /* while */ + /* skip leading whitespaces */ + while (*str != '\0' && *str <= ' ') str++; + + /* Check for +/- */ + if (*str == '+') + { + str++; + } + else if (*str == '-') + { + bMinus = 1; + str++; + } + + /* base = 0 means autobase */ + if (base == 0) + { + base = 10; + + if (str[0] == '0') + { + if (str[1] == 'b') + { + str += 2; + base = 2; + } + else if (str[1] == 'o') + { + str += 2; + base = 8; + } + else if (str[1] == 'x') + { + str += 2; + base = 16; + } + } + } + else if (base != 2 && base != 8 && base != 10 && base != 16) + { + return STATUS_INVALID_PARAMETER; + } + + if (value == NULL) return STATUS_ACCESS_VIOLATION; + + while (*str != '\0') + { + chCurrent = *str; + + if (chCurrent >= '0' && chCurrent <= '9') + { + digit = chCurrent - '0'; + } + else if (chCurrent >= 'A' && chCurrent <= 'Z') + { + digit = chCurrent - 'A' + 10; + } + else if (chCurrent >= 'a' && chCurrent <= 'z') + { + digit = chCurrent - 'a' + 10; + } + else + { + digit = -1; + } + + if (digit < 0 || digit >= (int)base) + { + *value = bMinus ? -RunningTotal : RunningTotal; + return STATUS_SUCCESS; + } + + RunningTotal = RunningTotal * base + digit; + str++; + }
*value = bMinus ? -RunningTotal : RunningTotal; return STATUS_SUCCESS; @@ -318,28 +340,31 @@ LONG NTAPI RtlCompareString( - IN PSTRING s1, - IN PSTRING s2, - IN BOOLEAN CaseInsensitive) -{ - unsigned int len; - LONG ret = 0; - LPCSTR p1, p2; - - len = min(s1->Length, s2->Length); - p1 = s1->Buffer; - p2 = s2->Buffer; - - if (CaseInsensitive) - { - while (!ret && len--) ret = RtlUpperChar(*p1++) - RtlUpperChar(*p2++); - } - else - { - while (!ret && len--) ret = *p1++ - *p2++; - } - if (!ret) ret = s1->Length - s2->Length; - return ret; + IN PSTRING s1, + IN PSTRING s2, + IN BOOLEAN CaseInsensitive) +{ + unsigned int len; + LONG ret = 0; + LPCSTR p1, p2; + + len = min(s1->Length, s2->Length); + p1 = s1->Buffer; + p2 = s2->Buffer; + + if (CaseInsensitive) + { + while (!ret && len--) + ret = RtlUpperChar(*p1++) - RtlUpperChar(*p2++); + } + else + { + while (!ret && len--) ret = *p1++ - *p2++; + } + + if (!ret) ret = s1->Length - s2->Length; + + return ret; }
/* @@ -351,9 +376,9 @@ BOOLEAN NTAPI RtlEqualString( - IN PSTRING s1, - IN PSTRING s2, - IN BOOLEAN CaseInsensitive) + IN PSTRING s1, + IN PSTRING s2, + IN BOOLEAN CaseInsensitive) { if (s1->Length != s2->Length) return FALSE; return !RtlCompareString(s1, s2, CaseInsensitive); @@ -368,9 +393,9 @@ BOOLEAN NTAPI RtlEqualUnicodeString( - IN CONST UNICODE_STRING *s1, - IN CONST UNICODE_STRING *s2, - IN BOOLEAN CaseInsensitive) + IN CONST UNICODE_STRING *s1, + IN CONST UNICODE_STRING *s2, + IN BOOLEAN CaseInsensitive) { if (s1->Length != s2->Length) return FALSE; return !RtlCompareUnicodeString(s1, s2, CaseInsensitive ); @@ -399,9 +424,9 @@ NTAPI RtlFreeOemString(IN POEM_STRING OemString) { - PAGED_CODE_RTL(); - - if (OemString->Buffer) RtlpFreeStringMemory(OemString->Buffer, TAG_OSTR); + PAGED_CODE_RTL(); + + if (OemString->Buffer) RtlpFreeStringMemory(OemString->Buffer, TAG_OSTR); }
/* @@ -543,8 +568,8 @@ VOID NTAPI RtlInitString( - IN OUT PSTRING DestinationString, - IN PCSZ SourceString) + IN OUT PSTRING DestinationString, + IN PCSZ SourceString) { RtlInitAnsiString(DestinationString, SourceString); } @@ -623,36 +648,54 @@ CHAR digit; ULONG len;
- if (base == 0) { - base = 10; - } else if (base != 2 && base != 8 && base != 10 && base != 16) { - return STATUS_INVALID_PARAMETER; - } /* if */ + if (base == 0) + { + base = 10; + } + else if (base != 2 && base != 8 && base != 10 && base != 16) + { + return STATUS_INVALID_PARAMETER; + }
pos = &buffer[32]; *pos = '\0';
- do { - pos--; - digit = value % base; - value = value / base; - if (digit < 10) { - *pos = '0' + digit; - } else { - *pos = 'A' + digit - 10; - } /* if */ - } while (value != 0L); + do + { + pos--; + digit = value % base; + value = value / base; + + if (digit < 10) + { + *pos = '0' + digit; + } + else + { + *pos = 'A' + digit - 10; + } + } + while (value != 0L);
len = &buffer[32] - pos; - if (len > length) { - return STATUS_BUFFER_OVERFLOW; - } else if (str == NULL) { - return STATUS_ACCESS_VIOLATION; - } else if (len == length) { - memcpy(str, pos, len); - } else { - memcpy(str, pos, len + 1); - } /* if */ + + if (len > length) + { + return STATUS_BUFFER_OVERFLOW; + } + else if (str == NULL) + { + return STATUS_ACCESS_VIOLATION; + } + else if (len == length) + { + memcpy(str, pos, len); + } + else + { + memcpy(str, pos, len + 1); + } + return STATUS_SUCCESS; }
@@ -665,49 +708,50 @@ IN ULONG Value, IN ULONG Base OPTIONAL, IN ULONG Length OPTIONAL, - IN OUT LPWSTR String - ) -{ - ULONG Radix; - WCHAR temp[33]; - ULONG v = Value; - ULONG i; - PWCHAR tp; - PWCHAR sp; - - Radix = Base; - if (Radix == 0) - Radix = 10; - - if ((Radix != 2) && (Radix != 8) && - (Radix != 10) && (Radix != 16)) - { - return STATUS_INVALID_PARAMETER; - } - - tp = temp; - while (v || tp == temp) - { - i = v % Radix; - v = v / Radix; - if (i < 10) - *tp = i + L'0'; - else - *tp = i + L'a' - 10; - tp++; - } - - if ((ULONG)((ULONG_PTR)tp - (ULONG_PTR)temp) >= Length) - { - return STATUS_BUFFER_TOO_SMALL; - } - - sp = String; - while (tp > temp) - *sp++ = *--tp; - *sp = 0; - - return STATUS_SUCCESS; + IN OUT LPWSTR String) +{ + ULONG Radix; + WCHAR temp[33]; + ULONG v = Value; + ULONG i; + PWCHAR tp; + PWCHAR sp; + + Radix = Base; + + if (Radix == 0) Radix = 10; + + if ((Radix != 2) && (Radix != 8) && + (Radix != 10) && (Radix != 16)) + { + return STATUS_INVALID_PARAMETER; + } + + tp = temp; + + while (v || tp == temp) + { + i = v % Radix; + v = v / Radix; + + if (i < 10) *tp = i + L'0'; + else *tp = i + L'a' - 10; + + tp++; + } + + if ((ULONG)((ULONG_PTR)tp - (ULONG_PTR)temp) >= Length) + { + return STATUS_BUFFER_TOO_SMALL; + } + + sp = String; + + while (tp > temp) *sp++ = *--tp; + + *sp = 0; + + return STATUS_SUCCESS; }
/* @@ -716,9 +760,9 @@ NTSTATUS NTAPI RtlIntegerToUnicodeString( - IN ULONG Value, - IN ULONG Base OPTIONAL, - IN OUT PUNICODE_STRING String) + IN ULONG Value, + IN ULONG Base OPTIONAL, + IN OUT PUNICODE_STRING String) { ANSI_STRING AnsiString; CHAR Buffer[33]; @@ -776,42 +820,43 @@ BOOLEAN NTAPI RtlPrefixString( - PANSI_STRING String1, - PANSI_STRING String2, - BOOLEAN CaseInsensitive) -{ - PCHAR pc1; - PCHAR pc2; - ULONG Length; - - if (String2->Length < String1->Length) - return FALSE; - - Length = String1->Length; - pc1 = String1->Buffer; - pc2 = String2->Buffer; - - if (pc1 && pc2) - { - if (CaseInsensitive) - { - while (Length--) - { - if (RtlUpperChar (*pc1++) != RtlUpperChar (*pc2++)) - return FALSE; - } - } - else - { - while (Length--) - { - if (*pc1++ != *pc2++) - return FALSE; - } - } - return TRUE; - } - return FALSE; + PANSI_STRING String1, + PANSI_STRING String2, + BOOLEAN CaseInsensitive) +{ + PCHAR pc1; + PCHAR pc2; + ULONG Length; + + if (String2->Length < String1->Length) return FALSE; + + Length = String1->Length; + pc1 = String1->Buffer; + pc2 = String2->Buffer; + + if (pc1 && pc2) + { + if (CaseInsensitive) + { + while (Length--) + { + if (RtlUpperChar (*pc1++) != RtlUpperChar (*pc2++)) + return FALSE; + } + } + else + { + while (Length--) + { + if (*pc1++ != *pc2++) + return FALSE; + } + } + + return TRUE; + } + + return FALSE; }
/* @@ -823,50 +868,53 @@ BOOLEAN NTAPI RtlPrefixUnicodeString( - PCUNICODE_STRING String1, - PCUNICODE_STRING String2, - BOOLEAN CaseInsensitive) -{ - PWCHAR pc1; - PWCHAR pc2; - ULONG Length; - - if (String2->Length < String1->Length) - return FALSE; - - Length = String1->Length / 2; - pc1 = String1->Buffer; - pc2 = String2->Buffer; - - if (pc1 && pc2) - { - if (CaseInsensitive) - { - while (Length--) - { - if (RtlUpcaseUnicodeChar (*pc1++) - != RtlUpcaseUnicodeChar (*pc2++)) - return FALSE; - } - } - else - { - while (Length--) - { - if( *pc1++ != *pc2++ ) - return FALSE; - } - } - return TRUE; - } - return FALSE; -} -/* - * @implemented - */ -NTSTATUS -NTAPI -RtlUnicodeStringToInteger(const UNICODE_STRING *str, /* [I] Unicode string to be converted */ + PCUNICODE_STRING String1, + PCUNICODE_STRING String2, + BOOLEAN CaseInsensitive) +{ + PWCHAR pc1; + PWCHAR pc2; + ULONG Length; + + if (String2->Length < String1->Length) + return FALSE; + + Length = String1->Length / 2; + pc1 = String1->Buffer; + pc2 = String2->Buffer; + + if (pc1 && pc2) + { + if (CaseInsensitive) + { + while (Length--) + { + if (RtlUpcaseUnicodeChar(*pc1++) != + RtlUpcaseUnicodeChar(*pc2++)) + return FALSE; + } + } + else + { + while (Length--) + { + if( *pc1++ != *pc2++ ) + return FALSE; + } + } + + return TRUE; + } + + return FALSE; +} +/* + * @implemented + */ +NTSTATUS +NTAPI +RtlUnicodeStringToInteger( + const UNICODE_STRING *str, /* [I] Unicode string to be converted */ ULONG base, /* [I] Number base for conversion (allowed 0, 2, 8, 10 or 16) */ ULONG *value) /* [O] Destination for the converted value */ { @@ -877,67 +925,94 @@ ULONG RunningTotal = 0; char bMinus = 0;
- while (CharsRemaining >= 1 && *lpwstr <= ' ') { - lpwstr++; - CharsRemaining--; - } /* while */ - - if (CharsRemaining >= 1) { - if (*lpwstr == '+') { + while (CharsRemaining >= 1 && *lpwstr <= ' ') + { lpwstr++; CharsRemaining--; - } else if (*lpwstr == '-') { - bMinus = 1; + } + + if (CharsRemaining >= 1) + { + if (*lpwstr == '+') + { + lpwstr++; + CharsRemaining--; + } + else if (*lpwstr == '-') + { + bMinus = 1; + lpwstr++; + CharsRemaining--; + } + } + + if (base == 0) + { + base = 10; + + if (CharsRemaining >= 2 && lpwstr[0] == '0') + { + if (lpwstr[1] == 'b') + { + lpwstr += 2; + CharsRemaining -= 2; + base = 2; + } + else if (lpwstr[1] == 'o') + { + lpwstr += 2; + CharsRemaining -= 2; + base = 8; + } + else if (lpwstr[1] == 'x') + { + lpwstr += 2; + CharsRemaining -= 2; + base = 16; + } + } + } + else if (base != 2 && base != 8 && base != 10 && base != 16) + { + return STATUS_INVALID_PARAMETER; + } + + if (value == NULL) + { + return STATUS_ACCESS_VIOLATION; + } + + while (CharsRemaining >= 1) + { + wchCurrent = *lpwstr; + + if (wchCurrent >= '0' && wchCurrent <= '9') + { + digit = wchCurrent - '0'; + } + else if (wchCurrent >= 'A' && wchCurrent <= 'Z') + { + digit = wchCurrent - 'A' + 10; + } + else if (wchCurrent >= 'a' && wchCurrent <= 'z') + { + digit = wchCurrent - 'a' + 10; + } + else + { + digit = -1; + } + + if (digit < 0 || digit >= base) + { + *value = bMinus ? -RunningTotal : RunningTotal; + return STATUS_SUCCESS; + } + + RunningTotal = RunningTotal * base + digit; lpwstr++; CharsRemaining--; - } /* if */ - } /* if */ - - if (base == 0) { - base = 10; - if (CharsRemaining >= 2 && lpwstr[0] == '0') { - if (lpwstr[1] == 'b') { - lpwstr += 2; - CharsRemaining -= 2; - base = 2; - } else if (lpwstr[1] == 'o') { - lpwstr += 2; - CharsRemaining -= 2; - base = 8; - } else if (lpwstr[1] == 'x') { - lpwstr += 2; - CharsRemaining -= 2; - base = 16; - } /* if */ - } /* if */ - } else if (base != 2 && base != 8 && base != 10 && base != 16) { - return STATUS_INVALID_PARAMETER; - } /* if */ - - if (value == NULL) { - return STATUS_ACCESS_VIOLATION; - } /* if */ - - while (CharsRemaining >= 1) { - wchCurrent = *lpwstr; - if (wchCurrent >= '0' && wchCurrent <= '9') { - digit = wchCurrent - '0'; - } else if (wchCurrent >= 'A' && wchCurrent <= 'Z') { - digit = wchCurrent - 'A' + 10; - } else if (wchCurrent >= 'a' && wchCurrent <= 'z') { - digit = wchCurrent - 'a' + 10; - } else { - digit = -1; - } /* if */ - if (digit < 0 || digit >= base) { - *value = bMinus ? -RunningTotal : RunningTotal; - return STATUS_SUCCESS; - } /* if */ - - RunningTotal = RunningTotal * base + digit; - lpwstr++; - CharsRemaining--; - } /* while */ + }
*value = bMinus ? -RunningTotal : RunningTotal; return STATUS_SUCCESS; @@ -974,9 +1049,9 @@ NTSTATUS NTAPI RtlUnicodeStringToAnsiString( - IN OUT PANSI_STRING AnsiDest, - IN PCUNICODE_STRING UniSource, - IN BOOLEAN AllocateDestinationString) + IN OUT PANSI_STRING AnsiDest, + IN PCUNICODE_STRING UniSource, + IN BOOLEAN AllocateDestinationString) { NTSTATUS Status = STATUS_SUCCESS; NTSTATUS RealStatus; @@ -995,6 +1070,7 @@ { Length = RtlxUnicodeStringToAnsiSize(UniSource); } + if (Length > MAXUSHORT) return STATUS_INVALID_PARAMETER_2;
AnsiDest->Length = (USHORT)Length - sizeof(CHAR); @@ -1003,6 +1079,7 @@ { AnsiDest->Buffer = RtlpAllocateStringMemory(Length, TAG_ASTR); AnsiDest->MaximumLength = Length; + if (!AnsiDest->Buffer) return STATUS_NO_MEMORY; } else if (AnsiDest->Length >= AnsiDest->MaximumLength) @@ -1039,9 +1116,9 @@ NTSTATUS NTAPI RtlOemStringToUnicodeString( - IN OUT PUNICODE_STRING UniDest, - IN PCOEM_STRING OemSource, - IN BOOLEAN AllocateDestinationString) + IN OUT PUNICODE_STRING UniDest, + IN PCOEM_STRING OemSource, + IN BOOLEAN AllocateDestinationString) { NTSTATUS Status; ULONG Length; @@ -1050,6 +1127,7 @@ PAGED_CODE_RTL();
Length = RtlOemStringToUnicodeSize(OemSource); + if (Length > MAXUSHORT) return STATUS_INVALID_PARAMETER_2;
UniDest->Length = (USHORT)Length - sizeof(WCHAR); @@ -1058,6 +1136,7 @@ { UniDest->Buffer = RtlpAllocateStringMemory(Length, TAG_USTR); UniDest->MaximumLength = Length; + if (!UniDest->Buffer) return STATUS_NO_MEMORY; } else if (UniDest->Length >= UniDest->MaximumLength) @@ -1091,9 +1170,9 @@ NTSTATUS NTAPI RtlUnicodeStringToOemString( - IN OUT POEM_STRING OemDest, - IN PCUNICODE_STRING UniSource, - IN BOOLEAN AllocateDestinationString) + IN OUT POEM_STRING OemDest, + IN PCUNICODE_STRING UniSource, + IN BOOLEAN AllocateDestinationString) { NTSTATUS Status; ULONG Length; @@ -1102,6 +1181,7 @@ PAGED_CODE_RTL();
Length = RtlUnicodeStringToOemSize(UniSource); + if (Length > MAXUSHORT) return STATUS_INVALID_PARAMETER_2;
OemDest->Length = (USHORT)Length - sizeof(CHAR); @@ -1110,6 +1190,7 @@ { OemDest->Buffer = RtlpAllocateStringMemory(Length, TAG_OSTR); OemDest->MaximumLength = Length; + if (!OemDest->Buffer) return STATUS_NO_MEMORY; } else if (OemDest->Length >= OemDest->MaximumLength) @@ -1146,8 +1227,8 @@ NTAPI RtlIsTextUnicode( PVOID buf, INT len, INT *pf ) { - static const WCHAR std_control_chars[] = {'\r','\n','\t',' ',0x3000,0}; - static const WCHAR byterev_control_chars[] = {0x0d00,0x0a00,0x0900,0x2000,0}; + static const WCHAR std_control_chars[] = {'\r', '\n', '\t', ' ', 0x3000, 0}; + static const WCHAR byterev_control_chars[] = {0x0d00, 0x0a00, 0x0900, 0x2000, 0}; const WCHAR *s = buf; int i; unsigned int flags = MAXULONG, out_flags = 0; @@ -1156,10 +1237,13 @@ { /* FIXME: MSDN documents IS_TEXT_UNICODE_BUFFER_TOO_SMALL but there is no such thing... */ if (pf) *pf = 0; + return FALSE; } + if (pf) flags = *pf; + /* * Apply various tests to the text string. According to the * docs, each test "passed" sets the corresponding flag in @@ -1174,6 +1258,7 @@ len--; /* Windows seems to do something like that to avoid e.g. false IS_TEXT_UNICODE_NULL_BYTES */
len /= sizeof(WCHAR); + /* Windows only checks the first 256 characters */ if (len > 256) len = 256;
@@ -1185,11 +1270,13 @@ if (flags & IS_TEXT_UNICODE_STATISTICS) { int stats = 0; + /* FIXME: checks only for ASCII characters in the unicode stream */ for (i = 0; i < len; i++) { if (s[i] <= 255) stats++; } + if (stats > len / 2) out_flags |= IS_TEXT_UNICODE_STATISTICS; } @@ -1236,12 +1323,16 @@ out_flags &= *pf; *pf = out_flags; } + /* check for flags that indicate it's definitely not valid Unicode */ if (out_flags & (IS_TEXT_UNICODE_REVERSE_MASK | IS_TEXT_UNICODE_NOT_UNICODE_MASK)) return FALSE; + /* now check for invalid ASCII, and assume Unicode if so */ if (out_flags & IS_TEXT_UNICODE_NOT_ASCII_MASK) return TRUE; + /* now check for Unicode flags */ if (out_flags & IS_TEXT_UNICODE_UNICODE_MASK) return TRUE; + /* no flags set */ return FALSE; } @@ -1257,9 +1348,9 @@ NTSTATUS NTAPI RtlOemStringToCountedUnicodeString( - IN OUT PUNICODE_STRING UniDest, - IN PCOEM_STRING OemSource, - IN BOOLEAN AllocateDestinationString) + IN OUT PUNICODE_STRING UniDest, + IN PCOEM_STRING OemSource, + IN BOOLEAN AllocateDestinationString) { NTSTATUS Status; ULONG Length; @@ -1288,6 +1379,7 @@ { UniDest->Buffer = RtlpAllocateStringMemory(Length, TAG_USTR); UniDest->MaximumLength = Length; + if (!UniDest->Buffer) return STATUS_NO_MEMORY; } else if (UniDest->Length > UniDest->MaximumLength) @@ -1325,8 +1417,8 @@ BOOLEAN NTAPI RtlEqualComputerName( - IN PUNICODE_STRING ComputerName1, - IN PUNICODE_STRING ComputerName2) + IN PUNICODE_STRING ComputerName1, + IN PUNICODE_STRING ComputerName2) { OEM_STRING OemString1; OEM_STRING OemString2; @@ -1343,6 +1435,7 @@ Result = RtlEqualString(&OemString1, &OemString2, FALSE); RtlFreeOemString(&OemString2); } + RtlFreeOemString(&OemString1); }
@@ -1361,8 +1454,8 @@ BOOLEAN NTAPI RtlEqualDomainName ( - IN PUNICODE_STRING DomainName1, - IN PUNICODE_STRING DomainName2 + IN PUNICODE_STRING DomainName1, + IN PUNICODE_STRING DomainName2 ) { return RtlEqualComputerName(DomainName1, DomainName2); @@ -1389,112 +1482,115 @@ NTSTATUS NTAPI RtlGUIDFromString( - IN UNICODE_STRING *str, - OUT GUID* guid + IN UNICODE_STRING *str, + OUT GUID* guid ) { - int i = 0; - const WCHAR *lpszCLSID = str->Buffer; - BYTE* lpOut = (BYTE*)guid; - - //TRACE("(%s,%p)\n", debugstr_us(str), guid); - - /* Convert string: {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} - * to memory: DWORD... WORD WORD BYTES............ - */ - while (i <= 37) - { - switch (i) - { - case 0: - if (*lpszCLSID != '{') - return STATUS_INVALID_PARAMETER; - break; - - case 9: - case 14: - case 19: - case 24: - if (*lpszCLSID != '-') - return STATUS_INVALID_PARAMETER; - break; - - case 37: - if (*lpszCLSID != '}') - return STATUS_INVALID_PARAMETER; - break; - - default: + int i = 0; + const WCHAR *lpszCLSID = str->Buffer; + BYTE* lpOut = (BYTE*)guid; + + //TRACE("(%s,%p)\n", debugstr_us(str), guid); + + /* Convert string: {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} + * to memory: DWORD... WORD WORD BYTES............ + */ + while (i <= 37) + { + switch (i) + { + case 0: + if (*lpszCLSID != '{') + return STATUS_INVALID_PARAMETER; + break; + + case 9: + case 14: + case 19: + case 24: + if (*lpszCLSID != '-') + return STATUS_INVALID_PARAMETER; + break; + + case 37: + if (*lpszCLSID != '}') + return STATUS_INVALID_PARAMETER; + + break; + + default: { - WCHAR ch = *lpszCLSID, ch2 = lpszCLSID[1]; - unsigned char byte; - - /* Read two hex digits as a byte value */ - if (ch >= '0' && ch <= '9') - ch = ch - '0'; - else if (ch >= 'a' && ch <= 'f') - ch = ch - 'a' + 10; - else if (ch >= 'A' && ch <= 'F') - ch = ch - 'A' + 10; - else - return STATUS_INVALID_PARAMETER; - - if (ch2 >= '0' && ch2 <= '9') - ch2 = ch2 - '0'; - else if (ch2 >= 'a' && ch2 <= 'f') - ch2 = ch2 - 'a' + 10; - else if (ch2 >= 'A' && ch2 <= 'F') - ch2 = ch2 - 'A' + 10; - else - return STATUS_INVALID_PARAMETER; - - byte = ch << 4 | ch2; - - switch (i) - { + WCHAR ch = *lpszCLSID, ch2 = lpszCLSID[1]; + unsigned char byte; + + /* Read two hex digits as a byte value */ + if (ch >= '0' && ch <= '9') + ch = ch - '0'; + else if (ch >= 'a' && ch <= 'f') + ch = ch - 'a' + 10; + else if (ch >= 'A' && ch <= 'F') + ch = ch - 'A' + 10; + else + return STATUS_INVALID_PARAMETER; + + if (ch2 >= '0' && ch2 <= '9') + ch2 = ch2 - '0'; + else if (ch2 >= 'a' && ch2 <= 'f') + ch2 = ch2 - 'a' + 10; + else if (ch2 >= 'A' && ch2 <= 'F') + ch2 = ch2 - 'A' + 10; + else + return STATUS_INVALID_PARAMETER; + + byte = ch << 4 | ch2; + + switch (i) + { #ifndef WORDS_BIGENDIAN - /* For Big Endian machines, we store the data such that the - * dword/word members can be read as DWORDS and WORDS correctly. */ - /* Dword */ - case 1: - lpOut[3] = byte; - break; - case 3: - lpOut[2] = byte; - break; - case 5: - lpOut[1] = byte; - break; - case 7: - lpOut[0] = byte; - lpOut += 4; - break; - /* Word */ - case 10: - case 15: - lpOut[1] = byte; - break; - case 12: - case 17: - lpOut[0] = byte; - lpOut += 2; - break; + /* For Big Endian machines, we store the data such that the + * dword/word members can be read as DWORDS and WORDS correctly. */ + /* Dword */ + case 1: + lpOut[3] = byte; + break; + case 3: + lpOut[2] = byte; + break; + case 5: + lpOut[1] = byte; + break; + case 7: + lpOut[0] = byte; + lpOut += 4; + break; + /* Word */ + case 10: + case 15: + lpOut[1] = byte; + break; + case 12: + case 17: + lpOut[0] = byte; + lpOut += 2; + break; #endif - /* Byte */ - default: - lpOut[0] = byte; - lpOut++; - break; - } - lpszCLSID++; /* Skip 2nd character of byte */ - i++; + /* Byte */ + default: + lpOut[0] = byte; + lpOut++; + break; + } + + lpszCLSID++; /* Skip 2nd character of byte */ + i++; } - } - lpszCLSID++; - i++; - } - - return STATUS_SUCCESS; + } + + lpszCLSID++; + i++; + } + + return STATUS_SUCCESS; }
/* @@ -1503,7 +1599,7 @@ VOID NTAPI RtlEraseUnicodeString( - IN PUNICODE_STRING String) + IN PUNICODE_STRING String) { if (String->Buffer && String->MaximumLength) { @@ -1518,10 +1614,10 @@ NTSTATUS NTAPI RtlHashUnicodeString( - IN CONST UNICODE_STRING *String, - IN BOOLEAN CaseInSensitive, - IN ULONG HashAlgorithm, - OUT PULONG HashValue) + IN CONST UNICODE_STRING *String, + IN BOOLEAN CaseInSensitive, + IN ULONG HashAlgorithm, + OUT PULONG HashValue) { if (String != NULL && HashValue != NULL) { @@ -1537,9 +1633,7 @@
if (CaseInSensitive) { - for (c = String->Buffer; - c != end; - c++) + for (c = String->Buffer; c != end; c++) { /* only uppercase characters if they are 'a' ... 'z'! */ *HashValue = ((65599 * (*HashValue)) + @@ -1549,13 +1643,12 @@ } else { - for (c = String->Buffer; - c != end; - c++) + for (c = String->Buffer; c != end; c++) { *HashValue = ((65599 * (*HashValue)) + (ULONG)(*c)); } } + return STATUS_SUCCESS; } } @@ -1574,9 +1667,9 @@ NTSTATUS NTAPI RtlUnicodeStringToCountedOemString( - IN OUT POEM_STRING OemDest, - IN PUNICODE_STRING UniSource, - IN BOOLEAN AllocateDestinationString) + IN OUT POEM_STRING OemDest, + IN PUNICODE_STRING UniSource, + IN BOOLEAN AllocateDestinationString) { NTSTATUS Status; ULONG Length; @@ -1640,10 +1733,10 @@ NTSTATUS NTAPI RtlLargeIntegerToChar( - IN PLARGE_INTEGER Value, - IN ULONG Base, - IN ULONG Length, - IN OUT PCHAR String) + IN PLARGE_INTEGER Value, + IN ULONG Base, + IN ULONG Length, + IN OUT PCHAR String) { ULONGLONG Val = Value->QuadPart; NTSTATUS Status = STATUS_SUCCESS; @@ -1668,6 +1761,7 @@ Pos--; Digit = Val % Base; Val = Val / Base; + if (Digit < 10) *Pos = '0' + Digit; else @@ -1681,20 +1775,24 @@ return STATUS_BUFFER_OVERFLOW;
#if 1 /* It needs to be removed, when will probably use SEH in rtl */ + if (String == NULL) { return STATUS_ACCESS_VIOLATION; } + #endif
#if 0 _SEH2_TRY { #endif + if (Len == Length) RtlCopyMemory(String, Pos, Len); else RtlCopyMemory(String, Pos, Len + 1); + #if 0 } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) @@ -1718,9 +1816,9 @@ NTSTATUS NTAPI RtlUpcaseUnicodeString( - IN OUT PUNICODE_STRING UniDest, - IN PCUNICODE_STRING UniSource, - IN BOOLEAN AllocateDestinationString) + IN OUT PUNICODE_STRING UniDest, + IN PCUNICODE_STRING UniSource, + IN BOOLEAN AllocateDestinationString) { ULONG i, j;
@@ -1758,14 +1856,13 @@ NTSTATUS NTAPI RtlUpcaseUnicodeStringToAnsiString( - IN OUT PANSI_STRING AnsiDest, - IN PUNICODE_STRING UniSource, - IN BOOLEAN AllocateDestinationString) + IN OUT PANSI_STRING AnsiDest, + IN PUNICODE_STRING UniSource, + IN BOOLEAN AllocateDestinationString) { NTSTATUS Status; ULONG Length; ULONG Index; - PAGED_CODE_RTL();
Length = RtlUnicodeStringToAnsiSize(UniSource); @@ -1811,14 +1908,13 @@ NTSTATUS NTAPI RtlUpcaseUnicodeStringToCountedOemString( - IN OUT POEM_STRING OemDest, - IN PCUNICODE_STRING UniSource, - IN BOOLEAN AllocateDestinationString) + IN OUT POEM_STRING OemDest, + IN PCUNICODE_STRING UniSource, + IN BOOLEAN AllocateDestinationString) { NTSTATUS Status; ULONG Length; ULONG Index; - PAGED_CODE_RTL();
Length = RtlUnicodeStringToCountedOemSize(UniSource); @@ -1872,14 +1968,13 @@ NTSTATUS NTAPI RtlUpcaseUnicodeStringToOemString ( - IN OUT POEM_STRING OemDest, - IN PCUNICODE_STRING UniSource, - IN BOOLEAN AllocateDestinationString) + IN OUT POEM_STRING OemDest, + IN PCUNICODE_STRING UniSource, + IN BOOLEAN AllocateDestinationString) { NTSTATUS Status; ULONG Length; ULONG Index; - PAGED_CODE_RTL();
Length = RtlUnicodeStringToOemSize(UniSource); @@ -1983,7 +2078,6 @@ RtlxUnicodeStringToAnsiSize(IN PCUNICODE_STRING UnicodeString) { ULONG Size; - PAGED_CODE_RTL();
ASSERT(!(UnicodeString->Length & 1)); @@ -2003,28 +2097,30 @@ LONG NTAPI RtlCompareUnicodeString( - IN PCUNICODE_STRING s1, - IN PCUNICODE_STRING s2, - IN BOOLEAN CaseInsensitive) -{ - unsigned int len; - LONG ret = 0; - LPCWSTR p1, p2; - - len = min(s1->Length, s2->Length) / sizeof(WCHAR); - p1 = s1->Buffer; - p2 = s2->Buffer; - - if (CaseInsensitive) - { - while (!ret && len--) ret = RtlUpcaseUnicodeChar(*p1++) - RtlUpcaseUnicodeChar(*p2++); - } - else - { - while (!ret && len--) ret = *p1++ - *p2++; - } - if (!ret) ret = s1->Length - s2->Length; - return ret; + IN PCUNICODE_STRING s1, + IN PCUNICODE_STRING s2, + IN BOOLEAN CaseInsensitive) +{ + unsigned int len; + LONG ret = 0; + LPCWSTR p1, p2; + + len = min(s1->Length, s2->Length) / sizeof(WCHAR); + p1 = s1->Buffer; + p2 = s2->Buffer; + + if (CaseInsensitive) + { + while (!ret && len--) ret = RtlUpcaseUnicodeChar(*p1++) - RtlUpcaseUnicodeChar(*p2++); + } + else + { + while (!ret && len--) ret = *p1++ - *p2++; + } + + if (!ret) ret = s1->Length - s2->Length; + + return ret; }
/* @@ -2033,8 +2129,8 @@ VOID NTAPI RtlCopyString( - IN OUT PSTRING DestinationString, - IN PSTRING SourceString OPTIONAL) + IN OUT PSTRING DestinationString, + IN PSTRING SourceString OPTIONAL) { ULONG SourceLength; PCHAR p1, p2; @@ -2074,8 +2170,8 @@ VOID NTAPI RtlCopyUnicodeString( - IN OUT PUNICODE_STRING DestinationString, - IN PCUNICODE_STRING SourceString) + IN OUT PUNICODE_STRING DestinationString, + IN PCUNICODE_STRING SourceString) { ULONG SourceLength;
@@ -2109,11 +2205,10 @@ BOOLEAN NTAPI RtlCreateUnicodeString( - IN OUT PUNICODE_STRING UniDest, - IN PCWSTR Source) + IN OUT PUNICODE_STRING UniDest, + IN PCWSTR Source) { ULONG Length; - PAGED_CODE_RTL();
Length = (wcslen(Source) + 1) * sizeof(WCHAR); @@ -2136,8 +2231,8 @@ BOOLEAN NTAPI RtlCreateUnicodeStringFromAsciiz( - OUT PUNICODE_STRING Destination, - IN PCSZ Source) + OUT PUNICODE_STRING Destination, + IN PCSZ Source) { ANSI_STRING AnsiString; NTSTATUS Status; @@ -2162,13 +2257,12 @@ NTSTATUS NTAPI RtlDowncaseUnicodeString( - IN OUT PUNICODE_STRING UniDest, - IN PCUNICODE_STRING UniSource, - IN BOOLEAN AllocateDestinationString) + IN OUT PUNICODE_STRING UniDest, + IN PCUNICODE_STRING UniSource, + IN BOOLEAN AllocateDestinationString) { ULONG i; ULONG StopGap; - PAGED_CODE_RTL();
if (AllocateDestinationString) @@ -2185,7 +2279,7 @@ UniDest->Length = UniSource->Length; StopGap = UniSource->Length / sizeof(WCHAR);
- for (i= 0 ; i < StopGap; i++) + for (i = 0 ; i < StopGap; i++) { if (UniSource->Buffer[i] < L'A') { @@ -2256,8 +2350,8 @@ NTSTATUS NTAPI RtlAppendAsciizToString( - IN OUT PSTRING Destination, - IN PCSZ Source) + IN OUT PSTRING Destination, + IN PCSZ Source) { ULONG Length;
@@ -2294,6 +2388,7 @@ Src = SourceString->Buffer; Dest = DestinationString->Buffer; DestinationString->Length = Length; + while (Length) { *Dest++ = RtlUpperChar(*Src++); @@ -2310,82 +2405,86 @@ NTSTATUS NTAPI RtlDuplicateUnicodeString( - IN ULONG Flags, - IN PCUNICODE_STRING SourceString, - OUT PUNICODE_STRING DestinationString) -{ - PAGED_CODE_RTL(); + IN ULONG Flags, + IN PCUNICODE_STRING SourceString, + OUT PUNICODE_STRING DestinationString) +{ + PAGED_CODE_RTL();
if (SourceString == NULL || DestinationString == NULL || SourceString->Length > SourceString->MaximumLength || (SourceString->Length == 0 && SourceString->MaximumLength > 0 && SourceString->Buffer == NULL) || - Flags == RTL_DUPLICATE_UNICODE_STRING_ALLOCATE_NULL_STRING || Flags >= 4) { + Flags == RTL_DUPLICATE_UNICODE_STRING_ALLOCATE_NULL_STRING || Flags >= 4) + { return STATUS_INVALID_PARAMETER; }
- if ((SourceString->Length == 0) && - (Flags != (RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE | - RTL_DUPLICATE_UNICODE_STRING_ALLOCATE_NULL_STRING))) - { - DestinationString->Length = 0; - DestinationString->MaximumLength = 0; - DestinationString->Buffer = NULL; - } - else - { - UINT DestMaxLength = SourceString->Length; - - if (Flags & RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE) - DestMaxLength += sizeof(UNICODE_NULL); - - DestinationString->Buffer = RtlpAllocateStringMemory(DestMaxLength, TAG_USTR); - if (DestinationString->Buffer == NULL) - return STATUS_NO_MEMORY; - - RtlCopyMemory(DestinationString->Buffer, SourceString->Buffer, SourceString->Length); - DestinationString->Length = SourceString->Length; - DestinationString->MaximumLength = DestMaxLength; - - if (Flags & RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE) - DestinationString->Buffer[DestinationString->Length / sizeof(WCHAR)] = 0; - } - - return STATUS_SUCCESS; -} - -/* - * @implemented - */ -NTSTATUS NTAPI + if ((SourceString->Length == 0) && + (Flags != (RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE | + RTL_DUPLICATE_UNICODE_STRING_ALLOCATE_NULL_STRING))) + { + DestinationString->Length = 0; + DestinationString->MaximumLength = 0; + DestinationString->Buffer = NULL; + } + else + { + UINT DestMaxLength = SourceString->Length; + + if (Flags & RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE) + DestMaxLength += sizeof(UNICODE_NULL); + + DestinationString->Buffer = RtlpAllocateStringMemory(DestMaxLength, TAG_USTR); + + if (DestinationString->Buffer == NULL) + return STATUS_NO_MEMORY; + + RtlCopyMemory(DestinationString->Buffer, SourceString->Buffer, SourceString->Length); + DestinationString->Length = SourceString->Length; + DestinationString->MaximumLength = DestMaxLength; + + if (Flags & RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE) + DestinationString->Buffer[DestinationString->Length / sizeof(WCHAR)] = 0; + } + + return STATUS_SUCCESS; +} + +/* + * @implemented + */ +NTSTATUS +NTAPI RtlValidateUnicodeString(IN ULONG Flags, IN PCUNICODE_STRING UnicodeString) { - /* currently no flags are supported! */ - ASSERT(Flags == 0); - - if ((Flags == 0) && - ((UnicodeString == NULL) || - ((UnicodeString->Length != 0) && - (UnicodeString->Buffer != NULL) && - ((UnicodeString->Length % sizeof(WCHAR)) == 0) && - ((UnicodeString->MaximumLength % sizeof(WCHAR)) == 0) && - (UnicodeString->MaximumLength >= UnicodeString->Length)))) - { - /* a NULL pointer as a unicode string is considered to be a valid unicode - string! */ - return STATUS_SUCCESS; - } - else - { - return STATUS_INVALID_PARAMETER; - } + /* currently no flags are supported! */ + ASSERT(Flags == 0); + + if ((Flags == 0) && + ((UnicodeString == NULL) || + ((UnicodeString->Length != 0) && + (UnicodeString->Buffer != NULL) && + ((UnicodeString->Length % sizeof(WCHAR)) == 0) && + ((UnicodeString->MaximumLength % sizeof(WCHAR)) == 0) && + (UnicodeString->MaximumLength >= UnicodeString->Length)))) + { + /* a NULL pointer as a unicode string is considered to be a valid unicode + string! */ + return STATUS_SUCCESS; + } + else + { + return STATUS_INVALID_PARAMETER; + } }
/* * @unimplemented */ -NTSTATUS NTAPI +NTSTATUS +NTAPI RtlpEnsureBufferSize(ULONG Unknown1, ULONG Unknown2, ULONG Unknown3) { DPRINT1("RtlpEnsureBufferSize: stub\n"); @@ -2397,10 +2496,11 @@ */ NTSTATUS NTAPI -RtlFindCharInUnicodeString(IN ULONG Flags, - IN PUNICODE_STRING SearchString, - IN PCUNICODE_STRING MatchString, - OUT PUSHORT Position) +RtlFindCharInUnicodeString( + IN ULONG Flags, + IN PUNICODE_STRING SearchString, + IN PCUNICODE_STRING MatchString, + OUT PUSHORT Position) { int main_idx; unsigned int search_idx; @@ -2420,6 +2520,7 @@ } } } + *Position = 0; return STATUS_NOT_FOUND; } @@ -2437,6 +2538,7 @@ } } } + *Position = 0; return STATUS_NOT_FOUND; } @@ -2446,17 +2548,20 @@ for (main_idx = 0; main_idx < SearchString->Length / sizeof(WCHAR); main_idx++) { search_idx = 0; + while (search_idx < MatchString->Length / sizeof(WCHAR) && SearchString->Buffer[main_idx] != MatchString->Buffer[search_idx]) { search_idx++; } + if (search_idx >= MatchString->Length / sizeof(WCHAR)) { *Position = (main_idx + 1) * sizeof(WCHAR); return STATUS_SUCCESS; } } + *Position = 0; return STATUS_NOT_FOUND; } @@ -2466,21 +2571,24 @@ for (main_idx = SearchString->Length / sizeof(WCHAR) - 1; main_idx >= 0; main_idx--) { search_idx = 0; + while (search_idx < MatchString->Length / sizeof(WCHAR) && SearchString->Buffer[main_idx] != MatchString->Buffer[search_idx]) { search_idx++; } + if (search_idx >= MatchString->Length / sizeof(WCHAR)) { *Position = main_idx * sizeof(WCHAR); return STATUS_SUCCESS; } } + *Position = 0; return STATUS_NOT_FOUND; } - } /* switch */ + }
return STATUS_NOT_FOUND; } @@ -2495,63 +2603,65 @@ */ 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; -} - +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; +} +