Publish the files
This commit is contained in:
87
Sources/HostInitialization.h
Normal file
87
Sources/HostInitialization.h
Normal file
@@ -0,0 +1,87 @@
|
||||
/*!
|
||||
@file HostInitialization.h
|
||||
|
||||
@brief Functions for host environment initialization.
|
||||
|
||||
@author Satoshi Tanda
|
||||
|
||||
@copyright Copyright (c) 2020 - , Satoshi Tanda. All rights reserved.
|
||||
*/
|
||||
#pragma once
|
||||
#include "Common.h"
|
||||
|
||||
/*!
|
||||
@brief Initializes the host environment.
|
||||
*/
|
||||
VOID
|
||||
InitializeHostEnvironment (
|
||||
);
|
||||
|
||||
/*!
|
||||
@brief Returns the host CR3.
|
||||
|
||||
@return The host CR3.
|
||||
*/
|
||||
CR3
|
||||
GetHostCr3 (
|
||||
);
|
||||
|
||||
/*!
|
||||
@brief Returns the pointer to the host IDTR.
|
||||
|
||||
@return The pointer to the host IDTR.
|
||||
*/
|
||||
CONST IDTR*
|
||||
GetHostIdtr (
|
||||
);
|
||||
|
||||
/*!
|
||||
@brief Sets up the task state segment (TSS) and the TR register.
|
||||
|
||||
@details On EFI, this functions takes a copy of the existing GDT into NewGdt,
|
||||
adds a new entry into it, which points to NewTss, then, updates the GDTR
|
||||
and TR to point to the NewGdt and the newly added entry. Those updated
|
||||
GDTR and TR may be used as both host and guest GDTR/TR.
|
||||
|
||||
On Windows, this function is no-op.
|
||||
|
||||
@param[in,out] NewTss - The pointer to buffer to be used as the task state
|
||||
segment.
|
||||
|
||||
@param[out] NewGdt - The pointer to the buffet to be used as the new GDT.
|
||||
This will be initialized with the contents of the current GDT with the
|
||||
new entry for TSS.
|
||||
|
||||
@param[in] NewGdtSize - The size of NewGdt in bytes.
|
||||
|
||||
@param[out] OriginalGdtr - The pointer to the GDTR to receive the value before
|
||||
this function updates.
|
||||
*/
|
||||
VOID
|
||||
InitializeGdt (
|
||||
_Inout_ TASK_STATE_SEGMENT_64* NewTss,
|
||||
_Out_writes_bytes_(NewGdtSize) SEGMENT_DESCRIPTOR_64* NewGdt,
|
||||
_In_ UINT64 NewGdtSize,
|
||||
_Out_ GDTR* OriginalGdtr
|
||||
);
|
||||
|
||||
/*!
|
||||
@brief Restores the GDTR to the specified value.
|
||||
|
||||
@details On EFI, this function updates the current GDTR, however, does not
|
||||
restore the TR to the original value. This is because the original value
|
||||
is expected to be zero, which cannot write to TR anymore (causes #GP).
|
||||
Because of this, TR will point to an invalid entry in the restored GDT.
|
||||
This is an unsolvable issue unless we reuse the existing GDT instead of
|
||||
creating a copy, which does not work on VMware Workstation due to the
|
||||
physical address hosting the GDT is not modifiable. The only sane
|
||||
workaround would be to disallow unloading of the MiniVisor module.
|
||||
|
||||
On Windows, this function is no-op.
|
||||
|
||||
@param[in] OriginalGdtr - The pointer to the GDTR to restore to.
|
||||
*/
|
||||
VOID
|
||||
CleanupGdt (
|
||||
_In_ CONST GDTR* OriginalGdtr
|
||||
);
|
||||
Reference in New Issue
Block a user