ObQueryNameStringMode

INT64 __stdcall ObQueryNameStringMode(
        VOID *Object,
        OBJECT_NAME_INFORMATION *ObjectNameInfo,
        UINT64 Length,
        UINT64 *ReturnLength,
        INT8 Mode){
  unsigned int v6; 
  INT64 *v9; 
  unsigned __int64 v10; 
  char *v11; 
  __int64(__fastcall *v12)(VOID *, unsigned __int64, OBJECT_NAME_INFORMATION *, _QWORD, UINT64 *, INT8); 
  _EJOB *CurrentSilo; 
  _DWORD *v15; 
  void **v16; 
  struct _DMA_ADAPTER *v17; 
  unsigned int v18; 
  _DWORD *v19; 
  char *v20; 
  INT64 *v21; 
  INT64 *v22; 
  OBJECT_NAME_INFORMATION *p_MaximumLength; 
  UINT64 v24; 
  UINT8 *v25; 
  UINT8 *v26; 
  UINT8 *v27; 
  struct _DMA_ADAPTER *v28; 
  UINT64 v29; 
  UINT8 *v30; 
  unsigned int v31; 
  INT64 *v32; 
  OBJECT_NAME_INFORMATION *v33; 
  char v34; 
  char v35; 
  int v36; 
  unsigned int v37; 
  struct _DMA_ADAPTER *DmaAdapter; 
  UINT8 *v39; 
  unsigned int v40; 
  unsigned int v41; 
  UINT8 *v42; 
  INT64 *Lock; 
  UINT8 **Locka; 
  _DWORD *v45; 
  _DWORD *v46; 
  UINT8 *v47; 
  _DWORD *v48; 
  void **v49; 
  _DWORD *v50; 
  INT64 *v51; 
  _ETHREAD *CurrentThread; 
  _ETHREAD *v53; 
  _ETHREAD *v54; 
  _ETHREAD *v55; 
  v6 = Length;
  v34 = 1;
  v35 = 0;
  v41 = 0;
  DmaAdapter = 0i64;
  v36 = -1073741823;
  v9 = (INT64 *)((char *)Object - 48);
  v10 = (unsigned __int8)ObHeaderCookie ^ (unsigned __int8)*((char *)Object - 24) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)((_WORD)Object - 48) >> 8);
  if( (*((char *)Object - 22) & 2) != 0 )
    v11 = (char *)v9 - *((unsigned __int8 *)ObpInfoMaskToOffset + (*((char *)Object - 22) & 3));
  else
    v11 = 0i64;
  v49 = (void **)v11;
  v12 = *(__int64(__fastcall **)(VOID *, unsigned __int64, OBJECT_NAME_INFORMATION *, _QWORD, UINT64 *, INT8))(ObTypeIndexTable[v10] + 160);
  if( v12 )
  {
    if( v11 && *((_WORD *)v11 + 4) )
      LOBYTE(v10) = 1;
    else
      v10 = 0i64;
    v36 = v12(Object, v10, ObjectNameInfo, (unsigned int)Length, ReturnLength, Mode);
LABEL_7:
    if( v36 >= 0 )
LABEL_8:
      *(_DWORD *)(&ObjectNameInfo->Name.MaximumLength + 1) = 0;
    return(unsigned int)v36;
  }
  CurrentSilo = PsGetCurrentSilo();
  v15 = OBP_GET_SILO_ROOT_DIRECTORY_FROM_SILO((__int64)CurrentSilo);
  v48 = v15;
  while( v11 )
  {
    if( Object != v15 && Object != ObpRootDirectoryObject )
    {
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      --*((_WORD *)CurrentThread + 242);
      ExAcquirePushLockSharedEx((UINT64)(v9 + 2), 0i64);
      v16 = v49;
      v17 = (struct _DMA_ADAPTER *)*v49;
      v45 = *v49;
      if( *v49 )
      {
        ObfReferenceObject(v17);
        DmaAdapter = v17;
        v16 = v49;
      }
      v37 = *((unsigned __int16 *)v16 + 4) + 2;
      if( _InterlockedCompareExchange64(v9 + 2, 0i64, 17i64) != 17 )
        ExfReleasePushLockShared(v9 + 2);
      KeAbPostRelease(v9 + 2);
      KeLeaveCriticalRegion();
      v18 = v37;
      v19 = v45;
      while( v19 != v48 && v19 != ObpRootDirectoryObject && v19 && (v19[84] & 0x20) == 0 )
      {
        v50 = v19 - 12;
        v53 = (_ETHREAD *)KeGetCurrentThread();
        --*((_WORD *)v53 + 242);
        Lock = (INT64 *)(v19 - 8);
        ExAcquirePushLockSharedEx((UINT64)Lock, 0i64);
        if( (*((_BYTE *)v50 + 26) & 2) == 0
          || (v20 = (char *)v50 - *((unsigned __int8 *)ObpInfoMaskToOffset + (*((_BYTE *)v50 + 26) & 3))) == 0i64
          || !*(_QWORD *)v20 )
        {
          v22 = Lock;
          if( _InterlockedCompareExchange64(Lock, 0i64, 17i64) != 17 )
          {
            ExfReleasePushLockShared(Lock);
            v22 = Lock;
          }
          KeAbPostRelease(v22);
          KeLeaveCriticalRegion();
          v18 = v37 + 8;
          break;
        }
        v37 += 2 + *((unsigned __int16 *)v20 + 4);
        v46 = *(_DWORD **)v20;
        ObfReferenceObject(*(PVOID *)v20);
        v21 = Lock;
        if( _InterlockedCompareExchange64(Lock, 0i64, 17i64) != 17 )
        {
          ExfReleasePushLockShared(Lock);
          v21 = Lock;
        }
        KeAbPostRelease(v21);
        KeLeaveCriticalRegion();
        HalPutDmaAdapter(DmaAdapter);
        v19 = v46;
        DmaAdapter = (struct _DMA_ADAPTER *)v46;
        v18 = v37;
        if( v37 > 0xFFFF )
          goto LABEL_37;
      }
      if( v18 <= 0xFFFF )
        goto LABEL_31;
LABEL_37:
      v36 = -1073741562;
      goto LABEL_33;
    }
    v18 = 2;
LABEL_31:
    v41 = v18 + 18;
    *(_DWORD *)ReturnLength = v18 + 18;
    if( v6 < v18 + 18 )
    {
      v36 = -1073741820;
LABEL_33:
      v34 = 0;
    }
    if( DmaAdapter )
    {
      HalPutDmaAdapter(DmaAdapter);
      DmaAdapter = 0i64;
    }
    if( !v34 )
      goto LABEL_7;
    if( (*((_BYTE *)v9 + 26) & 2) != 0 )
      v11 = (char *)v9 - *((unsigned __int8 *)ObpInfoMaskToOffset + (*((_BYTE *)v9 + 26) & 3));
    else
      v11 = 0i64;
    v49 = (void **)v11;
    if( !v11 )
      goto LABEL_91;
    p_MaximumLength = (OBJECT_NAME_INFORMATION *)((char *)ObjectNameInfo + v41 - 2);
    p_MaximumLength->Name.Length = 0;
    if( Object == v48 || Object == ObpRootDirectoryObject )
      goto LABEL_66;
    v24 = *((unsigned __int16 *)v11 + 4);
    v25 = (UINT8 *)p_MaximumLength - v24;
    v42 = v25;
    if( v25 > (UINT8 *)&ObjectNameInfo[1] )
    {
      memmove(v25, *((UINT8 **)v11 + 2), v24);
      v54 = (_ETHREAD *)KeGetCurrentThread();
      --*((_WORD *)v54 + 242);
      ExAcquirePushLockSharedEx((UINT64)(v9 + 2), 0i64);
      v26 = *(UINT8 **)v11;
      v47 = v26;
      if( v26 )
      {
        ObfReferenceObject(v26);
        DmaAdapter = (struct _DMA_ADAPTER *)v26;
      }
      if( _InterlockedCompareExchange64(v9 + 2, 0i64, 17i64) != 17 )
        ExfReleasePushLockShared(v9 + 2);
      KeAbPostRelease(v9 + 2);
      KeLeaveCriticalRegion();
      while( 1 )
      {
        if( v47 == (UINT8 *)v48 || v47 == ObpRootDirectoryObject || !v47 || (*((_DWORD *)v47 + 84) & 0x20) != 0 )
        {
          p_MaximumLength = (OBJECT_NAME_INFORMATION *)v42;
          goto LABEL_66;
        }
        v39 = v42 - 2;
        *((_WORD *)v42 - 1) = 92;
        v27 = v47 - 48;
        Locka = (*(v47 - 22) & 2) != 0 ? (UINT8 **)&v27[-*((unsigned __int8 *)ObpInfoMaskToOffset + (*(v47 - 22) & 3))] : 0i64;
        v55 = (_ETHREAD *)KeGetCurrentThread();
        --*((_WORD *)v55 + 242);
        v51 = (INT64 *)(v27 + 16);
        ExAcquirePushLockSharedEx((UINT64)(v27 + 16), 0i64);
        if( !Locka || !*Locka )
          break;
        HalPutDmaAdapter(DmaAdapter);
        v28 = (struct _DMA_ADAPTER *)*Locka;
        v47 = *Locka;
        ObfReferenceObject(*Locka);
        DmaAdapter = v28;
        v29 = *((unsigned __int16 *)Locka + 4);
        v42 = &v39[-v29];
        if( &v39[-v29] <= (UINT8 *)&ObjectNameInfo[1] )
        {
          v35 = 1;
          if( _InterlockedCompareExchange64(v51, 0i64, 17i64) != 17 )
            ExfReleasePushLockShared(v51);
          KeAbPostRelease(v51);
          KeLeaveCriticalRegion();
          goto LABEL_79;
        }
        memmove(&v39[-v29], Locka[2], v29);
        if( _InterlockedCompareExchange64(v51, 0i64, 17i64) != 17 )
          ExfReleasePushLockShared(v51);
        KeAbPostRelease(v51);
        KeLeaveCriticalRegion();
      }
      v32 = v51;
      if( _InterlockedCompareExchange64(v51, 0i64, 17i64) != 17 )
      {
        ExfReleasePushLockShared(v51);
        v32 = v51;
      }
      KeAbPostRelease(v32);
      KeLeaveCriticalRegion();
      p_MaximumLength = (OBJECT_NAME_INFORMATION *)(v42 - 8);
      v33 = (OBJECT_NAME_INFORMATION *)(v42 - 8);
      if( v42 - 8 < (UINT8 *)&ObjectNameInfo[1] )
      {
        p_MaximumLength = ObjectNameInfo + 1;
        v33 = ObjectNameInfo + 1;
      }
      *(_DWORD *)&p_MaximumLength->Name.Length = *(_DWORD *)L"...";
      *(&p_MaximumLength->Name.MaximumLength + 1) = asc_1407D3680[2];
      if( v33 == &ObjectNameInfo[1] )
        p_MaximumLength = (OBJECT_NAME_INFORMATION *)&v33->Name.MaximumLength;
LABEL_66:
      v30 = (UINT8 *)&p_MaximumLength[-1].Name.Buffer + 6;
      *(_WORD *)v30 = 92;
      v31 = (unsigned __int16)((_WORD)ObjectNameInfo + v41 - ((_WORD)p_MaximumLength - 2));
      v40 = v31;
      ObjectNameInfo->Name.MaximumLength = v31;
      ObjectNameInfo->Name.Length = v31 - 2;
      ObjectNameInfo->Name.Buffer = &ObjectNameInfo[1].Name.Length;
      if( &ObjectNameInfo[1] != (OBJECT_NAME_INFORMATION *)v30 )
      {
        memmove((UINT8 *)&ObjectNameInfo[1], v30, v31);
        *(_DWORD *)ReturnLength = v40 + 16;
      }
      goto LABEL_79;
    }
    v35 = 1;
LABEL_79:
    if( DmaAdapter )
      HalPutDmaAdapter(DmaAdapter);
    if( !v35 )
      goto LABEL_82;
    if( (*((_BYTE *)v9 + 26) & 2) != 0 )
      v11 = (char *)v9 - *((unsigned __int8 *)ObpInfoMaskToOffset + (*((_BYTE *)v9 + 26) & 3));
    else
      v11 = 0i64;
    v49 = (void **)v11;
    v35 = 0;
LABEL_91:
    v15 = v48;
  }
  *(_DWORD *)ReturnLength = 16;
  if( v6 >= 0x10 )
  {
    *(_DWORD *)&ObjectNameInfo->Name.Length = 0;
    ObjectNameInfo->Name.Buffer = 0i64;
LABEL_82:
    v36 = 0;
    goto LABEL_8;
  }
  return(unsigned int)-1073741820;
}

Referenced by:

AlpcpGetPortNameInformation
CmpQueryNameString
EtwpEnumerateAddressSpace
EtwpTraceHandle
IoGetDeviceProperty
IoRegisterDeviceInterface
IopErrorLogThread
IopGetRelatedFileName
IopGraftName
IopQueryNameInternal
IopRaiseHardError
MmGetFileNameForAddress
MmGetFileNameForSection
MmQueryVirtualMemory
NtQueryObject
ObGetObjectInformation
ObQueryNameString
PnpBuildCmResourceList
PspInitializeFullProcessImageName
SepQueryNameString
SmKmFileInfoGetPath
SmKmStoreFileOpenVolume