summaryrefslogtreecommitdiffstats
path: root/private/nw/rdr/string.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/nw/rdr/string.c')
-rw-r--r--private/nw/rdr/string.c378
1 files changed, 378 insertions, 0 deletions
diff --git a/private/nw/rdr/string.c b/private/nw/rdr/string.c
new file mode 100644
index 000000000..c2136c3e0
--- /dev/null
+++ b/private/nw/rdr/string.c
@@ -0,0 +1,378 @@
+/*++
+
+Copyright (c) 1990 Microsoft Corporation
+
+Module Name:
+
+ string.c
+
+Abstract:
+
+ This module implements the string routines needed for the NT redirector
+
+Author:
+
+ Colin Watson (ColinW) 02-Apr-1993
+
+Revision History:
+
+ 14-Jun-1990 LarryO
+
+ Created for Lanman Redirector
+
+ 02-Apr-1993 ColinW
+
+ Modified for NwRdr
+
+--*/
+
+#include "Procs.h"
+
+#ifdef ALLOC_PRAGMA
+#pragma alloc_text( PAGE, DuplicateStringWithString )
+#pragma alloc_text( PAGE, DuplicateUnicodeStringWithString )
+#pragma alloc_text( PAGE, SetUnicodeString )
+#pragma alloc_text( PAGE, MergeStrings )
+#endif
+
+
+NTSTATUS
+DuplicateStringWithString (
+ OUT PSTRING DestinationString,
+ IN PSTRING SourceString,
+ IN POOL_TYPE PoolType
+ )
+
+/*++
+
+Routine Description:
+
+ This routine duplicates a supplied input string, storing the result
+ of the duplication in the supplied string. The maximumlength of the
+ new string is determined by the length of the SourceString.
+
+
+Arguments:
+
+ OUT PSTRING DestinationString - Returns the filled in string.
+ IN PSTRING SourceString - Supplies the string to duplicate
+ IN POOLTYPE PoolType - Supplies the type of pool (PagedPool or
+ NonPagedPool)
+Return Value:
+
+ NTSTATUS - Status of resulting operation
+ If !NT_SUCCESS then DestinationString->Buffer == NULL
+--*/
+
+{
+ PAGED_CODE();
+
+ DestinationString->Buffer = NULL;
+
+ try {
+
+ if (SourceString->Length != 0) {
+ //
+ // Allocate pool to hold the buffer (contents of the string)
+ //
+
+ DestinationString->Buffer = (PSZ )ALLOCATE_POOL(PoolType,
+ SourceString->Length);
+ }
+
+ } except (EXCEPTION_EXECUTE_HANDLER) {
+
+ return GetExceptionCode();
+
+ }
+
+ if (DestinationString->Buffer == NULL && SourceString->Length != 0) {
+
+ //
+ // The allocation failed, return failure.
+ //
+
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ }
+
+ DestinationString->MaximumLength = SourceString->Length;
+
+ //
+ // Copy the source string into the newly allocated
+ // destination string
+ //
+
+ RtlCopyString(DestinationString, SourceString);
+
+ return STATUS_SUCCESS;
+
+}
+
+
+NTSTATUS
+DuplicateUnicodeStringWithString (
+ OUT PUNICODE_STRING DestinationString,
+ IN PUNICODE_STRING SourceString,
+ IN POOL_TYPE PoolType
+ )
+
+/*++
+
+Routine Description:
+
+ This routine duplicates a supplied input string, storing the result
+ of the duplication in the supplied string. The maximumlength of the
+ new string is determined by the length of the SourceString.
+
+
+Arguments:
+
+ OUT PSTRING DestinationString - Returns the filled in string.
+ IN PSTRING SourceString - Supplies the string to duplicate
+ IN POOLTYPE PoolType - Supplies the type of pool (PagedPool or
+ NonPagedPool)
+Return Value:
+
+ NTSTATUS - Status of resulting operation
+ If !NT_SUCCESS then DestinationString->Buffer == NULL
+
+--*/
+
+{
+ PAGED_CODE();
+
+ DestinationString->Buffer = NULL;
+
+ try {
+
+ if (SourceString->Length != 0) {
+ //
+ // Allocate pool to hold the buffer (contents of the string)
+ //
+
+ DestinationString->Buffer = (WCHAR *)ALLOCATE_POOL(PoolType,
+ SourceString->Length);
+ }
+
+ } except (EXCEPTION_EXECUTE_HANDLER) {
+
+ return GetExceptionCode();
+
+ }
+
+ if (DestinationString->Buffer == NULL && SourceString->Length != 0) {
+
+ //
+ // The allocation failed, return failure.
+ //
+
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ }
+
+ DestinationString->MaximumLength = SourceString->Length;
+
+ //
+ // Copy the source string into the newly allocated
+ // destination string
+ //
+
+ RtlCopyUnicodeString(DestinationString, SourceString);
+
+ return STATUS_SUCCESS;
+
+}
+
+#if 0
+
+VOID
+CopyUnicodeStringToUnicode (
+ OUT PVOID *Destination,
+ IN PUNICODE_STRING Source,
+ IN BOOLEAN AdjustPointer
+ )
+
+/*++
+
+Routine Description:
+ This routine copies the specified source string onto the destination
+ asciiz string.
+
+Arguments:
+
+ OUT PUCHAR Destination, - Supplies a pointer to the destination
+ buffer for the string.
+ IN PSTRING String - Supplies the source string.
+ IN BOOLEAN AdjustPointer - If TRUE, increment destination pointer
+
+Return Value:
+
+ None.
+
+--*/
+
+{
+ PAGED_CODE();
+
+ RtlCopyMemory((*Destination), (Source)->Buffer, (Source)->Length);
+ if (AdjustPointer) {
+ ((PCHAR)(*Destination)) += ((Source)->Length);
+ }
+}
+
+
+NTSTATUS
+CopyUnicodeStringToAscii (
+ OUT PUCHAR *Destination,
+ IN PUNICODE_STRING Source,
+ IN BOOLEAN AdjustPointer,
+ IN USHORT MaxLength
+ )
+/*++
+
+Routine Description:
+
+ This routine copies the specified source string onto the destination
+ asciiz string.
+
+Arguments:
+
+ OUT PUCHAR Destination, - Supplies the destination asciiz string.
+ IN PUNICODE_STRING String - Supplies the source string.
+ IN BOOLEAN AdjustPointer - If TRUE, increment destination pointer
+
+Return Value:
+
+ Status of conversion.
+--*/
+{
+ ANSI_STRING DestinationString;
+
+ NTSTATUS Status;
+
+ PAGED_CODE();
+
+ DestinationString.Buffer = (*Destination);
+
+ DestinationString.MaximumLength = (USHORT)(MaxLength);
+
+ Status = RtlUnicodeStringToOemString(&DestinationString, (Source), FALSE);
+
+ if (!NT_SUCCESS(Status)) {
+ return Status;
+ }
+
+ if (AdjustPointer) {
+ (*Destination) += DestinationString.Length;
+ }
+
+ return STATUS_SUCCESS;
+
+}
+#endif
+
+
+NTSTATUS
+SetUnicodeString (
+ IN PUNICODE_STRING Destination,
+ IN ULONG Length,
+ IN PWCHAR Source
+ )
+/*++
+
+Routine Description:
+
+ This routine copies the specified source string onto the destination
+ UNICODE string allocating the buffer.
+
+Arguments:
+
+
+Return Value:
+
+ Status of conversion.
+--*/
+{
+ UNICODE_STRING Temp;
+
+ PAGED_CODE();
+
+ Destination->Buffer = NULL;
+ Destination->Length = 0;
+ Destination->MaximumLength = 0;
+
+ if (Length == 0) {
+ return STATUS_SUCCESS;
+ }
+
+ Temp.MaximumLength =
+ Temp.Length = (USHORT )Length;
+ Temp.Buffer = Source;
+
+ Destination->Buffer =
+ ALLOCATE_POOL(NonPagedPool,
+ Temp.MaximumLength+sizeof(WCHAR));
+
+ if (Destination->Buffer == NULL) {
+ Error(EVENT_NWRDR_RESOURCE_SHORTAGE, STATUS_INSUFFICIENT_RESOURCES, NULL, 0, 0);
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ }
+
+ Destination->MaximumLength = (USHORT)Length;
+
+ RtlCopyUnicodeString(Destination, &Temp);
+
+ Destination->Buffer[(Destination->Length/sizeof(WCHAR))] = UNICODE_NULL;
+
+ return STATUS_SUCCESS;
+
+}
+
+
+VOID
+MergeStrings(
+ IN PUNICODE_STRING Destination,
+ IN PUNICODE_STRING S1,
+ IN PUNICODE_STRING S2,
+ IN ULONG Type
+ )
+/*++
+
+Routine Description:
+
+ This routine Allocates space for Destination.Buffer and copies S1 followed
+ by S2 into the buffer.
+
+ Raises status if couldn't allocate buffer
+
+Arguments:
+
+ IN PUNICODE_STRING Destination,
+ IN PUNICODE_STRING S1,
+ IN PUNICODE_STRING S2,
+ IN ULONG Type - PagedPool or NonPagedPool
+
+Return Value:
+
+ None.
+
+--*/
+{
+ PAGED_CODE();
+
+ Destination->MaximumLength = S1->Length + S2->Length;
+ Destination->Length = S1->Length + S2->Length;
+
+ Destination->Buffer = ALLOCATE_POOL_EX( Type, Destination->MaximumLength );
+
+ RtlCopyMemory( Destination->Buffer,
+ S1->Buffer,
+ S1->Length);
+
+ RtlCopyMemory( (PUCHAR)Destination->Buffer + S1->Length,
+ S2->Buffer,
+ S2->Length);
+ return;
+}