SdbMakeIndexKeyFromStringEx
UINT64 __fastcall SdbMakeIndexKeyFromStringEx(const WCHAR *szKey, UINT64 dwIndexFlags){
WCHAR v2;
unsigned __int64 v3;
char *v4;
UINT64 v5;
char *v7;
int v8;
const WCHAR *v9;
UNICODE_STRING *v10;
unsigned __int64 v11;
unsigned __int64 v12;
unsigned __int16 v13;
__int16 v14;
UNICODE_STRING v16;
struct _UNICODE_STRING DestinationString;
UNICODE_STRING SourceString;
char v19[16];
char v20;
v3 = -1i64;
v4 = (char *)&SourceString.MaximumLength + 5;
v5 = 0i64;
do
++v3;
while( szKey[v3] );
v7 = v19;
v8 = dwIndexFlags & 2;
DestinationString = 0i64;
SourceString = 0i64;
v16 = 0i64;
if( v3 > 8 && v8 )
v9 = &szKey[v3 - 8];
else
v9 = szKey;
RtlInitUnicodeString(&DestinationString, v9, v2);
SourceString.Buffer = (wchar_t *)&v20;
SourceString.MaximumLength = 16;
RtlCopyUnicodeString(&SourceString, &DestinationString, v10);
v16.MaximumLength = 16;
v16.Buffer = (wchar_t *)v19;
if( RtlUpcaseUnicodeString(&v16, &SourceString, 0) < 0 )
{
AslLogCallPrintf(1ui64, "SdbMakeIndexKeyFromStringEx", 0x4B9ui64, "Failed to upcase unicode string \"%ws\"", szKey);
return 0i64;
}
v11 = (unsigned __int64)v16.Length >> 1;
if( v11 > 8 )
return 0i64;
*(_QWORD *)&SourceString.Length = 0i64;
v12 = 0i64;
if( v11 )
{
do
{
v13 = *(_WORD *)v7;
v7 += 2;
*v4-- = v13;
v14 = HIBYTE(v13);
if( (_BYTE)v14 )
{
if( v12 < 7 )
{
*v4-- = v14;
++v12;
}
}
++v12;
}
while( v12 < v11 );
return *(_QWORD *)&SourceString.Length;
}
return v5;
}Referenced by:
SdbFindFirstStringIndexedTag