/*++ Copyright (c) 1995 Microsoft Corporation Module Name: String.hxx Abstract: Inline Helper functions for DUALSTRINGARRAY's Author: Mario Goertzel [MarioGo] Revision History: MarioGo 02-22-95 Bits 'n pieces --*/ #ifndef __STRING_HXX #define __STRING_HXX // // CDualStringArray -- a refcounted wrapper object for DUALSTRINGARRAY's // class CDualStringArray { public: CDualStringArray( DUALSTRINGARRAY *pdsa ) { ASSERT(pdsa); _cRef = 1; _pdsa = pdsa; } ~CDualStringArray(); DWORD AddRef(); DWORD Release(); DUALSTRINGARRAY* DSA() { ASSERT(_pdsa); return _pdsa; }; private: DUALSTRINGARRAY* _pdsa; LONG _cRef; }; inline void dsaCopy(DUALSTRINGARRAY *pdsaDest, DUALSTRINGARRAY *pdsaSrc) { pdsaDest->wNumEntries = pdsaSrc->wNumEntries; pdsaDest->wSecurityOffset = pdsaSrc->wSecurityOffset; OrMemoryCopy(pdsaDest->aStringArray, pdsaSrc->aStringArray, pdsaSrc->wNumEntries*sizeof(USHORT)); } HRESULT dsaAllocateAndCopy(DUALSTRINGARRAY** ppdsaDest, DUALSTRINGARRAY* pdsaSrc); inline BOOL dsaValid(DUALSTRINGARRAY *pdsa) { DWORD reason = 1; // keep track of what was wrong with the string using the // reason variable so a diagnostic message can be printed if ( pdsa && (reason++, pdsa->wNumEntries >= 4) && (reason++, FALSE == IsBadWritePtr(pdsa->aStringArray, pdsa->wNumEntries * sizeof(WCHAR))) && (reason++, pdsa->wSecurityOffset <= (pdsa->wNumEntries - 2)) && (reason++, pdsa->aStringArray[(pdsa->wNumEntries - 1)] == 0) && (reason++, pdsa->aStringArray[(pdsa->wNumEntries - 2)] == 0) && (reason++, pdsa->aStringArray[(pdsa->wSecurityOffset - 1)] == 0) && (reason++, pdsa->aStringArray[(pdsa->wSecurityOffset - 2)] == 0) ) { return(TRUE); } KdPrintEx((DPFLTR_DCOMSS_ID, DPFLTR_WARNING_LEVEL, "OR::dsaValid: string at 0x%x is invalid for reason %d\n", pdsa, reason)); return(FALSE); } inline DWORD dsaHash(DUALSTRINGARRAY *pdsa) // PERF WORK: Make sure the hash looks good in real world usage. { int i, count; DWORD hash, t; count = i = hash = pdsa->wNumEntries; hash |= pdsa->wSecurityOffset << 16; for(count = 0; count < i/2; count++) { t = *(PDWORD)&pdsa->aStringArray[count * 2]; hash += hash ^ t; } // we may miss the last word, but it is null anyway. return(hash); } inline DWORD dsaCompare(DUALSTRINGARRAY *pdsa, DUALSTRINGARRAY *pdsa2) { return ( pdsa->wNumEntries == pdsa2->wNumEntries && pdsa->wSecurityOffset == pdsa2->wSecurityOffset && 0 == OrMemoryCompare(pdsa->aStringArray, pdsa2->aStringArray, pdsa->wNumEntries * sizeof(WCHAR)) ); } inline PWSTR OrStringSearch(PWSTR string, USHORT value) { // Faster and smaller then wcschr() for value == 0 if (value == 0) { while(*string) string++; return(string); } return(wcschr(string, value)); } RPC_BINDING_HANDLE GetBinding( IN PWSTR pCompressedBinding ); RPC_BINDING_HANDLE GetBindingToOr( IN PWSTR pCompressedBinding ); DUALSTRINGARRAY *GetStringBinding( IN PWSTR pwstrCompressed, IN PWSTR pwstrSecurityBindings ); ORSTATUS ConvertToRemote( IN DUALSTRINGARRAY *psaLocal, OUT DUALSTRINGARRAY **ppsaRemote ); DUALSTRINGARRAY *CompressStringArrayAndAddIPAddrs( IN DUALSTRINGARRAY *psaExpanded ); USHORT FindMatchingProtseq( IN USHORT cClientProtseqs, IN USHORT aClientProtseqs[], IN PWSTR pwstrServerBindings ); PWSTR FindMatchingProtseq( IN USHORT protseq, IN PWSTR pswstrBindings ); PWSTR FindMatchingProtseq( IN PWSTR pMachine, IN USHORT protseq, IN PWSTR pwstrCompressedBindings ); PWSTR ExtractMachineName(WCHAR *pSB); RPC_BINDING_HANDLE TestBindingGetHandle( IN PWSTR pwstrCompressedBinding ); #endif // __STRING_HXX