ObpCreateSymbolicLinkName

void __fastcall ObpCreateSymbolicLinkName(__int64 a1){
  __int64 v1; 
  char v2; 
  __int64 v4; 
  UINT16 *v5; 
  UINT16 v6; 
  CHAR **v7; 
  __int16 v8; 
  char v9; 
  char v10; 
  _EJOB *CurrentSilo; 
  CHAR *v12; 
  UNICODE_STRING v13; 
  __int64 *CurrentServerSiloGlobals; 
  CHAR *v15; 
  unsigned __int16 Length; 
  wchar_t *v17; 
  wchar_t *Buffer; 
  char *v19; 
  char *v20; 
  _OBJECT_TYPE *v21; 
  char v22; 
  __int64 v23; 
  unsigned int v24; 
  _ETHREAD *CurrentThread; 
  __int64 v26; 
  int v27; 
  bool v28; 
  UNICODE_STRING v29; 
  UNICODE_STRING v30; 
  INT64 v31[2]; 
  __int64 v32; 
  int v33; 
  __int16 v34; 
  __int16 v35; 
  int v36; 
  int v37; 
  int v39; 
  CHAR *v40; 
  PADAPTER_OBJECT DmaAdapter; 
  v1 = a1 - 48;
  v32 = 0i64;
  v2 = *(_BYTE *)(a1 - 48 + 26);
  v33 = 0;
  v34 = 0;
  v39 = 64;
  v37 = 0;
  if( (v2 & 2) != 0 )
    v4 = v1 - *((unsigned __int8 *)ObpInfoMaskToOffset + (v2 & 3));
  else
    v4 = 0i64;
  if( !v4 )
    return;
  if( !*(_QWORD *)(*(_QWORD *)v4 + 304i64) )
    return;
  if( *(_WORD *)(v4 + 8) != 4 )
    return;
  v5 = *(UINT16 **)(v4 + 16);
  if( v5[1] != 58 )
    return;
  v6 = NLS_UPCASE(*v5);
  if( (unsigned __int16)(v6 - 65) > 0x19u )
    return;
  v35 = v8;
  *(_DWORD *)(a1 + 24) = v6 - 64;
  v9 = v8;
  v10 = v8;
  v40 = *v7;
  *(_OWORD *)v31 = 0i64;
  v36 = -60876;
  CurrentSilo = PsGetCurrentSilo();
  DmaAdapter = (PADAPTER_OBJECT)OBP_GET_SILO_ROOT_DIRECTORY_FROM_SILO((__int64)CurrentSilo);
  v12 = (CHAR *)DmaAdapter;
  ObfReferenceObject(DmaAdapter);
  v13 = *(UNICODE_STRING *)(a1 + 8);
  v29 = v13;
  CurrentServerSiloGlobals = PsGetCurrentServerSiloGlobals();
  while( 1 )
  {
    v15 = v12;
    if( (_mm_cvtsi128_si32(_mm_srli_si128((__m128i)v13, 8)) & 7) != 0 || !*(_QWORD *)*CurrentServerSiloGlobals )
    {
      Length = v29.Length;
LABEL_48:
      Buffer = v29.Buffer;
      goto LABEL_15;
    }
    Length = _mm_cvtsi128_si32((__m128i)v13);
    v29.Length = Length;
    if( Length < 8u )
      goto LABEL_48;
    v17 = (wchar_t *)_mm_srli_si128((__m128i)v13, 8).m128i_u64[0];
    Buffer = v17;
    if( *(_QWORD *)v17 == ObpDosDevicesShortNamePrefix )
    {
      Buffer = v17 + 4;
      Length -= 8;
      v29.Buffer = v17 + 4;
      v29.Length = Length;
      v15 = *(CHAR **)*CurrentServerSiloGlobals;
      v13 = v29;
    }
    while( 1 )
    {
LABEL_15:
      if( *Buffer == 92 )
      {
        ++Buffer;
        Length -= 2;
        v29.Buffer = Buffer;
        v29.Length = Length;
        v13 = v29;
      }
      v30 = v13;
      if( Length )
      {
        do
        {
          if( *Buffer == 92 )
            break;
          ++Buffer;
          v28 = Length == 2;
          Length -= 2;
          v29.Length = Length;
        }
        while( !v28 );
        v29.Buffer = Buffer;
        v13 = v29;
      }
      v30.Length -= Length;
      if( !v30.Length )
        goto LABEL_42;
      if( v15 == v40 )
      {
        v35 = 257;
      }
      else
      {
        v9 = 0;
        v10 = 0;
      }
      v19 = (char *)ObpLookupDirectoryEntryEx(v15, &v30, 0, 0, 0, (INT64)v31);
      v20 = v19;
      if( v15 == v40 )
      {
        LOBYTE(v35) = v9;
        HIBYTE(v35) = v10;
      }
      else
      {
        v10 = HIBYTE(v35);
        v9 = v35;
      }
      if( !v19 )
        goto LABEL_30;
      v21 = (_OBJECT_TYPE *)ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ (unsigned __int8)*(v19 - 24) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)((_WORD)v19 - 48) >> 8)];
      if( v21 != ObpDirectoryObjectType )
        break;
      v15 = v20;
    }
    if( v21 != ObpSymbolicLinkObjectType || *((_DWORD *)v20 + 6) )
      break;
    if( !v39 )
    {
      v20 = 0i64;
      break;
    }
    v13 = *(UNICODE_STRING *)(v20 + 8);
    v12 = (CHAR *)DmaAdapter;
    --v39;
    v29 = v13;
  }
LABEL_30:
  v22 = 1;
  v23 = *(_QWORD *)(*(_QWORD *)(v1 - *((unsigned __int8 *)ObpInfoMaskToOffset + (*(_BYTE *)(v1 + 26) & 3))) + 304i64);
  if( v20
    && ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ (unsigned __int8)*(v20 - 24) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)((_WORD)v20 - 48) >> 8)] == IoDeviceObjectType )
  {
    v24 = *((_DWORD *)v20 + 18);
    if( v24 <= 0x13 )
    {
      if( v24 < 0x12 )
      {
        if( v24 < 2 )
          goto LABEL_44;
        if( v24 <= 3 )
        {
          v22 = 5;
          goto LABEL_39;
        }
        if( v24 <= 6 )
          goto LABEL_44;
        if( v24 <= 9 )
        {
          v22 = ((*((_DWORD *)v20 + 13) & 1) == 0) + 2;
          goto LABEL_39;
        }
        v28 = v24 == 16;
LABEL_59:
        if( v28 )
          goto LABEL_60;
LABEL_44:
        v22 = 0;
        goto LABEL_39;
      }
LABEL_60:
      v22 = 4;
      goto LABEL_39;
    }
    if( v24 == 20 )
      goto LABEL_60;
    if( v24 != 36 )
    {
      v28 = v24 == 40;
      goto LABEL_59;
    }
    v22 = 6;
  }
LABEL_39:
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 243);
  ExAcquirePushLockExclusiveEx((UINT64)(CurrentServerSiloGlobals + 15), 0i64);
  v26 = (unsigned int)(*(_DWORD *)(a1 + 24) - 1);
  v27 = 1 << (*(_BYTE *)(a1 + 24) - 1);
  *(_BYTE *)(v26 + v23 + 32) = v22;
  *(_DWORD *)(v23 + 28) |= v27;
  if( v23 == *CurrentServerSiloGlobals )
    *((_DWORD *)CurrentServerSiloGlobals + 2) |= v27;
  else
    ++*((_DWORD *)CurrentServerSiloGlobals + v26 + 3);
  ExReleasePushLockEx((UINT64)(CurrentServerSiloGlobals + 15), 0i64);
  KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
LABEL_42:
  ObpReleaseLookupContext((INT64)v31);
  HalPutDmaAdapter(DmaAdapter);
}

Referenced by:

ObpCreateHandle