MiSetImageHotPatchAllowed

NTSTATUS __stdcall MiSetImageHotPatchAllowed(UINT64 a1){
  _ETHREAD *CurrentThread; 
  _MMVAD_SHORT *v3; 
  _MMVAD_SHORT *v4; 
  INT64 v5; 
  int v6; 
  NTSTATUS v7; 
  union {unsigned int LongFlags;_MMVAD_FLAGS VadFlags;_MM_PRIVATE_VAD_FLAGS PrivateVadFlags;_MM_GRAPHICS_VAD_FLAGS GraphicsVadFlags;_MM_SHARED_VAD_FLAGS SharedVadFlags;volatile unsigned int VolatileVadLong;} v8; 
  __int64 v9; 
  unsigned int v10; 
  INT64 v11; 
  INT64 v12; 
  NTSTATUS v13; 
  INT64 v15; 

  LODWORD(v15) = 0;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  LODWORD(v3) = MiObtainReferencedVadEx(a1, 0, &v15);
  v4 = v3;
  if( !v3 )
    return v15;
  if( (v3->u.LongFlags & 0x70) != 32 || MiVadDeleted(v3) )
    goto LABEL_12;
  LOBYTE(v6) = MiImageVadHotPatchEligible(v5);
  if( !v6 )
  {
    v7 = -1073741637;
LABEL_13:
    MiUnlockAndDereferenceVad(v4);
    return v7;
  }
  if( a1 != (v4->StartingVpn | ((unsigned __int64)v4->StartingVpnHigh << 32)) << 12 )
  {
LABEL_12:
    v7 = -1073741800;
    goto LABEL_13;
  }
  v8.LongFlags = (unsigned int)v4->u;
  if( (v8.LongFlags & 0x100000) == 0 && (v8.LongFlags & 0x70) == 32 && (v8.LongFlags & 0x400000) != 0 )
  {
    v7 = 255;
    goto LABEL_13;
  }
  MiSetVadFlags((_MI_PARTITION *)v4, 4ui64, 1);
  v9 = **(_QWORD **)v4[1].ExtraCreateInfo;
  v10 = *(_DWORD *)(*(_QWORD *)(v9 + 56) + 60i64);
  v11 = _InterlockedCompareExchange64((volatile signed __int64 *)(v9 + 24), -1i64, -1i64);
  MiUnlockVad(CurrentThread, v4);
  MiHotPatchImage(v12, v11, (WCHAR)v4, v10);
  v7 = v13;
  MiLockVadShared((INT64)CurrentThread, (INT64)v4);
  MiUnlockAndDereferenceVadShared(v4);
  return v7;
}

Referenced by:

NtSetInformationVirtualMemory