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