Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

194 lines
4.4 KiB

/*++
Copyright (c) 1990 Microsoft Corporation
Module Name:
string.c
Abstract:
This module implements the string routines needed for the NT redirector
Author:
Larry Osterman (LarryO) 14-Jun-1990
Revision History:
14-Jun-1990 LarryO
Created
--*/
#include "precomp.h"
#pragma hdrstop
#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE, RdrpDuplicateStringWithString)
#pragma alloc_text(PAGE, RdrpDuplicateUnicodeStringWithString)
#endif
NTSTATUS
RdrpDuplicateStringWithString (
OUT PSTRING DestinationString,
IN PSTRING SourceString,
IN POOL_TYPE PoolType,
IN BOOLEAN ChargeQuota
)
/*++
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)
IN BOOLEAN ChargeQuota - if TRUE, caller should be charged quota.
Return Value:
NTSTATUS - Status of resulting operation
--*/
{
PAGED_CODE();
DestinationString->Buffer = NULL;
try {
if (SourceString->Length != 0) {
//
// Allocate pool to hold the buffer (contents of the string)
//
if (ChargeQuota) {
DestinationString->Buffer = (PSZ )ALLOCATE_POOL_WITH_QUOTA(PoolType,
SourceString->Length, POOL_DUPSTRING);
} else {
DestinationString->Buffer = (PSZ )ALLOCATE_POOL(PoolType,
SourceString->Length, POOL_DUPSTRING);
}
}
} 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
RdrpDuplicateUnicodeStringWithString (
OUT PUNICODE_STRING DestinationString,
IN PUNICODE_STRING SourceString,
IN POOL_TYPE PoolType,
IN BOOLEAN ChargeQuota
)
/*++
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)
IN BOOLEAN ChargeQuota - if TRUE, caller should be charged quota.
Return Value:
NTSTATUS - Status of resulting operation
--*/
{
PAGED_CODE();
DestinationString->Buffer = NULL;
try {
if (SourceString->Length != 0) {
//
// Allocate pool to hold the buffer (contents of the string)
//
if (ChargeQuota) {
DestinationString->Buffer = (WCHAR *)ALLOCATE_POOL_WITH_QUOTA(PoolType,
SourceString->Length, POOL_DUPUNISTRING);
} else {
DestinationString->Buffer = (WCHAR *)ALLOCATE_POOL(PoolType,
SourceString->Length, POOL_DUPUNISTRING);
}
}
} 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;
}