VrpHandleIoctlLoadDifferencingHive

NTSTATUS __stdcall VrpHandleIoctlLoadDifferencingHive(PVOID Data, UINT64 DataLength, INT8 RequestorMode){
  unsigned int v3; 
  unsigned __int64 v6; 
  unsigned __int64 v7; 
  int v8; 
  unsigned int v9; 
  unsigned int v10; 
  void *v11; 
  int JobSilo; 
  WCHAR *v13; 
  SIZE_T v14; 
  WCHAR *v15; 
  PWCHAR v16; 
  VOID *PoolWithTag; 
  SIZE_T Tag; 
  UINT64 Taga; 
  WCHAR *Object; 
  PVOID *Objecta; 
  POBJECT_HANDLE_INFORMATION HandleInformation; 
  WCHAR *v24; 
  void *Src[2]; 
  UNICODE_STRING NextLayerKeyPath; 
  UNICODE_STRING TargetHivePath; 
  _EJOB *Silo; 
  PVOID v29; 
  PWCHAR FullPath; 
  v3 = DataLength;
  v29 = 0i64;
  FullPath = 0i64;
  Silo = 0i64;
  NextLayerKeyPath = 0i64;
  TargetHivePath = 0i64;
  *(_OWORD *)Src = 0i64;
  if( !SeSinglePrivilegeCheck(*(_QWORD *)&SeBackupPrivilege, RequestorMode)
    || !SeSinglePrivilegeCheck(*(_QWORD *)&SeRestorePrivilege, RequestorMode) )
  {
    return -1073741727;
  }
  if( v3 < 0x30 )
    return -1073741811;
  v6 = *((unsigned __int16 *)Data + 10);
  if( (v6 & 1) != 0 )
    return -1073741811;
  v7 = *((unsigned __int16 *)Data + 11);
  if( (v7 & 1) != 0 )
    return -1073741811;
  v8 = *((unsigned __int16 *)Data + 12);
  if( (v8 & 1) != 0 )
    return -1073741811;
  if( !(_WORD)v6 )
    return -1073741811;
  if( !(_WORD)v7 )
    return -1073741811;
  v9 = v6 + 40;
  v10 = v9 + v7;
  if( v9 > v9 + (unsigned int)v7 || v10 > v10 + v8 || v3 < v10 + v8 || (*((_DWORD *)Data + 3) & 1) != 0 && !(_WORD)v8 )
    return -1073741811;
  WORD1(Src[0]) = *((_WORD *)Data + 10);
  LOWORD(Src[0]) = v6;
  Src[1] = (char *)Data + 40;
  TargetHivePath.MaximumLength = v7;
  TargetHivePath.Length = v7;
  v11 = *(void **)Data;
  TargetHivePath.Buffer = (wchar_t *)((char *)Data + 2 * (v6 >> 1) + 40);
  NextLayerKeyPath.MaximumLength = v8;
  NextLayerKeyPath.Length = v8;
  NextLayerKeyPath.Buffer = &TargetHivePath.Buffer[v7 >> 1];
  JobSilo = ObReferenceObjectByHandleWithTag(v11, 6u, (POBJECT_TYPE)PsJobType, RequestorMode, 0x52566D43u, &v29, 0i64);
  if( JobSilo >= 0 )
  {
    JobSilo = PsGetJobSilo((_EJOB *)v29, &Silo);
    if( JobSilo >= 0 )
    {
      if( PsIsThreadInSilo((__int64)KeGetCurrentThread(), (__int64)Silo) )
      {
        JobSilo = -1073741811;
      }
      else
      {
        JobSilo = PsGetPermanentSiloContext(Silo, (unsigned int)VrpSiloContextSlot, (PVOID *)&FullPath);
        if( JobSilo < 0 )
          goto LABEL_22;
        v16 = FullPath;
        VrpLockJobContextExclusive(
          FullPath,
          v13,
          v14,
          v15,
          Tag,
          Object,
          (SIZE_T)HandleInformation,
          v24,
          (SIZE_T)Src[0],
          (INT64)Src[1],
          *(PWCHAR *)&NextLayerKeyPath.Length);
        if( *((_DWORD *)v16 + 21) )
        {
          JobSilo = -1073741738;
        }
        else
        {
          LODWORD(Objecta) = (*((_DWORD *)Data + 3) >> 1) & 1;
          LODWORD(Taga) = *((_DWORD *)Data + 3) & 1;
          JobSilo = VrpLoadDifferencingHive(
                      (UNICODE_STRING *)Src,
                      &TargetHivePath,
                      &NextLayerKeyPath,
                      *((unsigned int *)Data + 4),
                      Taga,
                      Objecta);
          if( JobSilo >= 0 )
          {
            PoolWithTag = ExAllocatePoolWithTag(PagedPool, (unsigned int)LOWORD(Src[0]) + 10, 0x67655256ui64);
            if( PoolWithTag )
            {
              *((_WORD *)PoolWithTag + 4) = Src[0];
              memmove((UINT8 *)PoolWithTag + 10, (UINT8 *)Src[1], LOWORD(Src[0]));
              *(_QWORD *)PoolWithTag = *((_QWORD *)v16 + 3);
              *((_QWORD *)v16 + 3) = PoolWithTag;
              VrpUnlockJobContextExclusive((INT64)v16);
              JobSilo = 0;
              goto LABEL_22;
            }
            JobSilo = -1073741670;
            VrpUnloadDifferencingHive((UNICODE_STRING *)Src);
          }
        }
        VrpUnlockJobContextExclusive((INT64)v16);
      }
    }
  }
LABEL_22:
  if( v29 )
    ObfDereferenceObjectWithTag(v29, 0x52566D43ui64);
  return JobSilo;
}

Referenced by:

VrpIoctlDeviceDispatch