/// <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; }
/// <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; }