HvlpAcquireHypercallPage
VOID *__stdcall HvlpAcquireHypercallPage(
PHYSICAL_ADDRESS *PageInfo,
UINT64 Flags,
VOID *StackBuffer,
UINT64 ElementSize){
PHYSICAL_ADDRESS *HypercallCachedPages;
LONG v7;
__int16 v9;
struct _KPRCB *v10;
VOID *result;
struct _KPRCB *CurrentPrcb;
PSLIST_ENTRY v13;
_QWORD *p_Next;
PHYSICAL_ADDRESS Next;
unsigned __int64 v16;
unsigned __int64 v17;
unsigned __int8 CurrentIrql;
__int16 v19;
struct _KPRCB *v20;
__int16 v21;
HypercallCachedPages = 0i64;
v7 = Flags;
if( (HvlpFlags & 8) != 0 )
{
CurrentPrcb = KeGetCurrentPrcb();
v13 = RtlpInterlockedPopEntrySList(&CurrentPrcb->HypercallPageList);
p_Next = &v13->Next;
if( v13 )
{
PageInfo->anonymous_0.LowPart = 1;
PageInfo[1].QuadPart = (LONGLONG)CurrentPrcb;
PageInfo[2].QuadPart = (LONGLONG)v13;
Next = (PHYSICAL_ADDRESS)v13[1].Next;
}
else
{
if( (v7 & 4) != 0 )
return 0i64;
if( StackBuffer )
{
v16 = ((unsigned __int64)StackBuffer + 7) & 0xFFFFFFFFFFFFFFF8ui64;
v17 = v16 + ElementSize - 1;
p_Next = (_QWORD *)(v17 & 0xFFFFFFFFFFFFF000ui64);
if( ((v16 ^ v17) & 0xFFFFFFFFFFFFF000ui64) == 0 )
p_Next = (_QWORD *)(((unsigned __int64)StackBuffer + 7) & 0xFFFFFFFFFFFFFFF8ui64);
PageInfo->anonymous_0.LowPart = 2;
CurrentIrql = KeGetCurrentIrql();
LOBYTE(PageInfo[1].anonymous_0.LowPart) = CurrentIrql;
if( CurrentIrql < 2u )
{
KeGetCurrentIrql();
__writecr8(2ui64);
}
Next.anonymous_0.LowPart = MmGetPhysicalAddress((UINT64)p_Next);
}
else
{
v19 = v21;
PageInfo->anonymous_0.LowPart = 4;
_disable();
PageInfo[1].anonymous_0.HighPart = v7;
LOBYTE(PageInfo[1].anonymous_0.LowPart) = (v19 & 0x200) != 0;
v20 = KeGetCurrentPrcb();
if( (v7 & 1) != 0 )
{
p_Next = v20->HypercallCachedPages;
}
else if( (v7 & 2) != 0 )
{
p_Next = (char *)v20->HypercallCachedPages + 4096;
}
Next = (PHYSICAL_ADDRESS)p_Next[2];
}
}
PageInfo[3] = Next;
return p_Next;
}
else
{
v9 = v21;
PageInfo->anonymous_0.LowPart = 4;
_disable();
PageInfo[1].anonymous_0.HighPart = Flags;
LOBYTE(PageInfo[1].anonymous_0.LowPart) = (v9 & 0x200) != 0;
v10 = KeGetCurrentPrcb();
if( (Flags & 1) != 0 )
{
HypercallCachedPages = (PHYSICAL_ADDRESS *)v10->HypercallCachedPages;
}
else if( (Flags & 2) != 0 )
{
HypercallCachedPages = (PHYSICAL_ADDRESS *)((char *)v10->HypercallCachedPages + 4096);
}
result = HypercallCachedPages;
PageInfo[3] = HypercallCachedPages[2];
}
return result;
}Referenced by:
HvlCollectLivedump
HvlDmaGetDmaGuardEnabled
HvlDmaMapDeviceLogicalRange
HvlDmaMapDeviceSparsePages
HvlDmaUnmapDeviceSparsePages
HvlEnterSleepState
HvlGetCoverageData
HvlGetCoverageInfo
HvlGetSparseGpaPagesAccessState
HvlHvDebuggerPowerHandler
HvlLpReadCpuid
HvlLpReadMultipleMsr
HvlLpWriteMultipleMsr
HvlLpWritebackInvalidate
HvlMapDeviceInterrupt
HvlMapGpaPages
HvlMapSparseGpaPages
HvlNotifyAcpiReenabled
HvlNotifyAllProcessorsStarted
HvlNotifyDebugDeviceAvailable
HvlNotifyHpetEnabled
HvlNotifyRootCrashdump
HvlPrepareForHibernate
HvlPrepareForSecureHibernate
HvlQueryAssociatedProcessors
HvlQueryHypervisorTscAdjustment
HvlQueryNumaDistance
HvlRegisterDeviceId
HvlResetCoverageVector
HvlRetargetDeviceInterrupt
HvlSetHpetConfig
HvlSetPartitionProperty
HvlSetQpcBias
HvlSetSystemMachineCheckProperty
HvlSetSystemSleepProperty
HvlSetupPhysicalFaultNotificationQueue
HvlStartBootLogicalProcessors
HvlSvmGetDeviceCapabilities
HvlUnmapDeviceInterrupt
HvlpAddPhysicalMemory
HvlpCheckTscSync
HvlpConfigureLegacyPowerPolicySetting
HvlpCreateRootVirtualProcessor
HvlpDepositPages
HvlpDetermineEnlightenments
HvlpGetLogicalProcessorProperty
HvlpGetVpIndexFromApicId
HvlpInvokeGetPageListHypercall
HvlpLogGuestStateScrubbingStatus
HvlpLogIommuInitStatus
HvlpLpCpuid
HvlpMapStatisticsPage
HvlpQueryExtendedCapabilities
HvlpQueryHypervisorSchedulerType
HvlpSetLogicalProcessorProperty
HvlpSetPowerProperty
HvlpSetupSchedulerAssist
HvlpSlowAcknowledgePageRequest
HvlpSlowFlushAddressSpaceTb
HvlpSlowFlushAddressSpaceTbEx
HvlpSlowFlushListTb
HvlpSlowFlushListTbEx
HvlpSlowFlushPasidAddressList
HvlpSlowSendSyntheticClusterIpiEx
HvlpStartLogicalProcessor
HvlpStartVirtualProcessor