CmpQueryNameString

NTSTATUS __stdcall CmpQueryNameString(PVOID FileHandle, UNICODE_STRING *NameStr){
  NTSTATUS result; 
  NTSTATUS v4; 
  UINT64 i; 
  OBJECT_NAME_INFORMATION *PoolWithTag; 
  UNICODE_STRING *p_Name; 
  int v8; 
  UINT64 Length; 
  wchar_t *StringRoutine; 
  NTSTATUS appended; 
  unsigned __int16 v12; 
  wchar_t *Buffer; 
  UINT64 ReturnLength; 
  PADAPTER_OBJECT DmaAdapter; 
  LODWORD(ReturnLength) = 0;
  DmaAdapter = 0i64;
  result = ObReferenceObjectByHandle(FileHandle, 1u, *(POBJECT_TYPE *)CmIoFileObjectType, 0, (PVOID *)&DmaAdapter, 0i64);
  v4 = result;
  if( result >= 0 )
  {
    for( i = 272i64; ; i = (unsigned int)ReturnLength )
    {
      PoolWithTag = (OBJECT_NAME_INFORMATION *)ExAllocatePoolWithTag(PagedPool, i, 0x62534D43ui64);
      p_Name = &PoolWithTag->Name;
      if( !PoolWithTag )
        break;
      v8 = ObQueryNameStringMode(DmaAdapter, PoolWithTag, (unsigned int)i, &ReturnLength, 0);
      v4 = v8;
      if( v8 >= 0 )
      {
        NameStr->Length = 0;
        Length = p_Name->Length;
        NameStr->MaximumLength = p_Name->Length;
        StringRoutine = (wchar_t *)ExpAllocateStringRoutine(Length);
        NameStr->Buffer = StringRoutine;
        if( StringRoutine )
        {
          appended = RtlAppendUnicodeStringToString(NameStr, p_Name);
          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( p_Name )
          ExFreePoolWithTag(p_Name, 0);
        break;
      }
      if( v8 != -2147483643 || (unsigned int)ReturnLength <= (unsigned int)i )
        goto LABEL_9;
      ExFreePoolWithTag(p_Name, 0);
    }
    HalPutDmaAdapter(DmaAdapter);
    return v4;
  }
  return result;
}

Referenced by:

CmKtmNotification
CmpAddRemoveRMLogContainer
CmpInitCmRM
CmpStartRMLog
CmpTraceHiveMountBaseFileMounted
CmpTraceHiveRestoreStart