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