From c5fa27e2d741f2b63ca4bc2607f703e8a9a45daf Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Thu, 29 May 2008 16:00:20 +0000 Subject: [PATCH] Stefan Ginsberg - 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 | 49 +++++++++++++++++++++++++++++++++-- rosapps/drivers/green/green.h | 17 ++++++------ rosapps/drivers/green/pnp.c | 5 ++-- 3 files changed, 59 insertions(+), 12 deletions(-) diff --git a/rosapps/drivers/green/green.c b/rosapps/drivers/green/green.c index 5834f3bfcb0..fcb72d70f21 100644 --- a/rosapps/drivers/green/green.c +++ b/rosapps/drivers/green/green.c @@ -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; +} diff --git a/rosapps/drivers/green/green.h b/rosapps/drivers/green/green.h index b54fa961c2d..9124081c453 100644 --- a/rosapps/drivers/green/green.h +++ b/rosapps/drivers/green/green.h @@ -9,15 +9,8 @@ typedef struct _SECURITY_ATTRIBUTES SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES; #include #include -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); diff --git a/rosapps/drivers/green/pnp.c b/rosapps/drivers/green/pnp.c index 51fce9ec270..a5253e3938d 100644 --- a/rosapps/drivers/green/pnp.c +++ b/rosapps/drivers/green/pnp.c @@ -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; } +