RegRtlQueryKeyPathName

__int64 __fastcall RegRtlQueryKeyPathName(char *a1, const VOID **a2, size_t *a3, INT64 a4){
  VOID *v6; 
  unsigned __int64 v7; 
  const VOID **v8; 
  UINT64 v9; 
  VOID *v10; 
  NTSTATUS v11; 
  NTSTATUS v12; 
  size_t v13; 
  size_t v14; 
  unsigned int v16; 
  const VOID **PoolWithTag; 
  NTSTATUS v18; 
  size_t v19; 
  size_t v20; 
  UINT64 *ReturnLength; 
  INT64 v22; 
  VOID *Handle; 
  __int128 v24; 
  UINT64 ulMinuend; 
  UINT64 pulResult; 

  Handle = 0i64;
  LODWORD(pulResult) = 0;
  LODWORD(ulMinuend) = 0;
  v6 = a1;
  v24 = 0i64;
  if( (unsigned __int64)(a1 + 0x80000000) > 7
    || (v12 = RegRtlOpenPredefinedKey(a1, &Handle, (INT64)a3, a4, (INT64)ReturnLength, v22, (INT64)Handle, v24), v12 >= 0) )
  {
    v7 = 2i64 * *a3;
    if( v7 > 0xFFFFFFFF )
    {
      v12 = -1073741675;
      goto LABEL_12;
    }
    v8 = (const VOID **)&v24;
    v9 = 16i64;
    v10 = v6;
    if( (unsigned int)v7 >= 0x10 )
      v8 = a2;
    if( (unsigned int)v7 >= 0x10 )
      v9 = (unsigned int)v7;
    if( Handle )
      v10 = Handle;
    v11 = ZwQueryObject(v10, ObjectNameInformation, v8, v9, &ulMinuend);
    v12 = v11;
    if( !v11 )
    {
      v13 = *(unsigned __int16 *)v8;
      v14 = v13 + 2;
      *a3 = (v13 + 2) >> 1;
      if( (unsigned int)v7 >= v13 + 2 )
      {
        memmove(a2, v8[1], v13);
        *((_WORD *)a2 + ((unsigned __int64)v14 >> 1) - 1) = 0;
        goto LABEL_12;
      }
      goto LABEL_19;
    }
    if( v11 == -1073741820 )
    {
      v12 = RtlULongSub((unsigned int)ulMinuend, 0x10ui64, &pulResult);
      if( v12 >= 0 )
      {
        if( (unsigned int)v7 < (unsigned int)pulResult )
        {
          *a3 = (unsigned int)pulResult >> 1;
LABEL_19:
          v12 = -1073741789;
          goto LABEL_12;
        }
        PoolWithTag = (const VOID **)ExAllocatePoolWithTag(1ui64, v16, 1279739218i64);
        if( PoolWithTag )
        {
          if( Handle )
            v6 = Handle;
          v18 = ZwQueryObject(v6, ObjectNameInformation, PoolWithTag, (unsigned int)ulMinuend, &ulMinuend);
          v12 = v18;
          if( v18 >= 0 )
          {
            if( v18 )
            {
              v12 = -1073741595;
            }
            else
            {
              v19 = *(unsigned __int16 *)PoolWithTag;
              v20 = v19 + 2;
              *a3 = (v19 + 2) >> 1;
              if( (unsigned int)v7 < v19 + 2 )
              {
                v12 = -1073741789;
              }
              else
              {
                memmove(a2, PoolWithTag[1], v19);
                *((_WORD *)a2 + ((unsigned __int64)v20 >> 1) - 1) = 0;
              }
            }
          }
          ExFreePoolWithTag(PoolWithTag, 0);
        }
        else
        {
          v12 = -1073741801;
        }
      }
    }
    else if( v11 >= 0 )
    {
      v12 = -1073741595;
    }
  }
LABEL_12:
  if( Handle )
    ZwClose((_HANDLE)Handle);
  return(unsigned int)v12;
}

Referenced by:

PnpCtxRegQueryKeyPathName