mirror of
https://github.com/momo5502/hypervisor.git
synced 2025-04-18 21:22:54 +00:00
Progress
This commit is contained in:
parent
b56b9e5afa
commit
eef4a9a5a2
1
.gitmodules
vendored
1
.gitmodules
vendored
@ -4,3 +4,4 @@
|
||||
[submodule "external/vcrtl"]
|
||||
path = external/vcrtl
|
||||
url = https://github.com/avakar/vcrtl.git
|
||||
ignore = dirty
|
||||
|
@ -73,21 +73,21 @@ endfunction()
|
||||
##########################################
|
||||
|
||||
function(get_all_targets var)
|
||||
set(targets)
|
||||
get_all_targets_recursive(targets ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
set(${var} ${targets} PARENT_SCOPE)
|
||||
set(targets)
|
||||
get_all_targets_recursive(targets ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
set(${var} ${targets} PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
##########################################
|
||||
|
||||
macro(get_all_targets_recursive targets dir)
|
||||
get_property(subdirectories DIRECTORY ${dir} PROPERTY SUBDIRECTORIES)
|
||||
foreach(subdir ${subdirectories})
|
||||
get_all_targets_recursive(${targets} ${subdir})
|
||||
endforeach()
|
||||
get_property(subdirectories DIRECTORY ${dir} PROPERTY SUBDIRECTORIES)
|
||||
foreach(subdir ${subdirectories})
|
||||
get_all_targets_recursive(${targets} ${subdir})
|
||||
endforeach()
|
||||
|
||||
get_property(current_targets DIRECTORY ${dir} PROPERTY BUILDSYSTEM_TARGETS)
|
||||
list(APPEND ${targets} ${current_targets})
|
||||
get_property(current_targets DIRECTORY ${dir} PROPERTY BUILDSYSTEM_TARGETS)
|
||||
list(APPEND ${targets} ${current_targets})
|
||||
endmacro()
|
||||
|
||||
##########################################
|
||||
|
4
external/CMakeLists.txt
vendored
4
external/CMakeLists.txt
vendored
@ -9,6 +9,7 @@ ExternalProject_Add(
|
||||
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/vcrtl
|
||||
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/vcrtl
|
||||
BUILD_COMMAND "${CMAKE_COMMAND}" --build ${CMAKE_CURRENT_BINARY_DIR}/vcrtl --config $<CONFIG> --target vcrtl_driver
|
||||
PATCH_COMMAND cmd /C "echo. > ${CMAKE_CURRENT_SOURCE_DIR}/vcrtl/src/runtime.cpp"
|
||||
INSTALL_COMMAND ""
|
||||
USES_TERMINAL_CONFIGURE 1
|
||||
USES_TERMINAL_BUILD 1
|
||||
@ -16,7 +17,6 @@ ExternalProject_Add(
|
||||
BUILD_BYPRODUCTS "${VCRTL_LIBRARY}"
|
||||
CMAKE_ARGS
|
||||
"-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
|
||||
"-DCMAKE_CONFIGURATION_TYPES=${CMAKE_CONFIGURATION_TYPES}"
|
||||
|
||||
"-DCMAKE_SHARED_LINKER_FLAGS=${CMAKE_SHARED_LINKER_FLAGS}"
|
||||
"-DCMAKE_MODULE_LINKER_FLAGS=${CMAKE_MODULE_LINKER_FLAGS}"
|
||||
@ -31,8 +31,6 @@ ExternalProject_Add(
|
||||
"-DCMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}"
|
||||
|
||||
"-DCMAKE_MSVC_RUNTIME_LIBRARY=${CMAKE_MSVC_RUNTIME_LIBRARY}"
|
||||
|
||||
"-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}"
|
||||
)
|
||||
|
||||
add_library(vcrtl_driver INTERFACE)
|
||||
|
@ -1,7 +1,14 @@
|
||||
string(REPLACE "/RTC1" "" CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG})
|
||||
|
||||
file(GLOB driver_sources ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
|
||||
file(GLOB driver_headers ${CMAKE_CURRENT_SOURCE_DIR}/*.hpp)
|
||||
|
||||
wdk_add_driver(driver
|
||||
driver_main.cpp
|
||||
thread.cpp
|
||||
new.cpp
|
||||
${driver_sources}
|
||||
${driver_header}
|
||||
)
|
||||
target_precompile_headers(driver
|
||||
PRIVATE std_include.hpp
|
||||
)
|
||||
|
||||
cmake_path(NATIVE_PATH PROJECT_SOURCE_DIR NORMALIZE WINDOWS_PROJECT_DIR)
|
||||
|
@ -258,11 +258,19 @@ void throw_test()
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" void __cdecl __std_terminate()
|
||||
{
|
||||
KeBugCheckEx(DRIVER_VIOLATION, 14, 0, 0, 0);
|
||||
}
|
||||
|
||||
|
||||
extern "C" NTSTATUS DriverEntry(const PDRIVER_OBJECT DriverObject, PUNICODE_STRING /*RegistryPath*/)
|
||||
{
|
||||
DriverObject->DriverUnload = unload;
|
||||
debug_log("Hello World\n");
|
||||
|
||||
delete(new int);
|
||||
|
||||
volatile long i = 0;
|
||||
|
||||
thread::dispatch_on_all_cores([&i]()
|
||||
|
55
src/driver/functional.hpp
Normal file
55
src/driver/functional.hpp
Normal file
@ -0,0 +1,55 @@
|
||||
#pragma once
|
||||
#include "unique_ptr.hpp"
|
||||
|
||||
namespace std
|
||||
{
|
||||
template <typename T>
|
||||
struct function;
|
||||
|
||||
template <typename Result, typename... Args>
|
||||
struct function<Result(Args ...)>
|
||||
{
|
||||
private:
|
||||
struct fn_interface
|
||||
{
|
||||
virtual ~fn_interface() = default;
|
||||
virtual Result operator()(Args ...) const = 0;
|
||||
};
|
||||
|
||||
template <typename F>
|
||||
struct fn_implementation : fn_interface
|
||||
{
|
||||
fn_implementation(F&& f) : f_(std::forward<F>(f))
|
||||
{
|
||||
}
|
||||
|
||||
Result operator()(Args ... a) const override
|
||||
{
|
||||
f_(std::forward<Args>(a)...);
|
||||
}
|
||||
|
||||
F f_;
|
||||
};
|
||||
|
||||
std::unique_ptr<fn_interface> fn{};
|
||||
|
||||
public:
|
||||
template <typename T>
|
||||
function(T&& t)
|
||||
: fn(new fn_implementation<T>(std::forward<T>(t)))
|
||||
{
|
||||
}
|
||||
|
||||
~function() = default;
|
||||
function(function<Result(Args ...)>&&) noexcept = default;
|
||||
function& operator=(function<Result(Args ...)>&&) noexcept = default;
|
||||
|
||||
function(const function<Result(Args ...)>&) = delete;
|
||||
function& operator=(const function<Result(Args ...)>&) = delete;
|
||||
|
||||
Result operator()(Args ... args) const
|
||||
{
|
||||
return (*fn)(std::forward<Args>(args)...);
|
||||
}
|
||||
};
|
||||
}
|
@ -1,5 +1,6 @@
|
||||
#include "std_include.hpp"
|
||||
#include "new.hpp"
|
||||
#include "logging.hpp"
|
||||
|
||||
void* __cdecl operator new(const size_t size, const POOL_TYPE pool, const unsigned long tag)
|
||||
{
|
||||
|
@ -11,44 +11,3 @@ void __cdecl operator delete(void *ptr, size_t);
|
||||
void __cdecl operator delete(void *ptr);
|
||||
void __cdecl operator delete[](void *ptr, size_t);
|
||||
void __cdecl operator delete[](void *ptr);
|
||||
|
||||
// TEMPLATE CLASS remove_reference
|
||||
template<class _Ty>
|
||||
struct remove_reference
|
||||
{ // remove reference
|
||||
typedef _Ty type;
|
||||
};
|
||||
|
||||
template<class _Ty>
|
||||
struct remove_reference<_Ty&>
|
||||
{ // remove reference
|
||||
typedef _Ty type;
|
||||
};
|
||||
|
||||
template<class _Ty>
|
||||
struct remove_reference<_Ty&&>
|
||||
{ // remove rvalue reference
|
||||
typedef _Ty type;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
typename remove_reference<T>::type&& move(T&& arg)
|
||||
{
|
||||
return static_cast<typename remove_reference<T>::type&&>(arg);
|
||||
}
|
||||
|
||||
// TEMPLATE FUNCTION forward
|
||||
template<class _Ty> inline
|
||||
constexpr _Ty&& forward(
|
||||
typename remove_reference<_Ty>::type& _Arg)
|
||||
{ // forward an lvalue as either an lvalue or an rvalue
|
||||
return (static_cast<_Ty&&>(_Arg));
|
||||
}
|
||||
|
||||
template<class _Ty> inline
|
||||
constexpr _Ty&& forward(
|
||||
typename remove_reference<_Ty>::type&& _Arg)
|
||||
{ // forward an rvalue as an rvalue
|
||||
return (static_cast<_Ty&&>(_Arg));
|
||||
}
|
||||
|
||||
|
2
src/driver/sleep_callback.cpp
Normal file
2
src/driver/sleep_callback.cpp
Normal file
@ -0,0 +1,2 @@
|
||||
#include "std_include.hpp"
|
||||
#include "sleep_callback.hpp"
|
2
src/driver/sleep_callback.hpp
Normal file
2
src/driver/sleep_callback.hpp
Normal file
@ -0,0 +1,2 @@
|
||||
#pragma once
|
||||
#include "functional.hpp"
|
54
src/driver/type_traits.hpp
Normal file
54
src/driver/type_traits.hpp
Normal file
@ -0,0 +1,54 @@
|
||||
#pragma once
|
||||
|
||||
namespace std
|
||||
{
|
||||
// TEMPLATE CLASS remove_reference
|
||||
template <class _Ty>
|
||||
struct remove_reference
|
||||
{
|
||||
// remove reference
|
||||
typedef _Ty type;
|
||||
};
|
||||
|
||||
template <class _Ty>
|
||||
struct remove_reference<_Ty&>
|
||||
{
|
||||
// remove reference
|
||||
typedef _Ty type;
|
||||
};
|
||||
|
||||
template <class _Ty>
|
||||
struct remove_reference<_Ty&&>
|
||||
{
|
||||
// remove rvalue reference
|
||||
typedef _Ty type;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
typename remove_reference<T>::type&& move(T&& arg)
|
||||
{
|
||||
return static_cast<typename remove_reference<T>::type&&>(arg);
|
||||
}
|
||||
|
||||
template <class _Ty>
|
||||
using remove_reference_t = typename remove_reference<_Ty>::type;
|
||||
|
||||
// TEMPLATE FUNCTION forward
|
||||
template <class _Ty>
|
||||
inline
|
||||
constexpr _Ty&& forward(
|
||||
typename remove_reference<_Ty>::type& _Arg)
|
||||
{
|
||||
// forward an lvalue as either an lvalue or an rvalue
|
||||
return (static_cast<_Ty&&>(_Arg));
|
||||
}
|
||||
|
||||
template <class _Ty>
|
||||
inline
|
||||
constexpr _Ty&& forward(
|
||||
typename remove_reference<_Ty>::type&& _Arg)
|
||||
{
|
||||
// forward an rvalue as an rvalue
|
||||
return (static_cast<_Ty&&>(_Arg));
|
||||
}
|
||||
}
|
69
src/driver/unique_ptr.hpp
Normal file
69
src/driver/unique_ptr.hpp
Normal file
@ -0,0 +1,69 @@
|
||||
#pragma once
|
||||
#include "type_traits.hpp"
|
||||
|
||||
namespace std
|
||||
{
|
||||
template <typename T>
|
||||
class unique_ptr
|
||||
{
|
||||
unique_ptr() = default;
|
||||
|
||||
unique_ptr(T* pointer)
|
||||
: pointer_(pointer)
|
||||
{
|
||||
}
|
||||
|
||||
~unique_ptr()
|
||||
{
|
||||
if (this->pointer_)
|
||||
{
|
||||
delete this->pointer_;
|
||||
this->pointer_ = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
unique_ptr(unique_ptr<T>&& obj) noexcept
|
||||
: unique_ptr()
|
||||
{
|
||||
this->operator=(std::move(obj));
|
||||
}
|
||||
|
||||
unique_ptr& operator=(unique_ptr<T>&& obj) noexcept
|
||||
{
|
||||
if (this != &obj)
|
||||
{
|
||||
this->~unique_ptr();
|
||||
this->pointer_ = obj.pointer_;
|
||||
obj.pointer_ = nullptr;
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
unique_ptr(const unique_ptr<T>& obj) = delete;
|
||||
unique_ptr& operator=(const unique_ptr<T>& obj) = delete;
|
||||
|
||||
T* operator->()
|
||||
{
|
||||
return this->pointer_;
|
||||
}
|
||||
|
||||
const T* operator->() const
|
||||
{
|
||||
return this->pointer_;
|
||||
}
|
||||
|
||||
T& operator*()
|
||||
{
|
||||
return *this->pointer_;
|
||||
}
|
||||
|
||||
const T& operator*() const
|
||||
{
|
||||
return *this->pointer_;
|
||||
}
|
||||
|
||||
private:
|
||||
T* pointer_{nullptr};
|
||||
};
|
||||
}
|
@ -1,9 +1,9 @@
|
||||
file(GLOB runner_sources ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
|
||||
file(GLOB runner_headers ${CMAKE_CURRENT_SOURCE_DIR}/*.hpp)
|
||||
|
||||
add_executable(runner
|
||||
main.cpp
|
||||
driver.cpp
|
||||
service_handle.cpp
|
||||
native_handle.cpp
|
||||
driver_device.cpp
|
||||
${runner_sources}
|
||||
${runner_headers}
|
||||
)
|
||||
|
||||
target_precompile_headers(runner
|
||||
|
@ -1,3 +1,4 @@
|
||||
#pragma once
|
||||
#include "service_handle.hpp"
|
||||
|
||||
class driver
|
||||
|
@ -30,9 +30,9 @@ bool driver_device::send(const DWORD ioctl_code, const data& input, data& output
|
||||
const auto success = DeviceIoControl(this->device_,
|
||||
ioctl_code,
|
||||
const_cast<uint8_t*>(input.data()),
|
||||
input.size(),
|
||||
static_cast<DWORD>(input.size()),
|
||||
output.data(),
|
||||
output.size(),
|
||||
static_cast<DWORD>(output.size()),
|
||||
&size_returned,
|
||||
nullptr
|
||||
) != FALSE;
|
||||
|
@ -1,3 +1,4 @@
|
||||
#pragma once
|
||||
#include "native_handle.hpp"
|
||||
|
||||
class driver_device
|
||||
|
@ -1,3 +1,5 @@
|
||||
#pragma once
|
||||
|
||||
class native_handle
|
||||
{
|
||||
public:
|
||||
|
@ -1,3 +1,5 @@
|
||||
#pragma once
|
||||
|
||||
class service_handle
|
||||
{
|
||||
public:
|
||||
|
Loading…
x
Reference in New Issue
Block a user