implemented RtlValidateUnicodeString, thanks to "mephistopheles" for providing some pseudeo code
Modified: trunk/reactos/lib/ntdll/def/ntdll.def
Modified: trunk/reactos/lib/rtl/unicode.c

Modified: trunk/reactos/lib/ntdll/def/ntdll.def
--- trunk/reactos/lib/ntdll/def/ntdll.def	2005-03-28 19:29:59 UTC (rev 14377)
+++ trunk/reactos/lib/ntdll/def/ntdll.def	2005-03-29 02:09:42 UTC (rev 14378)
@@ -671,6 +671,7 @@
 RtlValidSid@4
 RtlValidateHeap@12
 RtlValidateProcessHeaps@0
+RtlValidateUnicodeString@8
 ;RtlWalkHeap
 RtlWriteRegistryValue@24
 ;RtlZeroHeap

Modified: trunk/reactos/lib/rtl/unicode.c
--- trunk/reactos/lib/rtl/unicode.c	2005-03-28 19:29:59 UTC (rev 14377)
+++ trunk/reactos/lib/rtl/unicode.c	2005-03-29 02:09:42 UTC (rev 14378)
@@ -2671,4 +2671,33 @@
    return STATUS_SUCCESS;
 }
 
+
+/*
+ * @implemented
+ */
+NTSTATUS STDCALL
+RtlValidateUnicodeString(IN ULONG Flags,
+                         IN PUNICODE_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;
+  }
+}
+
 /* EOF */