Leaked source code of windows server 2003
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.
 
 
 
 
 
 

250 lines
5.6 KiB

//--------------------------------------------------------------------------
//
// Copyright (C) 1999, Microsoft Corporation
//
// File: dfsstrings.hxx
//
//--------------------------------------------------------------------------
#ifndef __DFS_STRINGS__
#define __DFS_STRINGS__
#include "dfsmisc.h"
class DfsString
{
private:
UNICODE_STRING _StringData;
BOOLEAN _Allocated;
DFSSTATUS
AllocateString(size_t CharacterCount)
{
DFSSTATUS Status = ERROR_SUCCESS;
if (CharacterCount >= MAXUSHORT)
{
return ERROR_INVALID_PARAMETER;
}
if (_StringData.MaximumLength >= (CharacterCount * sizeof(WCHAR)))
{
_StringData.Length = 0;
return ERROR_SUCCESS;
}
if (_StringData.Buffer != NULL)
{
delete [] _StringData.Buffer;
RtlInitUnicodeString(&_StringData, NULL);
}
_StringData.Buffer = new WCHAR[CharacterCount];
if (_StringData.Buffer == NULL)
{
Status = ERROR_NOT_ENOUGH_MEMORY;
}
else
{
_Allocated = TRUE;
_StringData.MaximumLength = CharacterCount * sizeof(WCHAR);
}
return Status;
}
DFSSTATUS
CopyCountedString( IN PUNICODE_STRING pUnicodeString)
{
ULONG TotalCount = pUnicodeString->Length / sizeof(WCHAR);
ULONG StringLength = TotalCount;
DFSSTATUS Status;
if ((TotalCount * sizeof(WCHAR)) >= MAXUSHORT)
{
return ERROR_INVALID_PARAMETER;
}
if( (_StringData.Buffer == pUnicodeString->Buffer) &&
(pUnicodeString->Buffer != NULL))
{
return ERROR_INVALID_PARAMETER;
}
//
// Total Count will include the last null. String length does not.
//
if ((StringLength == 0) ||
(pUnicodeString->Buffer[StringLength - 1] != UNICODE_NULL))
{
TotalCount++;
}
else
{
StringLength--;
}
Status = AllocateString(TotalCount);
if (Status == ERROR_SUCCESS)
{
RtlCopyMemory(_StringData.Buffer,
pUnicodeString->Buffer,
StringLength * sizeof(WCHAR));
_StringData.Length = (USHORT)(StringLength * sizeof(WCHAR));
_StringData.Buffer[StringLength] = UNICODE_NULL;
}
return Status;
}
BOOLEAN
CompareCountedString( IN PUNICODE_STRING pInUnicodeString)
{
if (RtlCompareUnicodeString(&_StringData,
pInUnicodeString,
TRUE) == 0)
{
return TRUE;
}
return FALSE;
}
public:
DfsString()
{
_Allocated = FALSE;
RtlInitUnicodeString(&_StringData, NULL);
}
DfsString(size_t CharacterCount,
DFSSTATUS *pStatus)
{
*pStatus = ERROR_SUCCESS;
_Allocated = FALSE;
RtlInitUnicodeString(&_StringData, NULL);
*pStatus = AllocateString(CharacterCount);
}
DFSSTATUS
CreateString(IN LPWSTR InString)
{
DFSSTATUS Status = ERROR_SUCCESS;
UNICODE_STRING UnicodeString;
Status = DfsRtlInitUnicodeStringEx(&UnicodeString, InString);
if (Status == ERROR_SUCCESS)
{
Status = CopyCountedString( &UnicodeString);
}
return Status;
}
DFSSTATUS
CreateString(IN PUNICODE_STRING pInUnicodeString)
{
DFSSTATUS Status = ERROR_SUCCESS;
Status = CopyCountedString( pInUnicodeString );
return Status;
}
DFSSTATUS
CreateString(IN DfsString *pString)
{
DFSSTATUS Status = ERROR_SUCCESS;
Status = CopyCountedString( pString->GetCountedString());
return Status;
}
BOOLEAN
operator==(IN LPWSTR InString)
{
UNICODE_STRING UnicodeString;
DFSSTATUS Status;
Status = DfsRtlInitUnicodeStringEx(&UnicodeString, InString);
if (Status != ERROR_SUCCESS)
{
return FALSE;
}
return CompareCountedString( &UnicodeString );
}
BOOLEAN
operator==(IN DfsString *pString)
{
return CompareCountedString( pString->GetCountedString());
}
BOOLEAN
operator==(IN PUNICODE_STRING pInUnicodeString)
{
return CompareCountedString( pInUnicodeString );
}
DFSSTATUS
SetStringToPointer(LPWSTR Buffer)
{
DFSSTATUS Status;
if (wcslen(Buffer) * sizeof(WCHAR) > MAXUSHORT)
{
return ERROR_INVALID_PARAMETER;
}
_Allocated = FALSE;
Status = DfsRtlInitUnicodeStringEx(&_StringData, Buffer);
return Status;
}
DFSSTATUS
SetStringToPointer(PUNICODE_STRING pInput)
{
_StringData = *pInput;
return ERROR_SUCCESS;
}
PUNICODE_STRING
GetCountedString()
{
return &_StringData;
}
LPWSTR
GetString()
{
return _StringData.Buffer;
}
~DfsString()
{
if (_Allocated && (_StringData.Buffer != NULL))
{
delete [] _StringData.Buffer;
}
RtlInitUnicodeString(&_StringData, NULL);
}
};
#endif // __DFS_STRINGS