156 lines
4.2 KiB
C++
156 lines
4.2 KiB
C++
//+-------------------------------------------------------------------------
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1995.
|
|
//
|
|
// File: custring.hxx
|
|
//
|
|
// Contents: This has declarations for some functions used in String class.
|
|
//
|
|
// Classes:
|
|
//
|
|
// Functions:
|
|
//
|
|
// History: 04-Feb-93 SudK Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#ifndef __CUSTRING_CLASS_INCLUDED
|
|
#define __CUSTRING_CLASS_INCLUDED
|
|
|
|
void SRtlDuplicateString(PUNICODE_STRING pDest, PUNICODE_STRING pSrc);
|
|
void SRtlNewString( PUNICODE_STRING pDest, PWCHAR pSrc);
|
|
void SRtlFreeString( PUNICODE_STRING pString);
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Name: CUnicodeString
|
|
//
|
|
// Synopsis: Wrapper for a UNICODE_STRING.
|
|
//
|
|
// Methods: ~CUnicodeString()
|
|
// CUnicodeString()
|
|
// CUnicodeString(WCHAR)
|
|
// CUnicodeString(CHAR)
|
|
// CUnicodeString(CUnicodeString&)
|
|
// CUnicodeString(UNICODE_STRING&)
|
|
// implicit conversions to PWCHAR, PUNICODE_STRING, UNICODE_STRING
|
|
// assignment operator from PWCHAR, UNICODE_STRING&, CUnicodeString&
|
|
// CUnicodeStrCat(CUnicodeString&)
|
|
// CUnicodeStrCat(PWCHAR)
|
|
//
|
|
// Notes: This class is not cheap on memory. Each of the constructors (
|
|
// including the assignment operators) allocate new storage for
|
|
// the string. The destructor frees the storage.
|
|
//
|
|
// This class will implicity convert to either a UNICODE_STRING or
|
|
// to a PUNICODE_STRING. This means if you have a function:
|
|
// Foo1 ( UNICODE_STRING ss, PUNICODE_STRING pss );
|
|
// and two CUnicodeStrings, cuStr1, cuStr2, you call it foo like:
|
|
// Foo1 ( cuStr1, cuStr2 );
|
|
// (ie. you don't use "&cuStr2" like you do for a UNICODE_STRING.)
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
class CUnicodeString {
|
|
private:
|
|
|
|
UNICODE_STRING _ss;
|
|
|
|
public:
|
|
|
|
//
|
|
// Destructor
|
|
//
|
|
~CUnicodeString()
|
|
{ SRtlFreeString( &_ss ); };
|
|
|
|
//
|
|
// Constructors
|
|
//
|
|
CUnicodeString()
|
|
{
|
|
_ss.Length = _ss.MaximumLength = 0;
|
|
_ss.Buffer = 0;
|
|
};
|
|
|
|
CUnicodeString( WCHAR *pwc)
|
|
{ SRtlNewString( &_ss, pwc ); };
|
|
|
|
CUnicodeString( CUnicodeString& css )
|
|
{ SRtlDuplicateString( &_ss, &css._ss ); };
|
|
|
|
CUnicodeString( UNICODE_STRING& ss )
|
|
{ SRtlDuplicateString( &_ss, &ss ); };
|
|
|
|
//
|
|
// Some useful conversions
|
|
//
|
|
|
|
operator PWCHAR ()
|
|
{ return(_ss.Buffer); };
|
|
|
|
operator UNICODE_STRING ()
|
|
{ return(_ss); }
|
|
|
|
operator PUNICODE_STRING ()
|
|
{ return(&_ss); }
|
|
|
|
VOID Transfer(PUNICODE_STRING pustr)
|
|
{ *pustr = _ss; _ss.Length = _ss.MaximumLength = 0; _ss.Buffer = NULL; }
|
|
|
|
//
|
|
// Access to elements
|
|
//
|
|
USHORT GetLength()
|
|
{ return(_ss.Length); };
|
|
|
|
USHORT GetMaximumLength()
|
|
{ return(_ss.MaximumLength); };
|
|
|
|
WCHAR * GetBuffer()
|
|
{ return(_ss.Buffer); };
|
|
|
|
//
|
|
// Finally, some operators
|
|
//
|
|
|
|
VOID Copy( PWCHAR r)
|
|
{
|
|
ASSERT((_ss.MaximumLength == 0)&&(_ss.Buffer == NULL));
|
|
SRtlNewString( &_ss, r);
|
|
return;
|
|
};
|
|
|
|
// =
|
|
CUnicodeString& operator=( PWCHAR r )
|
|
{
|
|
ASSERT((_ss.MaximumLength == 0)&&(_ss.Buffer == NULL));
|
|
SRtlNewString( &_ss, r );
|
|
return(*this);
|
|
};
|
|
|
|
CUnicodeString& operator=( CUnicodeString& r )
|
|
{
|
|
ASSERT((_ss.MaximumLength == 0)&&(_ss.Buffer == NULL));
|
|
SRtlDuplicateString( &_ss, &r._ss );
|
|
return(*this);
|
|
};
|
|
|
|
CUnicodeString& operator=( UNICODE_STRING r )
|
|
{
|
|
ASSERT((_ss.MaximumLength == 0)&&(_ss.Buffer == NULL));
|
|
SRtlDuplicateString( &_ss, &r );
|
|
return(*this);
|
|
};
|
|
|
|
CUnicodeString& operator=( STRING r )
|
|
{
|
|
ASSERT((_ss.MaximumLength == 0)&&(_ss.Buffer == NULL));
|
|
SRtlDuplicateString( &_ss, (PUNICODE_STRING) &r );
|
|
return(*this);
|
|
};
|
|
|
|
};
|
|
|
|
#endif // __CUSTRING_CLASS_INCLUDED
|