VrpHandleIoctlCreateNamespaceNode

NTSTATUS __stdcall VrpHandleIoctlCreateNamespaceNode(PVOID Data, UINT64 DataLength, INT8 RequestorMode){
  unsigned int v3; 
  UINT64 *v5; 
  int v6; 
  INT64 v7; 
  int v8; 
  int v9; 
  unsigned int v10; 
  unsigned int v11; 
  NTSTATUS JobSilo; 
  int v13; 
  unsigned __int64 v14; 
  int v15; 
  WCHAR *v16; 
  SIZE_T v17; 
  WCHAR *v18; 
  int v19; 
  SIZE_T Tag; 
  INT64 Taga; 
  WCHAR *v23; 
  INT64 v24; 
  CHAR **v25; 
  WCHAR *v26; 
  PWCHAR FullPath; 
  UINT64 v28; 
  VOID *v29[2]; 
  UNICODE_STRING v30; 
  _EJOB *Silo; 
  INT64 v32; 
  PVOID Object; 
  Object = 0i64;
  FullPath = 0i64;
  v3 = DataLength;
  v32 = 0i64;
  Silo = 0i64;
  v5 = 0i64;
  v6 = 0;
  v7 = 0i64;
  v30 = 0i64;
  *(_OWORD *)v29 = 0i64;
  if( (unsigned int)DataLength < 0x18 )
    return -1073741811;
  v8 = *((unsigned __int16 *)Data + 4);
  if( (v8 & 1) != 0 || (v9 = *((unsigned __int16 *)Data + 5), (v9 & 1) != 0) )
  {
    JobSilo = -1073741811;
    goto LABEL_25;
  }
  if( !(_WORD)v8 )
    return -1073741811;
  if( !(_WORD)v9 )
    return -1073741811;
  v10 = v8 + 20;
  v11 = v10 + v9;
  if( v10 > v11 || v3 < v11 )
    return -1073741811;
  JobSilo = ObReferenceObjectByHandleWithTag(
              *(HANDLE *)Data,
              6u,
              (POBJECT_TYPE)PsJobType,
              RequestorMode,
              0x52566D43u,
              &Object,
              0i64);
  if( JobSilo < 0 )
    goto LABEL_19;
  v13 = *((_DWORD *)Data + 3);
  v30.Buffer = (wchar_t *)((char *)Data + 20);
  v14 = *((unsigned __int16 *)Data + 4);
  v30.MaximumLength = v14;
  v30.Length = v14;
  v29[1] = (char *)Data + 2 * (v14 >> 1) + 20;
  LOWORD(v14) = *((_WORD *)Data + 5);
  v15 = *((_DWORD *)Data + 4);
  WORD1(v29[0]) = v14;
  LOWORD(v29[0]) = v14;
  if( (v13 & 7) == v13 )
  {
    JobSilo = PsGetJobSilo((_EJOB *)Object, &Silo);
    if( JobSilo < 0 )
      goto LABEL_19;
    if( !PsIsThreadInSilo((__int64)KeGetCurrentThread(), (__int64)Silo) )
    {
      v28 = 0i64;
      VRegEnabledInJob(&v28);
      JobSilo = PsGetPermanentSiloContext(Silo, (unsigned int)VrpSiloContextSlot, (PVOID *)&FullPath);
      if( JobSilo < 0 )
        goto LABEL_19;
      v5 = (UINT64 *)FullPath;
      VrpLockJobContextExclusive(
        FullPath,
        v16,
        v17,
        v18,
        Tag,
        v23,
        (SIZE_T)v25,
        v26,
        (SIZE_T)FullPath,
        v28,
        (PWCHAR)v29[0]);
      LODWORD(v24) = v15;
      LODWORD(Taga) = v13;
      v6 = 1;
      v19 = VrpCreateNamespaceNode((INT64)v5, &v30, (VOID *)v28, (const VOID **)v29, Taga, v24, (CHAR **)&v32);
      v7 = v32;
      JobSilo = v19;
      if( v19 >= 0 )
      {
        JobSilo = VrpAddNamespaceNodeToList(v5, (UNICODE_STRING *)v32);
        if( JobSilo >= 0 )
        {
          JobSilo = VrpCreateNamespaceNodePlaceholderKey(v7);
          if( JobSilo >= 0 )
          {
            JobSilo = 0;
LABEL_18:
            VrpUnlockJobContextExclusive((INT64)v5);
            goto LABEL_19;
          }
        }
      }
LABEL_25:
      if( v7 )
        VrpDestroyNamespaceNode(v5, v7);
      if( !v6 )
        goto LABEL_19;
      goto LABEL_18;
    }
  }
  JobSilo = -1073741811;
LABEL_19:
  if( Object )
    ObfDereferenceObjectWithTag(Object, 0x52566D43ui64);
  return JobSilo;
}

Referenced by:

VrpIoctlDeviceDispatch