This commit is contained in:
momo5502 2022-03-26 13:50:56 +01:00
parent b56b9e5afa
commit eef4a9a5a2
18 changed files with 225 additions and 63 deletions

1
.gitmodules vendored
View File

@ -4,3 +4,4 @@
[submodule "external/vcrtl"] [submodule "external/vcrtl"]
path = external/vcrtl path = external/vcrtl
url = https://github.com/avakar/vcrtl.git url = https://github.com/avakar/vcrtl.git
ignore = dirty

View File

@ -9,6 +9,7 @@ ExternalProject_Add(
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/vcrtl SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/vcrtl
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/vcrtl BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/vcrtl
BUILD_COMMAND "${CMAKE_COMMAND}" --build ${CMAKE_CURRENT_BINARY_DIR}/vcrtl --config $<CONFIG> --target vcrtl_driver 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 "" INSTALL_COMMAND ""
USES_TERMINAL_CONFIGURE 1 USES_TERMINAL_CONFIGURE 1
USES_TERMINAL_BUILD 1 USES_TERMINAL_BUILD 1
@ -16,7 +17,6 @@ ExternalProject_Add(
BUILD_BYPRODUCTS "${VCRTL_LIBRARY}" BUILD_BYPRODUCTS "${VCRTL_LIBRARY}"
CMAKE_ARGS CMAKE_ARGS
"-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
"-DCMAKE_CONFIGURATION_TYPES=${CMAKE_CONFIGURATION_TYPES}"
"-DCMAKE_SHARED_LINKER_FLAGS=${CMAKE_SHARED_LINKER_FLAGS}" "-DCMAKE_SHARED_LINKER_FLAGS=${CMAKE_SHARED_LINKER_FLAGS}"
"-DCMAKE_MODULE_LINKER_FLAGS=${CMAKE_MODULE_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_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}"
"-DCMAKE_MSVC_RUNTIME_LIBRARY=${CMAKE_MSVC_RUNTIME_LIBRARY}" "-DCMAKE_MSVC_RUNTIME_LIBRARY=${CMAKE_MSVC_RUNTIME_LIBRARY}"
"-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}"
) )
add_library(vcrtl_driver INTERFACE) add_library(vcrtl_driver INTERFACE)

View File

@ -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 wdk_add_driver(driver
driver_main.cpp ${driver_sources}
thread.cpp ${driver_header}
new.cpp )
target_precompile_headers(driver
PRIVATE std_include.hpp
) )
cmake_path(NATIVE_PATH PROJECT_SOURCE_DIR NORMALIZE WINDOWS_PROJECT_DIR) cmake_path(NATIVE_PATH PROJECT_SOURCE_DIR NORMALIZE WINDOWS_PROJECT_DIR)

View File

@ -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*/) extern "C" NTSTATUS DriverEntry(const PDRIVER_OBJECT DriverObject, PUNICODE_STRING /*RegistryPath*/)
{ {
DriverObject->DriverUnload = unload; DriverObject->DriverUnload = unload;
debug_log("Hello World\n"); debug_log("Hello World\n");
delete(new int);
volatile long i = 0; volatile long i = 0;
thread::dispatch_on_all_cores([&i]() thread::dispatch_on_all_cores([&i]()

55
src/driver/functional.hpp Normal file
View 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)...);
}
};
}

View File

@ -1,5 +1,6 @@
#include "std_include.hpp" #include "std_include.hpp"
#include "new.hpp" #include "new.hpp"
#include "logging.hpp"
void* __cdecl operator new(const size_t size, const POOL_TYPE pool, const unsigned long tag) void* __cdecl operator new(const size_t size, const POOL_TYPE pool, const unsigned long tag)
{ {

View File

@ -11,44 +11,3 @@ void __cdecl operator delete(void *ptr, size_t);
void __cdecl operator delete(void *ptr); void __cdecl operator delete(void *ptr);
void __cdecl operator delete[](void *ptr, size_t); void __cdecl operator delete[](void *ptr, size_t);
void __cdecl operator delete[](void *ptr); 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));
}

View File

@ -0,0 +1,2 @@
#include "std_include.hpp"
#include "sleep_callback.hpp"

View File

@ -0,0 +1,2 @@
#pragma once
#include "functional.hpp"

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

View File

@ -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 add_executable(runner
main.cpp ${runner_sources}
driver.cpp ${runner_headers}
service_handle.cpp
native_handle.cpp
driver_device.cpp
) )
target_precompile_headers(runner target_precompile_headers(runner

View File

@ -1,3 +1,4 @@
#pragma once
#include "service_handle.hpp" #include "service_handle.hpp"
class driver class driver

View File

@ -30,9 +30,9 @@ bool driver_device::send(const DWORD ioctl_code, const data& input, data& output
const auto success = DeviceIoControl(this->device_, const auto success = DeviceIoControl(this->device_,
ioctl_code, ioctl_code,
const_cast<uint8_t*>(input.data()), const_cast<uint8_t*>(input.data()),
input.size(), static_cast<DWORD>(input.size()),
output.data(), output.data(),
output.size(), static_cast<DWORD>(output.size()),
&size_returned, &size_returned,
nullptr nullptr
) != FALSE; ) != FALSE;

View File

@ -1,3 +1,4 @@
#pragma once
#include "native_handle.hpp" #include "native_handle.hpp"
class driver_device class driver_device

View File

@ -1,3 +1,5 @@
#pragma once
class native_handle class native_handle
{ {
public: public:

View File

@ -1,3 +1,5 @@
#pragma once
class service_handle class service_handle
{ {
public: public: