CmpNameFromAttributes

NTSTATUS __stdcall CmpNameFromAttributes(OBJECT_ATTRIBUTES *Attributes, INT8 PreviousMode, UNICODE_STRING *FullName){
  NTSTATUS v4; 
  unsigned __int16 v5; 
  wchar_t *PoolWithQuotaTag; 
  NTSTATUS result; 
  int v8; 
  __m128i v9; 
  unsigned int v10; 
  wchar_t *v11; 
  __int64 Length; 
  wchar_t *Buffer; 
  UINT64 ReturnLength; 
  VOID *Src[2]; 
  UNICODE_STRING *v16; 
  _UNICODE_STRING Source; 
  OBJECT_ATTRIBUTES Handle; 
  _UNICODE_STRING ObjectInformation; 

  v16 = FullName;
  Source = 0i64;
  v4 = 0;
  ReturnLength = 0i64;
  FullName->Buffer = 0i64;
  if( PreviousMode == 1 && ((unsigned __int8)Attributes & 3) != 0 )
    ExRaiseDatatypeMisalignment();
  Handle = *Attributes;
  *(_UNICODE_STRING *)Src = *Handle.ObjectName;
  if( PreviousMode == 1 )
  {
    v5 = (unsigned __int16)Src[0];
    if( LOWORD(Src[0]) )
    {
      if( ((__int64)Src[1] & 1) != 0 )
        ExRaiseDatatypeMisalignment();
      if( (char *)Src[1] + LOWORD(Src[0]) > (VOID *)0x7FFFFFFF0000i64 || (char *)Src[1] + LOWORD(Src[0]) < Src[1] )
        MEMORY[0x7FFFFFFF0000] = 0;
    }
  }
  else
  {
    v5 = (unsigned __int16)Src[0];
  }
  if( (v5 & 1) != 0 )
    return -1073741765;
  if( !Handle.RootDirectory )
  {
    if( !v5 )
      return -1073741765;
    FullName->Length = v5;
    FullName->MaximumLength = v5;
    PoolWithQuotaTag = (wchar_t *)ExAllocatePoolWithQuotaTag((POOL_TYPE)9, v5, 0x6E664D43ui64);
    FullName->Buffer = PoolWithQuotaTag;
    if( !PoolWithQuotaTag )
      return -1073741670;
    memmove(PoolWithQuotaTag, Src[1], v5);
    return v4;
  }
  if( SLODWORD(Handle.RootDirectory) < 0 && PreviousMode == 1 )
    return -1073741816;
  if( Src[1] && v5 >= 2u && *(_WORD *)Src[1] == 92 )
    return -1073741765;
  result = IoConvertFileHandleToKernelHandle(Handle.RootDirectory, PreviousMode, 0x20ui64, 1u, &Handle.RootDirectory);
  if( result >= 0 )
  {
    v8 = ZwQueryObject(Handle.RootDirectory, ObjectNameInformation, &ObjectInformation, 0x200ui64, &ReturnLength);
    ZwClose((_HANDLE)Handle.RootDirectory);
    if( v8 < 0 )
      return v8;
    v9 = (__m128i)ObjectInformation;
    Source = ObjectInformation;
    FullName->Length = 0;
    v10 = (unsigned __int16)_mm_cvtsi128_si32(v9) + 2 + v5;
    HIDWORD(ReturnLength) = v10;
    if( v10 > 0xFFFF )
      return -1073741767;
    FullName->MaximumLength = v10;
    v11 = (wchar_t *)ExAllocatePoolWithQuotaTag((POOL_TYPE)9, (unsigned __int16)v10, 0x6E664D43ui64);
    FullName->Buffer = v11;
    if( !v11 )
      return -1073741670;
    RtlAppendUnicodeStringToString(FullName, &Source);
    Length = FullName->Length;
    if( (_WORD)Length )
    {
      Buffer = FullName->Buffer;
      if( *(wchar_t *)((char *)Buffer + Length - 2) != 92 )
      {
        *(wchar_t *)((char *)Buffer + Length) = 92;
        FullName->Length += 2;
      }
    }
    return RtlAppendUnicodeStringToString(FullName, (_UNICODE_STRING *)Src);
  }
  return result;
}

Referenced by:

CmLoadDifferencingKey
NtReplaceKey