Beispiel #1
0
/// <summary>
/// Create Guest to Host page mappings
/// </summary>
/// <param name="pEPT">CPU EPT data</param>
/// <returns>Status code</returns>
NTSTATUS EptBuildIdentityMap( IN PEPT_DATA pEPT )
{
    if (pEPT->PML4Ptr != NULL)
        return STATUS_SUCCESS;

    pEPT->PML4Ptr = (PEPT_PML4_ENTRY)EptpAllocatePage( pEPT );
    if (pEPT->PML4Ptr == NULL)
        return STATUS_INSUFFICIENT_RESOURCES;

    NTSTATUS status = EptpFillTable( pEPT, pEPT->PML4Ptr );
    if (!NT_SUCCESS( status ))
        EptFreeIdentityMap( pEPT );

    //DPRINT( "HyperBone: CPU %d: %s: Used pages %d\n", CPU_IDX, __FUNCTION__, pEPT->TotalPages );
    return status;
}
Beispiel #2
0
/// <summary>
/// Revert CPU to non-root mode
/// </summary>
/// <param name="Vcpu">Virtual CPU data</param>
VOID VmxShutdown( IN PVCPU Vcpu )
{
    //DPRINT( "HyperBone: CPU %d: %s: CR3 load count %d\n", CPU_IDX, __FUNCTION__, Vcpu->Cr3Loads );

    __vmx_vmcall( HYPERCALL_UNLOAD, 0, 0, 0 );
    VmxVMCleanup( KGDT64_R3_DATA | RPL_MASK, KGDT64_R3_CMTEB | RPL_MASK );

    EptFreeIdentityMap( &Vcpu->EPT );

    if (Vcpu->VMXON)
        MmFreeContiguousMemory( Vcpu->VMXON );
    if (Vcpu->VMCS)
        MmFreeContiguousMemory( Vcpu->VMCS );
    if (Vcpu->VMMStack)
        MmFreeContiguousMemory( Vcpu->VMMStack );

    Vcpu->VMXON = NULL;
    Vcpu->VMCS = NULL;
    Vcpu->VMMStack = NULL;
}