//+----------------------------------------------------------------------- // // File: SecStr.hxx // // Contents: C++ wrapper classes for SECURITY_STRING structures. // // // History: 24-Feb-93 WadeR Created // //------------------------------------------------------------------------ #ifndef _INC_SECSTR_HXX #define _INC_SECSTR_HXX //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// // // Support classes // //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// class CIntSecString { friend class CSecString; SECURITY_STRING _ssString; LONG _cRefs; inline CIntSecString(); }; inline CIntSecString::CIntSecString() { _ssString.Buffer = 0; _ssString.Length = _ssString.MaximumLength = 0; _cRefs = 1; } //////////////////////////////////////////////////////////////////// // // Name: CSecString // // Synopsis: Wrapper for a SECURITY_STRING. // // Methods: ~CSecString() // CSecString() // CSecString(PWCHAR) // CSecString(PCHAR) // CSecString(CSecString&) // CSecString(SECURITY_STRING&) // ulong GetSizeToMarshall() // SCODE Marshall(PBYTE) - marshals into the buffer // SCODE Unmarshall(PBYTE) // implicit conversions to PWCHAR, PSECURITY_STRING, SECURITY_STRING // assignment operator from PWCHAR, SECURITY_STRING&, CSecString& // ==,>,< operators for above types. // // Notes: This class keeps a reference count to a security string, and // assignment increments the ref count. When the last CSecString // that refers to a particular SECURITY_STRING is destroyed, the // SECURITY_STRING is freed. // // This class will implicity convert to either a SECURITY_STRING or // to a PSECURITY_STRING. This means if you have a function: // Foo1 ( SECURITY_STRING ss, PSECURITY_STRING pss ); // and two CSecStrings, SecStr1, SecStr2, you call it foo like: // Foo1 ( SecStr1, SecStr2 ); // (ie. you don't use "&SecStr2" like you would for a SECURITY_STRING.) // class CSecString { private: struct MarshalledData { USHORT cbLength; BYTE abData[1]; }; CIntSecString *_iss; void Destructor(); void Constructor( CHAR * ); void Constructor( WCHAR * ); void Constructor( CSecString& ); void Constructor( SECURITY_STRING& ); public: // // Destructor // inline ~CSecString(); // // Constructors // inline CSecString(); inline CSecString( PCHAR ); inline CSecString( PWCHAR ); inline CSecString( CSecString& ); inline CSecString( SECURITY_STRING& ); // // Marshalling and unmarshalling code. // SECURITY_STATUS Unmarshall( PBYTE pb ); SECURITY_STATUS Marshall( PBYTE pb ); ULONG GetSizeToMarshall(); // // Some useful conversions // inline operator PWCHAR (); inline operator SECURITY_STRING (); inline operator PSECURITY_STRING (); // // Access to elements // inline USHORT GetLength(); inline USHORT GetMaximumLength(); inline PWCHAR GetBuffer(); // // Finally, some operators // // & //inline PSECURITY_STRING operator&(); // = inline CSecString& operator=( PWCHAR r ); inline CSecString& operator=( CSecString& r ); inline CSecString& operator=( SECURITY_STRING& r ); // == inline int operator==( SECURITY_STRING& r ); inline int operator==( CSecString& r ); //inline int operator==( PWCHAR r ); inline int operator==( PVOID pv ); // used to compare to NULL inline int IsEqual( PWCHAR r ); // < inline int operator<( SECURITY_STRING& r ); inline int operator<( CSecString& r ); inline int operator<( PWCHAR r ); // > inline int operator>( SECURITY_STRING& r ); inline int operator>( CSecString& r ); inline int operator>( PWCHAR r ); }; // // Destructor // inline CSecString::~CSecString() { Destructor(); } // // Constructors // inline CSecString::CSecString() { _iss = new CIntSecString; } inline CSecString::CSecString( CHAR *pc) { Constructor( pc ); } inline CSecString::CSecString( WCHAR *pwc ) { Constructor( pwc ); } inline CSecString::CSecString( CSecString& css ) { Constructor( css ); } inline CSecString::CSecString( SECURITY_STRING& ss ) { Constructor( ss ); } // // Some useful conversions // inline CSecString::operator PWCHAR () { return(_iss->_ssString.Buffer); } inline CSecString::operator SECURITY_STRING () { return(_iss->_ssString); } inline CSecString::operator PSECURITY_STRING () { return(&_iss->_ssString); } // // Access to elements // inline USHORT CSecString::GetLength() { return(_iss->_ssString.Length); } inline USHORT CSecString::GetMaximumLength() { return(_iss->_ssString.MaximumLength); } inline PWCHAR CSecString::GetBuffer() { return(_iss->_ssString.Buffer); } // // Finally, some operators // // & // This is a neat idea, but it's too strange for the '&' operator to return // anything but "pointer to CSecString". //inline PSECURITY_STRING operator&() //{ // return(&_iss->_ssString); //} // = inline CSecString& CSecString::operator=( PWCHAR r ) { Destructor(); // destroy this. Constructor( r ); return(*this); } inline CSecString& CSecString::operator=( CSecString& r ) { Destructor(); // destroy this. Constructor( r ); return(*this); } inline CSecString& CSecString::operator=( SECURITY_STRING& r ) { Destructor(); // destroy this. Constructor( r ); return(*this); } // == inline int CSecString::operator==( SECURITY_STRING& r ) { return( SRtlCompareString( &_iss->_ssString, &r, SRTL_CASE_INSENSITIVE) == 0 ); } inline int CSecString::operator==( CSecString& r ) { return( SRtlCompareString( &_iss->_ssString, &r._iss->_ssString, SRTL_CASE_INSENSITIVE) == 0 ); } inline int CSecString::IsEqual( PWCHAR r ) { return( wcsnicmp(_iss->_ssString.Buffer, r, _iss->_ssString.Length ) == 0 ); } inline int CSecString::operator==( PVOID pv ) { return((PVOID)_iss == pv); } // < inline int CSecString::operator<( SECURITY_STRING& r ) { return( SRtlCompareString( &_iss->_ssString, &r, SRTL_CASE_INSENSITIVE) < 0 ); } inline int CSecString::operator<( CSecString& r ) { return( SRtlCompareString( &_iss->_ssString, &r._iss->_ssString, SRTL_CASE_INSENSITIVE) < 0 ); } inline int CSecString::operator<( PWCHAR r ) { return( wcsnicmp(_iss->_ssString.Buffer, r, _iss->_ssString.Length ) < 0 ); } // > inline int CSecString::operator>( SECURITY_STRING& r ) { return( SRtlCompareString( &_iss->_ssString, &r, SRTL_CASE_INSENSITIVE) > 0 ); } inline int CSecString::operator>( CSecString& r ) { return( SRtlCompareString( &_iss->_ssString, &r._iss->_ssString, SRTL_CASE_INSENSITIVE) > 0 ); } inline int CSecString::operator>( PWCHAR r ) { return( wcsnicmp(_iss->_ssString.Buffer, r, _iss->_ssString.Length ) > 0 ); } #endif // _INC_SECSTR_HXX