VrpHandleIoctlUnloadDifferencingHiveForHost

NTSTATUS __stdcall VrpHandleIoctlUnloadDifferencingHiveForHost(
        VOID *Data,
        UINT64 DataLength,
        CHAR RequestorMode,
        _GUID *ActivityId){
  _QWORD *v6; 
  NTSTATUS v7; 
  int v8; 
  unsigned int v9; 
  __int64 v10; 
  __int64 *v11; 
  __int64 v12; 
  NTSTATUS v13; 
  _UNICODE_STRING String1; 
  _UNICODE_STRING String2[2]; 

  *(_DWORD *)(&String2[0].MaximumLength + 1) = 0;
  v6 = 0i64;
  String1 = 0i64;
  if( (unsigned int)DataLength < 8 )
    return -1073741811;
  v8 = *((unsigned __int16 *)Data + 2);
  if( (v8 & 1) != 0 )
    return -1073741811;
  if( !(_WORD)v8 )
    return -1073741811;
  if( *(_DWORD *)Data )
    return -1073741811;
  v9 = v8 + 6;
  if( v9 < 6 || (unsigned int)DataLength < v9 )
    return -1073741811;
  if( !SeSinglePrivilegeCheck(*(_QWORD *)&SeBackupPrivilege, RequestorMode)
    || !SeSinglePrivilegeCheck(*(_QWORD *)&SeRestorePrivilege, RequestorMode) )
  {
    return -1073741727;
  }
  String1.Buffer = (wchar_t *)((char *)Data + 6);
  String1.MaximumLength = *((_WORD *)Data + 2);
  String1.Length = String1.MaximumLength;
  ExAcquirePushLockExclusiveEx(&VrpHostLoadedHivesLock, 0i64);
  v10 = VrpHostLoadedHives;
  v11 = &VrpHostLoadedHives;
  if( VrpHostLoadedHives )
  {
    while( 1 )
    {
      v12 = *(_QWORD *)v10;
      String2[0].Buffer = (wchar_t *)(v10 + 10);
      String2[0].Length = *(_WORD *)(v10 + 8);
      String2[0].MaximumLength = String2[0].Length;
      if( (unsigned __int8)RtlEqualUnicodeString(&String1, String2, 1u) )
        break;
      v11 = (__int64 *)v10;
      v10 = v12;
      if( !v12 )
        goto LABEL_16;
    }
    *v11 = v12;
    v6 = (_QWORD *)v10;
    *(_QWORD *)v10 = 0i64;
  }
LABEL_16:
  if( (_InterlockedExchangeAdd64(&VrpHostLoadedHivesLock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(&VrpHostLoadedHivesLock);
  KeAbPostRelease(&VrpHostLoadedHivesLock);
  if( !v6 )
    return -1073741772;
  v13 = VrpUnloadDifferencingHive(&String1);
  if( v13 == -1073741772 )
    v13 = 0;
  v7 = v13;
  if( v13 >= 0 )
  {
    ExFreePoolWithTag(v6, 0);
    v6 = 0i64;
    v7 = 0;
  }
  if( v6 )
  {
    ExAcquirePushLockExclusiveEx(&VrpHostLoadedHivesLock, 0i64);
    *v6 = VrpHostLoadedHives;
    VrpHostLoadedHives = (__int64)v6;
    if( (_InterlockedExchangeAdd64(&VrpHostLoadedHivesLock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock(&VrpHostLoadedHivesLock);
    KeAbPostRelease(&VrpHostLoadedHivesLock);
  }
  return v7;
}

Referenced by:

VrpIoctlDeviceDispatch