VrpHandleIoctlInitializeJobForVreg

NTSTATUS __stdcall VrpHandleIoctlInitializeJobForVreg(PVOID Data, UINT64 DataLength, INT8 RequestorMode){
  int v3; 
  UNICODE_STRING *v4; 
  struct _DMA_ADAPTER *RootKeyObjectForSilo; 
  _EJOB *v6; 
  NTSTATUS JobSilo; 
  _QWORD *v8; 
  WCHAR *v9; 
  SIZE_T v10; 
  WCHAR *v11; 
  int NamespaceNode; 
  INT64 v13; 
  bool IsThreadInSilo; 
  PVOID v15; 
  UNICODE_STRING *v16; 
  _GUID ContainerId; 
  wchar_t *PoolWithTag; 
  SIZE_T Tag; 
  INT64 Taga; 
  WCHAR *Object; 
  PVOID *Objecta; 
  POBJECT_HANDLE_INFORMATION HandleInformation; 
  WCHAR *v25; 
  SIZE_T v26; 
  INT64 v27; 
  _EJOB *Job; 
  UINT64 a2[2]; 
  char v31; 
  INT64 v33; 
  PVOID SiloContext; 
  PVOID v35; 
  v35 = 0i64;
  v3 = 0;
  SiloContext = 0i64;
  v4 = 0i64;
  Job = 0i64;
  RootKeyObjectForSilo = 0i64;
  v33 = 0i64;
  v6 = 0i64;
  if( (unsigned int)DataLength < 8 )
    return -1073741811;
  JobSilo = ObCreateObject(0, (_DWORD *)VrpJobContextType, 0i64, 1, 0, 96, 0, 0, &SiloContext);
  if( JobSilo < 0 )
  {
    v8 = SiloContext;
    goto LABEL_24;
  }
  v8 = SiloContext;
  memset((INT64)SiloContext, 0i64);
  v8[2] = 0i64;
  JobSilo = VrpInitializeNamespaceNodeList((INT64)v8);
  if( JobSilo < 0 )
    goto LABEL_24;
  JobSilo = VrpIncrementSiloCount();
  if( JobSilo < 0 )
    goto LABEL_24;
  *((_DWORD *)v8 + 22) = 1;
  VrpLockJobContextExclusive(
    (PWCHAR)v8,
    v9,
    v10,
    v11,
    Tag,
    Object,
    (SIZE_T)HandleInformation,
    v25,
    v26,
    v27,
    (PWCHAR)Job);
  v31 = 1;
  LODWORD(Objecta) = -1;
  LODWORD(Taga) = 0;
  NamespaceNode = VrpCreateNamespaceNode(
                    (INT64)v8,
                    &CmRegistryContainersName,
                    0i64,
                    (const VOID **)&CmRegistryContainersName,
                    Taga,
                    (INT64)Objecta,
                    (CHAR **)&v33);
  v13 = v33;
  JobSilo = NamespaceNode;
  if( NamespaceNode < 0 )
    goto LABEL_19;
  JobSilo = VrpAddNamespaceNodeToList(v8, (UNICODE_STRING *)v33);
  if( JobSilo < 0 )
    goto LABEL_19;
  v33 = 0i64;
  VrpUnlockJobContextExclusive((INT64)v8);
  v31 = 0;
  JobSilo = ObReferenceObjectByHandleWithTag(
              *(HANDLE *)Data,
              6u,
              (POBJECT_TYPE)PsJobType,
              RequestorMode,
              0x52566D43u,
              &v35,
              0i64);
  if( JobSilo < 0 )
    goto LABEL_24;
  JobSilo = PsGetJobSilo((_EJOB *)v35, &Job);
  if( JobSilo < 0 )
    goto LABEL_24;
  v6 = Job;
  IsThreadInSilo = PsIsThreadInSilo((__int64)KeGetCurrentThread(), (__int64)Job);
  v8 = SiloContext;
  if( IsThreadInSilo )
  {
    JobSilo = -1073741811;
  }
  else
  {
    v15 = SiloContext;
    *(_GUID *)SiloContext = v6->ContainerId;
    LODWORD(v16) = VrpAllocateKeyContext(v15);
    v4 = v16;
    if( v16 )
    {
      ContainerId = v6->ContainerId;
      v3 = 1;
      v16[2].Length = 1;
      *(_GUID *)v16 = ContainerId;
      PoolWithTag = (wchar_t *)ExAllocatePoolWithTag(PagedPool, CmRegistryRootName.Length, 0x67655256ui64);
      v4[1].Buffer = PoolWithTag;
      if( PoolWithTag )
      {
        v4[1].Length = 0;
        v4[1].MaximumLength = CmRegistryRootName.Length;
        RtlUnicodeStringCopy(v4 + 1, &CmRegistryRootName);
        a2[0] = 0i64;
        JobSilo = CmpGetOrCreateContextForSiloNoRef(v6, a2);
        if( JobSilo >= 0 )
        {
          JobSilo = CmpStartSiloRegistryNamespace(a2[0]);
          if( JobSilo >= 0 )
            JobSilo = 0;
        }
        if( JobSilo < 0 )
          goto LABEL_24;
        JobSilo = PsInsertSiloContext(v6, (unsigned int)VrpSiloContextSlot, v8);
        if( JobSilo < 0 )
          goto LABEL_24;
        RootKeyObjectForSilo = (struct _DMA_ADAPTER *)CmGetRootKeyObjectForSilo((INT64)v6);
        JobSilo = (unsigned int)CmSetCallbackObjectContext((_POOL_TYPE)RootKeyObjectForSilo, (UINT64)&VrpCallbackCookie);
        if( JobSilo < 0 )
        {
LABEL_37:
          PsRemoveSiloContext(v6, (unsigned int)VrpSiloContextSlot, 0i64);
          goto LABEL_24;
        }
        PsMakeSiloContextPermanent(v6, (unsigned int)VrpSiloContextSlot);
        JobSilo = 0;
        v13 = v33;
LABEL_19:
        if( v13 )
          VrpDestroyNamespaceNode(v8, v13);
        if( v31 )
          VrpUnlockJobContextExclusive((INT64)v8);
        v4 = 0i64;
        if( JobSilo >= 0 || !v3 )
          goto LABEL_24;
        goto LABEL_37;
      }
    }
    JobSilo = -1073741670;
  }
LABEL_24:
  if( v8 )
    VrpDereferenceJobContext(v8);
  if( RootKeyObjectForSilo )
    HalPutDmaAdapter(RootKeyObjectForSilo);
  if( v4 )
    VrpFreeKeyContext(v4);
  if( v35 )
    ObfDereferenceObjectWithTag(v35, 0x52566D43ui64);
  return JobSilo;
}

Referenced by:

VrpIoctlDeviceDispatch