CmpVEAddHiveToSIDMappingTable

INT64 __stdcall CmpVEAddHiveToSIDMappingTable(_CMHIVE *CmHive, INT64 a2){
  unsigned __int16 *v4; 
  unsigned __int64 v5; 
  _WORD *v6; 
  unsigned __int16 MaximumLength; 
  unsigned __int16 Length; 
  INT64 result; 
  _UNICODE_STRING DestinationString; 

  DestinationString = 0i64;
  RtlInitUnicodeString(&DestinationString, 0i64);
  v4 = *(unsigned __int16 **)(a2 + 16);
  v5 = *((_QWORD *)v4 + 1);
  v6 = (_WORD *)(v5 + 2 * (((unsigned __int64)*v4 - 2) >> 1));
  if( *v6 != 92 )
  {
    MaximumLength = DestinationString.MaximumLength;
    Length = DestinationString.Length;
    do
    {
      --v6;
      Length += 2;
      MaximumLength += 2;
    }
    while( (unsigned __int64)v6 >= v5 && *v6 != 92 );
    DestinationString.MaximumLength = MaximumLength;
    DestinationString.Length = Length;
  }
  DestinationString.Buffer = v6 + 1;
  result = CmpAddStringToMapping(&DestinationString, CmHive);
  if( (int)result >= 0 )
  {
    CmHive->Flags |= 2u;
    return 0i64;
  }
  return result;
}

Referenced by:

CmpLoadKeyCommon