Stefan Ginsberg <stefan__100__@hotmail.com>
authorAleksey Bragin <aleksey@reactos.org>
Thu, 29 May 2008 16:00:20 +0000 (16:00 +0000)
committerAleksey Bragin <aleksey@reactos.org>
Thu, 29 May 2008 16:00:20 +0000 (16:00 +0000)
- Remove usage of unexported RtlDuplicateUnicodeString in green.sys driver (this is basically the same fix which Herve applied to blue.sys).

svn path=/trunk/; revision=33758

rosapps/drivers/green/green.c
rosapps/drivers/green/green.h
rosapps/drivers/green/pnp.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;
+}
index b54fa96..9124081 100644 (file)
@@ -9,15 +9,8 @@ typedef struct _SECURITY_ATTRIBUTES SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES;
 #include <wincon.h>
 #include <drivers/blue/ntddblue.h>
 
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlDuplicateUnicodeString(
-    IN ULONG Flags,
-    IN PCUNICODE_STRING SourceString,
-    OUT PUNICODE_STRING DestinationString
-);
 #define RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE         1
+#define RTL_DUPLICATE_UNICODE_STRING_ALLOCATE_NULL_STRING   2
 
 #define INFINITE -1
 #define KEYBOARD_BUFFER_SIZE 100
@@ -190,3 +183,11 @@ NTSTATUS
 ScreenDeviceControl(
        IN PDEVICE_OBJECT DeviceObject,
        IN PIRP Irp);
+
+/************************************ green.c */
+
+NTSTATUS
+GreenDuplicateUnicodeString(
+    IN ULONG Flags,
+    IN PCUNICODE_STRING SourceString,
+    OUT PUNICODE_STRING DestinationString);
index 51fce9e..a5253e3 100644 (file)
@@ -343,7 +343,7 @@ GreenQueryId(
                        {
                                UNICODE_STRING SourceU, String;
                                RtlInitUnicodeString(&SourceU, Source);
-                               Status = RtlDuplicateUnicodeString(
+                               Status = GreenDuplicateUnicodeString(
                                        RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE,
                                        &SourceU,
                                        &String);
@@ -377,7 +377,7 @@ GreenQueryId(
                        if (SourceU.Length)
                        {
                                UNICODE_STRING String;
-                               Status = RtlDuplicateUnicodeString(
+                               Status = GreenDuplicateUnicodeString(
                                        RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE,
                                        &SourceU,
                                        &String);
@@ -560,3 +560,4 @@ GreenPnp(
        return Status;
 }
 
+