Stefan Ginsberg <stefan__100__@hotmail.com>
[reactos.git] / rosapps / drivers / green / green.c
index 5834f3b..fcb72d7 100644 (file)
@@ -41,13 +41,13 @@ DriverEntry(
        }
        RtlZeroMemory(DriverExtension, sizeof(GREEN_DRIVER_EXTENSION));
 
-       Status = RtlDuplicateUnicodeString(
+       Status = GreenDuplicateUnicodeString(
                0,
                RegistryPath,
                &DriverExtension->RegistryPath);
        if (!NT_SUCCESS(Status))
        {
-               DPRINT("RtlDuplicateUnicodeString() failed with status 0x%08lx\n", Status);
+               DPRINT("GreenDuplicateUnicodeString() failed with status 0x%08lx\n", Status);
                return Status;
        }
 
@@ -66,3 +66,48 @@ DriverEntry(
 
        return STATUS_SUCCESS;
 }
+
+NTSTATUS
+GreenDuplicateUnicodeString(
+    IN ULONG Flags,
+    IN PCUNICODE_STRING SourceString,
+    OUT PUNICODE_STRING DestinationString)
+{
+    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)
+    {
+        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
+    {
+        USHORT DestMaxLength = SourceString->Length;
+
+        if (Flags & RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE)
+            DestMaxLength += sizeof(UNICODE_NULL);
+
+        DestinationString->Buffer = ExAllocatePool(PagedPool, DestMaxLength);
+        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;
+}