mirror of
https://github.com/momo5502/hypervisor.git
synced 2025-05-25 21:54:52 +00:00
Add win7 compatibility
This commit is contained in:
parent
1bbd9e9c73
commit
2c48c4b595
@ -14,10 +14,6 @@ set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
|||||||
|
|
||||||
##########################################
|
##########################################
|
||||||
|
|
||||||
set(WDK_WINVER "0x0602" CACHE STRING "Default WINVER for WDK targets")
|
|
||||||
|
|
||||||
##########################################
|
|
||||||
|
|
||||||
set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded$<$<CONFIG:Debug>:Debug>)
|
set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded$<$<CONFIG:Debug>:Debug>)
|
||||||
|
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
|
@ -80,15 +80,42 @@ void hypervisor::enable()
|
|||||||
{
|
{
|
||||||
this->allocate_vm_states();
|
this->allocate_vm_states();
|
||||||
|
|
||||||
thread::dispatch_on_all_cores([this]()
|
const auto cr3 = __readcr3();
|
||||||
|
|
||||||
|
bool success = true;
|
||||||
|
thread::dispatch_on_all_cores([&]()
|
||||||
{
|
{
|
||||||
this->enable_core();
|
success &= this->try_enable_core(cr3);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (!success)
|
||||||
|
{
|
||||||
|
this->disable();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void hypervisor::enable_core()
|
bool hypervisor::try_enable_core(const uint64_t cr3)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
this->enable_core(cr3);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (std::exception& e)
|
||||||
|
{
|
||||||
|
debug_log("Failed to enable hypervisor on core %d: %s\n", thread::get_processor_index(), e.what());
|
||||||
|
return false;
|
||||||
|
}catch (...)
|
||||||
|
{
|
||||||
|
debug_log("Failed to enable hypervisor on core %d.\n", thread::get_processor_index());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void hypervisor::enable_core(uint64_t /*cr3*/)
|
||||||
{
|
{
|
||||||
auto* vm_state = this->get_current_vm_state();
|
auto* vm_state = this->get_current_vm_state();
|
||||||
|
throw std::runtime_error("Not implemented!");
|
||||||
}
|
}
|
||||||
|
|
||||||
void hypervisor::disable_core()
|
void hypervisor::disable_core()
|
||||||
|
@ -20,7 +20,8 @@ public:
|
|||||||
private:
|
private:
|
||||||
vmx::vm_state* vm_states_{nullptr};
|
vmx::vm_state* vm_states_{nullptr};
|
||||||
|
|
||||||
void enable_core();
|
void enable_core(uint64_t cr3);
|
||||||
|
bool try_enable_core(uint64_t cr3);
|
||||||
void disable_core();
|
void disable_core();
|
||||||
|
|
||||||
void allocate_vm_states();
|
void allocate_vm_states();
|
||||||
|
@ -2,18 +2,12 @@
|
|||||||
#include "finally.hpp"
|
#include "finally.hpp"
|
||||||
#include "logging.hpp"
|
#include "logging.hpp"
|
||||||
#include "exception.hpp"
|
#include "exception.hpp"
|
||||||
|
#include "string.hpp"
|
||||||
|
|
||||||
#define HELLO_DRV_IOCTL CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_NEITHER, FILE_ANY_ACCESS)
|
#define HELLO_DRV_IOCTL CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_NEITHER, FILE_ANY_ACCESS)
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
UNICODE_STRING get_unicode_string(const wchar_t* string)
|
|
||||||
{
|
|
||||||
UNICODE_STRING unicode_string{};
|
|
||||||
RtlInitUnicodeString(&unicode_string, string);
|
|
||||||
return unicode_string;
|
|
||||||
}
|
|
||||||
|
|
||||||
_Function_class_(DRIVER_DISPATCH) NTSTATUS not_supported_handler(PDEVICE_OBJECT /*device_object*/, const PIRP irp)
|
_Function_class_(DRIVER_DISPATCH) NTSTATUS not_supported_handler(PDEVICE_OBJECT /*device_object*/, const PIRP irp)
|
||||||
{
|
{
|
||||||
PAGED_CODE()
|
PAGED_CODE()
|
||||||
@ -74,8 +68,8 @@ irp::irp(const PDRIVER_OBJECT driver_object, const wchar_t* device_name, const w
|
|||||||
{
|
{
|
||||||
PAGED_CODE()
|
PAGED_CODE()
|
||||||
|
|
||||||
this->device_name_ = get_unicode_string(device_name);
|
this->device_name_ = string::get_unicode_string(device_name);
|
||||||
this->dos_device_name_ = get_unicode_string(dos_device_name);
|
this->dos_device_name_ = string::get_unicode_string(dos_device_name);
|
||||||
|
|
||||||
auto destructor = utils::finally([this]()
|
auto destructor = utils::finally([this]()
|
||||||
{
|
{
|
||||||
|
@ -1,26 +1,46 @@
|
|||||||
#include "std_include.hpp"
|
#include "std_include.hpp"
|
||||||
#include "memory.hpp"
|
#include "memory.hpp"
|
||||||
|
#include "string.hpp"
|
||||||
|
|
||||||
namespace memory
|
namespace memory
|
||||||
{
|
{
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
|
using mm_allocate_contiguous_node_memory = decltype(MmAllocateContiguousNodeMemory)*;
|
||||||
|
|
||||||
|
mm_allocate_contiguous_node_memory get_mm_allocate_contiguous_node_memory()
|
||||||
|
{
|
||||||
|
static bool fetched{false};
|
||||||
|
static mm_allocate_contiguous_node_memory address{nullptr};
|
||||||
|
|
||||||
|
if (!fetched)
|
||||||
|
{
|
||||||
|
fetched = true;
|
||||||
|
auto function_name = string::get_unicode_string(L"MmAllocateContiguousNodeMemory");
|
||||||
|
address = static_cast<mm_allocate_contiguous_node_memory>(MmGetSystemRoutineAddress(&function_name));
|
||||||
|
}
|
||||||
|
|
||||||
|
return address;
|
||||||
|
}
|
||||||
|
|
||||||
void* allocate_aligned_memory_internal(const size_t size)
|
void* allocate_aligned_memory_internal(const size_t size)
|
||||||
{
|
{
|
||||||
PHYSICAL_ADDRESS lowest{}, highest{};
|
PHYSICAL_ADDRESS lowest{}, highest{};
|
||||||
lowest.QuadPart = 0;
|
lowest.QuadPart = 0;
|
||||||
highest.QuadPart = lowest.QuadPart - 1;
|
highest.QuadPart = lowest.QuadPart - 1;
|
||||||
|
|
||||||
#if (NTDDI_VERSION >= NTDDI_VISTA)
|
const auto allocate_node_mem = get_mm_allocate_contiguous_node_memory();
|
||||||
return MmAllocateContiguousNodeMemory(size,
|
if (allocate_node_mem)
|
||||||
lowest,
|
{
|
||||||
highest,
|
return allocate_node_mem(size,
|
||||||
lowest,
|
lowest,
|
||||||
PAGE_READWRITE,
|
highest,
|
||||||
KeGetCurrentNodeNumber());
|
lowest,
|
||||||
#else
|
PAGE_READWRITE,
|
||||||
return MmAllocateContiguousMemory(size, highest);
|
KeGetCurrentNodeNumber());
|
||||||
#endif
|
}
|
||||||
|
|
||||||
|
return MmAllocateContiguousMemory(size, highest);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -48,6 +68,18 @@ namespace memory
|
|||||||
return memory;
|
return memory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void* get_physical_address(void* address)
|
||||||
|
{
|
||||||
|
return reinterpret_cast<void*>(MmGetPhysicalAddress(address).QuadPart);
|
||||||
|
}
|
||||||
|
|
||||||
|
void* get_virtual_address(void* address)
|
||||||
|
{
|
||||||
|
PHYSICAL_ADDRESS physical_address{};
|
||||||
|
physical_address.QuadPart = reinterpret_cast<LONGLONG>(address);
|
||||||
|
return MmGetVirtualForPhysical(physical_address);
|
||||||
|
}
|
||||||
|
|
||||||
_Must_inspect_result_
|
_Must_inspect_result_
|
||||||
_IRQL_requires_max_(DISPATCH_LEVEL)
|
_IRQL_requires_max_(DISPATCH_LEVEL)
|
||||||
|
|
||||||
|
@ -9,6 +9,9 @@ namespace memory
|
|||||||
_IRQL_requires_max_(DISPATCH_LEVEL)
|
_IRQL_requires_max_(DISPATCH_LEVEL)
|
||||||
void* allocate_aligned_memory(size_t size);
|
void* allocate_aligned_memory(size_t size);
|
||||||
|
|
||||||
|
void* get_physical_address(void* address);
|
||||||
|
void* get_virtual_address(void* address);
|
||||||
|
|
||||||
_Must_inspect_result_
|
_Must_inspect_result_
|
||||||
_IRQL_requires_max_(DISPATCH_LEVEL)
|
_IRQL_requires_max_(DISPATCH_LEVEL)
|
||||||
void* allocate_non_paged_memory(size_t size);
|
void* allocate_non_paged_memory(size_t size);
|
||||||
|
@ -31,6 +31,21 @@ KeSignalCallDpcSynchronize(
|
|||||||
_In_ PVOID SystemArgument2
|
_In_ PVOID SystemArgument2
|
||||||
);
|
);
|
||||||
|
|
||||||
|
#if (NTDDI_VERSION < NTDDI_WIN8)
|
||||||
|
_Must_inspect_result_
|
||||||
|
_IRQL_requires_max_(DISPATCH_LEVEL)
|
||||||
|
NTKERNELAPI
|
||||||
|
_When_ (return != NULL, _Post_writable_byte_size_ (NumberOfBytes)) PVOID
|
||||||
|
MmAllocateContiguousNodeMemory (
|
||||||
|
_In_ SIZE_T NumberOfBytes,
|
||||||
|
_In_ PHYSICAL_ADDRESS LowestAcceptableAddress,
|
||||||
|
_In_ PHYSICAL_ADDRESS HighestAcceptableAddress,
|
||||||
|
_In_opt_ PHYSICAL_ADDRESS BoundaryAddressMultiple,
|
||||||
|
_In_ ULONG Protect,
|
||||||
|
_In_ NODE_REQUIREMENT PreferredNode
|
||||||
|
);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
14
src/driver/string.cpp
Normal file
14
src/driver/string.cpp
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#include "std_include.hpp"
|
||||||
|
#include "string.hpp"
|
||||||
|
|
||||||
|
namespace string
|
||||||
|
{
|
||||||
|
_IRQL_requires_max_(DISPATCH_LEVEL)
|
||||||
|
|
||||||
|
UNICODE_STRING get_unicode_string(const wchar_t* string)
|
||||||
|
{
|
||||||
|
UNICODE_STRING unicode_string{};
|
||||||
|
RtlInitUnicodeString(&unicode_string, string);
|
||||||
|
return unicode_string;
|
||||||
|
}
|
||||||
|
}
|
7
src/driver/string.hpp
Normal file
7
src/driver/string.hpp
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace string
|
||||||
|
{
|
||||||
|
_IRQL_requires_max_(DISPATCH_LEVEL)
|
||||||
|
UNICODE_STRING get_unicode_string(const wchar_t* string);
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user