VrpHandleIoctlUnloadDynamicallyLoadedHives

NTSTATUS __stdcall VrpHandleIoctlUnloadDynamicallyLoadedHives(
        VOID *Data,
        UINT64 DataLength,
        CHAR RequestorMode,
        _GUID *ActivityId,
        VOID *Object,
        UINT64 *SharedCacheMap){
  int JobSilo; 
  NTSTATUS PermanentSiloContext; 
  wchar_t *v8; 
  _SIZE_T v9; 
  wchar_t *v10; 
  UINT64 *v11; 
  unsigned __int64 v12; 
  unsigned __int64 v13; 
  __int64 *v14; 
  __int64 v15; 
  UINT64 v17; 
  UINT64 Tag; 
  _SIZE_T Taga; 
  wchar_t *v20; 
  _SIZE_T v21; 
  wchar_t *v22; 
  _SIZE_T v23; 
  _OBJECT_ATTRIBUTES TargetKey; 
  _EJOB *Silo; 

  Object = 0i64;
  SharedCacheMap = 0i64;
  Silo = 0i64;
  if( (unsigned int)DataLength < 8 )
    return -1073741811;
  LODWORD(Tag) = 1381395779;
  JobSilo = ObReferenceObjectByHandleWithTag(
              *(VOID **)Data,
              6ui64,
              (_OBJECT_TYPE *)PsJobType,
              RequestorMode,
              Tag,
              &Object,
              0i64);
  if( JobSilo >= 0 )
  {
    JobSilo = PsGetJobSilo((_EJOB *)Object, &Silo);
    if( JobSilo >= 0 )
    {
      if( PsIsThreadInSilo((_ETHREAD *)KeGetCurrentThread(), Silo) )
      {
        JobSilo = -1073741811;
      }
      else
      {
        PermanentSiloContext = PsGetPermanentSiloContext(
                                 Silo,
                                 (unsigned int)VrpSiloContextSlot,
                                 (VOID **)&SharedCacheMap);
        JobSilo = PermanentSiloContext;
        if( PermanentSiloContext < 0 )
        {
          if( PermanentSiloContext == -1073741275 )
LABEL_15:
            JobSilo = 0;
        }
        else
        {
          v11 = SharedCacheMap;
          VrpLockJobContextExclusive(
            (PWCHAR)SharedCacheMap,
            v8,
            v9,
            v10,
            Taga,
            v20,
            v21,
            v22,
            v23,
            *(INT64 *)&TargetKey.Length,
            (PWCHAR)TargetKey.RootDirectory);
          if( !*((_DWORD *)v11 + 21) )
          {
            v12 = v11[6];
            v13 = 0i64;
            while( v13 < v12 )
            {
              v14 = 0i64;
              if( v13 < v12 )
              {
                if( !is_mul_ok(v11[5], v13)
                  || (v17 = v11[9], v14 = (__int64 *)(v17 + v11[5] * v13), (unsigned __int64)v14 < v17) )
                {
                  v14 = 0i64;
                }
              }
              v15 = *v14;
              if( *(int *)(*v14 + 56) < 0 )
              {
                *(&TargetKey.Length + 1) = 0;
                memset(&TargetKey.Attributes + 1, 0, 20);
                TargetKey.RootDirectory = 0i64;
                TargetKey.ObjectName = (_UNICODE_STRING *)(v15 + 24);
                TargetKey.Length = 48;
                TargetKey.Attributes = 576;
                ZwUnloadKey2(&TargetKey, 1ui64);
                VrpDestroyNamespaceNode(v11, v15);
                v12 = v11[6];
              }
              else
              {
                ++v13;
              }
            }
            VrpCleanupNamespace((__int64)v11);
            VrpUnlockJobContextExclusive((INT64)v11);
            goto LABEL_15;
          }
          JobSilo = -1073741738;
          VrpUnlockJobContextExclusive((INT64)v11);
        }
      }
    }
  }
  if( Object )
    ObfDereferenceObjectWithTag(Object, 0x52566D43ui64);
  return JobSilo;
}

Referenced by:

VrpIoctlDeviceDispatch