CmpQueryNameString

NTSTATUS __stdcall CmpQueryNameString(PVOID FileHandle, UNICODE_STRING *NameStr){
  NTSTATUS result; 
  NTSTATUS v4; 
  UINT64 i; 
  VOID **PoolWithTag; 
  _UNICODE_STRING *v7; 
  NTSTATUS v8; 
  UINT64 Length; 
  wchar_t *StringRoutine; 
  NTSTATUS appended; 
  unsigned __int16 v12; 
  wchar_t *Buffer; 
  UINT64 ReturnLength; 
  VOID *Object; 

  LODWORD(ReturnLength) = 0;
  Object = 0i64;
  result = ObReferenceObjectByHandle(
             FileHandle,
             1ui64,
             (_OBJECT_TYPE *)**(&CmpDummyThreadEvent + 344),
             0,
             &Object,
             0i64);
  v4 = result;
  if( result >= 0 )
  {
    for( i = 272i64; ; i = (unsigned int)ReturnLength )
    {
      PoolWithTag = ExAllocatePoolWithTag(1ui64, i, 1649626435i64);
      v7 = (_UNICODE_STRING *)PoolWithTag;
      if( !PoolWithTag )
        break;
      v8 = ObQueryNameStringMode(Object, (_OBJECT_NAME_INFORMATION *)PoolWithTag, (unsigned int)i, &ReturnLength, 0);
      v4 = v8;
      if( v8 >= 0 )
      {
        NameStr->Length = 0;
        Length = v7->Length;
        NameStr->MaximumLength = v7->Length;
        StringRoutine = (wchar_t *)ExpAllocateStringRoutine(Length);
        NameStr->Buffer = StringRoutine;
        if( StringRoutine )
        {
          appended = RtlAppendUnicodeStringToString(NameStr, v7);
          v12 = NameStr->Length;
          v4 = appended;
          if( NameStr->Length )
          {
            Buffer = NameStr->Buffer;
            do
            {
              if( Buffer[((unsigned __int64)v12 >> 1) - 1] )
                break;
              v12 -= 2;
              NameStr->Length = v12;
            }
            while( v12 );
          }
        }
        else
        {
          v4 = -1073741801;
        }
LABEL_9:
        if( v7 )
          ExFreePoolWithTag(v7, 0);
        break;
      }
      if( v8 != -2147483643 || (unsigned int)ReturnLength <= (unsigned int)i )
        goto LABEL_9;
      ExFreePoolWithTag(v7, 0);
    }
    HalPutDmaAdapter((PADAPTER_OBJECT)Object);
    return v4;
  }
  return result;
}

Referenced by:

CmKtmNotification
CmpAddRemoveRMLogContainer
CmpInitCmRM
CmpStartRMLog
CmpTraceHiveMountBaseFileMounted
CmpTraceHiveRestoreStart