132 lines
3.0 KiB
C++
132 lines
3.0 KiB
C++
/*++
|
|
|
|
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
|
|
|
|
inline void dsaCopy(DUALSTRINGARRAY *pdsaDest, DUALSTRINGARRAY *pdsaSrc)
|
|
{
|
|
pdsaDest->wNumEntries = pdsaSrc->wNumEntries;
|
|
pdsaDest->wSecurityOffset = pdsaSrc->wSecurityOffset;
|
|
OrMemoryCopy(pdsaDest->aStringArray,
|
|
pdsaSrc->aStringArray,
|
|
pdsaSrc->wNumEntries*sizeof(USHORT));
|
|
}
|
|
|
|
inline BOOL dsaValid(DUALSTRINGARRAY *pdsa)
|
|
{
|
|
if ( pdsa
|
|
&& pdsa->wNumEntries >= 4
|
|
&& FALSE == IsBadWritePtr(pdsa->aStringArray, pdsa->wNumEntries * sizeof(WCHAR))
|
|
&& pdsa->wSecurityOffset <= (pdsa->wNumEntries - 2)
|
|
&& pdsa->aStringArray[(pdsa->wNumEntries - 1)] == 0
|
|
&& pdsa->aStringArray[(pdsa->wNumEntries - 2)] == 0
|
|
&& pdsa->aStringArray[(pdsa->wSecurityOffset - 1)] == 0
|
|
&& pdsa->aStringArray[(pdsa->wSecurityOffset - 2)] == 0
|
|
)
|
|
{
|
|
return(TRUE);
|
|
}
|
|
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 *CompressStringArray(
|
|
IN DUALSTRINGARRAY *psaExpanded
|
|
);
|
|
|
|
USHORT FindMatchingProtseq(
|
|
IN USHORT cClientProtseqs,
|
|
IN USHORT aClientProtseqs[],
|
|
IN PWSTR pwstrServerBindings
|
|
);
|
|
|
|
PWSTR FindMatchingProtseq(
|
|
IN USHORT protseq,
|
|
IN PWSTR pswstrBindings
|
|
);
|
|
|
|
BOOL TestBinding(
|
|
IN PWSTR pwstrCompressedBinding
|
|
);
|
|
|
|
#endif // __STRING_HXX
|
|
|