VrpHandleIoctlGetVirtualRootKey

NTSTATUS __stdcall VrpHandleIoctlGetVirtualRootKey(){
  unsigned int v0; 
  __int64 v1; 
  CHAR v2; 
  CHAR v3; 
  __int64 v4; 
  int JobSilo; 
  INT64 v6; 
  _EJOB *v7; 
  INT64 v8; 
  _EJOB *v9; 
  unsigned int v10; 
  VOID *v11; 
  UINT64 Tag; 
  INT64 Taga; 
  INT64 v15; 
  INT64 v16; 
  INT64 v17; 
  _EJOB *Job; 
  _EJOB *Silo; 
  _OBJECT_ATTRIBUTES ObjectAttributes; 
  VOID *KeyHandle; 
  _QWORD *v22; 
  _DWORD *v23; 

  Silo = 0i64;
  Job = 0i64;
  v3 = v2;
  KeyHandle = 0i64;
  v4 = v1;
  memset(&ObjectAttributes, 0, sizeof(ObjectAttributes));
  if( v0 < 0x10 || *(_DWORD *)(v1 + 8) > 2u )
    return -1073741811;
  LODWORD(Tag) = 1381395779;
  JobSilo = ObpReferenceObjectByHandleWithTag(
              *(VOID **)v1,
              4ui64,
              (_OBJECT_TYPE *)PsJobType,
              v2,
              Tag,
              (VOID **)&Job,
              0i64,
              0i64);
  if( JobSilo >= 0 )
  {
    JobSilo = PsGetJobSilo(Job, &Silo);
    if( JobSilo >= 0 )
    {
      if( PsIsThreadInSilo((_ETHREAD *)KeGetCurrentThread(), Silo) )
      {
        JobSilo = -1073741811;
      }
      else
      {
        LODWORD(v7) = PsAttachSiloToCurrentThread(v6);
        ObjectAttributes.RootDirectory = 0i64;
        v9 = v7;
        ObjectAttributes.Length = 48;
        v10 = 1088;
        if( v3 != 1 )
          v10 = 576;
        ObjectAttributes.Attributes = v10;
        ObjectAttributes.ObjectName = (_UNICODE_STRING *)&VrpRootKeyPaths[8 * *(int *)(v4 + 8)];
        *(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
        JobSilo = ZwOpenKey(&KeyHandle, 0x80000000ui64, &ObjectAttributes, v8, Taga, v15, v16, v17);
        if( JobSilo >= 0 )
        {
          v11 = KeyHandle;
          KeyHandle = 0i64;
          JobSilo = 0;
          *v23 = 8;
          *v22 = v11;
        }
        PsDetachSiloFromCurrentThread(v9);
      }
    }
  }
  if( Job )
    ObfDereferenceObjectWithTag(Job, 0x52566D43ui64);
  return JobSilo;
}

Referenced by:

VrpIoctlDeviceDispatch