VrpHandleIoctlInitializeJobForVreg

NTSTATUS __stdcall VrpHandleIoctlInitializeJobForVreg(
        VOID *Data,
        UINT64 DataLength,
        INT64 RequestorMode,
        _GUID *ActivityId,
        VOID *Object,
        UINT64 *NumberOfBytes){
  int v6; 
  _UNICODE_STRING *v7; 
  _ADAPTER_OBJECT *RootKeyObjectForSilo; 
  _EJOB *v9; 
  NTSTATUS JobSilo; 
  _VRP_JOB_CONTEXT *v11; 
  wchar_t *v12; 
  _SIZE_T v13; 
  wchar_t *v14; 
  int v15; 
  _UNICODE_STRING *v16; 
  UINT8 IsThreadInSilo; 
  void *v18; 
  _UNICODE_STRING *v19; 
  _UNICODE_STRING v20; 
  VOID **PoolWithTag; 
  _SIZE_T ParseContext; 
  VOID *ParseContexta; 
  UINT64 ObjectBodySize; 
  wchar_t *ObjectBodySizea; 
  POBJECT_HANDLE_INFORMATION HandleInformation; 
  _SIZE_T HandleInformationa; 
  UINT64 v29; 
  wchar_t *v30; 
  _SIZE_T v31; 
  INT64 v32; 
  _EJOB *Silo; 
  __int64 a2[2]; 
  char v36; 
  INT8 AccessMode; 
  _UNICODE_STRING *NamespaceNode; 

  AccessMode = RequestorMode;
  NumberOfBytes = 0i64;
  v6 = 0;
  Object = 0i64;
  v7 = 0i64;
  Silo = 0i64;
  RootKeyObjectForSilo = 0i64;
  NamespaceNode = 0i64;
  v9 = 0i64;
  if( (unsigned int)DataLength < 8 )
    return -1073741811;
  LODWORD(v29) = 0;
  LODWORD(HandleInformation) = 0;
  LODWORD(ObjectBodySize) = 96;
  JobSilo = ObCreateObject(
              0,
              *(&stru_140CF2E80 + 597),
              0i64,
              1,
              0i64,
              ObjectBodySize,
              (UINT64)HandleInformation,
              v29,
              &Object);
  if( JobSilo < 0 )
  {
    v11 = (_VRP_JOB_CONTEXT *)Object;
    goto LABEL_24;
  }
  v11 = (_VRP_JOB_CONTEXT *)Object;
  memset(Object, 0i64, 0x60u);
  *((_QWORD *)v11 + 2) = 0i64;
  JobSilo = VrpInitializeNamespaceNodeList(v11);
  if( JobSilo < 0 )
    goto LABEL_24;
  JobSilo = VrpIncrementSiloCount();
  if( JobSilo < 0 )
    goto LABEL_24;
  v11[22] = 1;
  VrpLockJobContextExclusive(
    (PWCHAR)v11,
    v12,
    v13,
    v14,
    ParseContext,
    ObjectBodySizea,
    HandleInformationa,
    v30,
    v31,
    v32,
    (PWCHAR)Silo);
  v36 = 1;
  v15 = VrpCreateNamespaceNode(
          (UINT64 *)v11,
          &CmRegistryContainersName,
          0i64,
          (const VOID **)&CmRegistryContainersName,
          0,
          -1,
          (__int64)&NamespaceNode);
  v16 = NamespaceNode;
  JobSilo = v15;
  if( v15 < 0 )
    goto LABEL_19;
  JobSilo = VrpAddNamespaceNodeToList(v11, NamespaceNode);
  if( JobSilo < 0 )
    goto LABEL_19;
  NamespaceNode = 0i64;
  VrpUnlockJobContextExclusive((INT64)v11);
  v36 = 0;
  LODWORD(ParseContexta) = 1381395779;
  JobSilo = ObReferenceObjectByHandleWithTag(
              *(VOID **)Data,
              6ui64,
              (_OBJECT_TYPE *)PsJobType,
              AccessMode,
              (UINT64)ParseContexta,
              (VOID **)&NumberOfBytes,
              0i64);
  if( JobSilo < 0 )
    goto LABEL_24;
  JobSilo = PsGetJobSilo((_EJOB *)NumberOfBytes, &Silo);
  if( JobSilo < 0 )
    goto LABEL_24;
  v9 = Silo;
  IsThreadInSilo = PsIsThreadInSilo((_ETHREAD *)KeGetCurrentThread(), Silo);
  v11 = (_VRP_JOB_CONTEXT *)Object;
  if( IsThreadInSilo )
  {
    JobSilo = -1073741811;
  }
  else
  {
    v18 = Object;
    *(_OWORD *)Object = *(_OWORD *)((char *)v9 + 1240);
    LODWORD(v19) = VrpAllocateKeyContext(v18);
    v7 = v19;
    if( v19 )
    {
      v20 = *(_UNICODE_STRING *)((char *)v9 + 1240);
      v6 = 1;
      v19[2].Length = 1;
      *v19 = v20;
      PoolWithTag = ExAllocatePoolWithTag(1ui64, CmRegistryRootName.Length, 1734693462i64);
      v7[1].Buffer = (wchar_t *)PoolWithTag;
      if( PoolWithTag )
      {
        v7[1].Length = 0;
        v7[1].MaximumLength = CmRegistryRootName.Length;
        RtlUnicodeStringCopy(v7 + 1, &CmRegistryRootName);
        a2[0] = 0i64;
        JobSilo = CmpGetOrCreateContextForSiloNoRef(v9, (UINT64 *)a2);
        if( JobSilo >= 0 )
        {
          JobSilo = CmpStartSiloRegistryNamespace(a2[0]);
          if( JobSilo >= 0 )
            JobSilo = 0;
        }
        if( JobSilo < 0 )
          goto LABEL_24;
        JobSilo = PsInsertSiloContext(v9, (unsigned int)VrpSiloContextSlot, v11);
        if( JobSilo < 0 )
          goto LABEL_24;
        RootKeyObjectForSilo = (_ADAPTER_OBJECT *)CmGetRootKeyObjectForSilo(v9);
        JobSilo = CmSetCallbackObjectContext(RootKeyObjectForSilo, &VrpCallbackCookie, v7, 0i64);
        if( JobSilo < 0 )
        {
LABEL_37:
          PsRemoveSiloContext(v9, (unsigned int)VrpSiloContextSlot, 0i64);
          goto LABEL_24;
        }
        PsMakeSiloContextPermanent(v9, (unsigned int)VrpSiloContextSlot);
        JobSilo = 0;
        v16 = NamespaceNode;
LABEL_19:
        if( v16 )
          VrpDestroyNamespaceNode((UINT64 *)v11, (__int64)v16);
        if( v36 )
          VrpUnlockJobContextExclusive((INT64)v11);
        v7 = 0i64;
        if( JobSilo >= 0 || !v6 )
          goto LABEL_24;
        goto LABEL_37;
      }
    }
    JobSilo = -1073741670;
  }
LABEL_24:
  if( v11 )
    VrpDereferenceJobContext(v11);
  if( RootKeyObjectForSilo )
    HalPutDmaAdapter(RootKeyObjectForSilo);
  if( v7 )
    VrpFreeKeyContext(v7);
  if( NumberOfBytes )
    ObfDereferenceObjectWithTag(NumberOfBytes, 0x52566D43ui64);
  return JobSilo;
}

Referenced by:

VrpIoctlDeviceDispatch