diff --git a/.gitmodules b/.gitmodules index 3b93c47..98631d7 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,4 @@ [submodule "external/vcrtl"] path = external/vcrtl url = https://github.com/avakar/vcrtl.git + ignore = dirty diff --git a/cmake/utils.cmake b/cmake/utils.cmake index df2b357..30ccd03 100644 --- a/cmake/utils.cmake +++ b/cmake/utils.cmake @@ -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() ########################################## diff --git a/external/CMakeLists.txt b/external/CMakeLists.txt index 4d181ec..117aa86 100644 --- a/external/CMakeLists.txt +++ b/external/CMakeLists.txt @@ -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 $ --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) diff --git a/src/driver/CMakeLists.txt b/src/driver/CMakeLists.txt index 6fe7caf..feba51c 100644 --- a/src/driver/CMakeLists.txt +++ b/src/driver/CMakeLists.txt @@ -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) diff --git a/src/driver/driver_main.cpp b/src/driver/driver_main.cpp index 7ca416e..cad9cfc 100644 --- a/src/driver/driver_main.cpp +++ b/src/driver/driver_main.cpp @@ -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]() diff --git a/src/driver/functional.hpp b/src/driver/functional.hpp new file mode 100644 index 0000000..70aed0f --- /dev/null +++ b/src/driver/functional.hpp @@ -0,0 +1,55 @@ +#pragma once +#include "unique_ptr.hpp" + +namespace std +{ + template + struct function; + + template + struct function + { + private: + struct fn_interface + { + virtual ~fn_interface() = default; + virtual Result operator()(Args ...) const = 0; + }; + + template + struct fn_implementation : fn_interface + { + fn_implementation(F&& f) : f_(std::forward(f)) + { + } + + Result operator()(Args ... a) const override + { + f_(std::forward(a)...); + } + + F f_; + }; + + std::unique_ptr fn{}; + + public: + template + function(T&& t) + : fn(new fn_implementation(std::forward(t))) + { + } + + ~function() = default; + function(function&&) noexcept = default; + function& operator=(function&&) noexcept = default; + + function(const function&) = delete; + function& operator=(const function&) = delete; + + Result operator()(Args ... args) const + { + return (*fn)(std::forward(args)...); + } + }; +} diff --git a/src/driver/new.cpp b/src/driver/new.cpp index bb1fcb8..494f612 100644 --- a/src/driver/new.cpp +++ b/src/driver/new.cpp @@ -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) { diff --git a/src/driver/new.hpp b/src/driver/new.hpp index 94bba9e..f09a4bf 100644 --- a/src/driver/new.hpp +++ b/src/driver/new.hpp @@ -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 -struct remove_reference -{ // remove reference - typedef _Ty type; -}; - -template -struct remove_reference<_Ty&> -{ // remove reference - typedef _Ty type; -}; - -template -struct remove_reference<_Ty&&> -{ // remove rvalue reference - typedef _Ty type; -}; - -template -typename remove_reference::type&& move(T&& arg) -{ - return static_cast::type&&>(arg); -} - -// TEMPLATE FUNCTION forward -template 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 inline -constexpr _Ty&& forward( - typename remove_reference<_Ty>::type&& _Arg) -{ // forward an rvalue as an rvalue - return (static_cast<_Ty&&>(_Arg)); -} - diff --git a/src/driver/sleep_callback.cpp b/src/driver/sleep_callback.cpp new file mode 100644 index 0000000..f1fea29 --- /dev/null +++ b/src/driver/sleep_callback.cpp @@ -0,0 +1,2 @@ +#include "std_include.hpp" +#include "sleep_callback.hpp" diff --git a/src/driver/sleep_callback.hpp b/src/driver/sleep_callback.hpp new file mode 100644 index 0000000..3cff8f7 --- /dev/null +++ b/src/driver/sleep_callback.hpp @@ -0,0 +1,2 @@ +#pragma once +#include "functional.hpp" \ No newline at end of file diff --git a/src/driver/type_traits.hpp b/src/driver/type_traits.hpp new file mode 100644 index 0000000..625972c --- /dev/null +++ b/src/driver/type_traits.hpp @@ -0,0 +1,54 @@ +#pragma once + +namespace std +{ + // TEMPLATE CLASS remove_reference + template + struct remove_reference + { + // remove reference + typedef _Ty type; + }; + + template + struct remove_reference<_Ty&> + { + // remove reference + typedef _Ty type; + }; + + template + struct remove_reference<_Ty&&> + { + // remove rvalue reference + typedef _Ty type; + }; + + template + typename remove_reference::type&& move(T&& arg) + { + return static_cast::type&&>(arg); + } + + template + using remove_reference_t = typename remove_reference<_Ty>::type; + + // TEMPLATE FUNCTION forward + template + 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 + inline + constexpr _Ty&& forward( + typename remove_reference<_Ty>::type&& _Arg) + { + // forward an rvalue as an rvalue + return (static_cast<_Ty&&>(_Arg)); + } +} diff --git a/src/driver/unique_ptr.hpp b/src/driver/unique_ptr.hpp new file mode 100644 index 0000000..8585fa5 --- /dev/null +++ b/src/driver/unique_ptr.hpp @@ -0,0 +1,69 @@ +#pragma once +#include "type_traits.hpp" + +namespace std +{ + template + 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&& obj) noexcept + : unique_ptr() + { + this->operator=(std::move(obj)); + } + + unique_ptr& operator=(unique_ptr&& obj) noexcept + { + if (this != &obj) + { + this->~unique_ptr(); + this->pointer_ = obj.pointer_; + obj.pointer_ = nullptr; + } + + return *this; + } + + unique_ptr(const unique_ptr& obj) = delete; + unique_ptr& operator=(const unique_ptr& 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}; + }; +} diff --git a/src/runner/CMakeLists.txt b/src/runner/CMakeLists.txt index 0f50462..8fd0e62 100644 --- a/src/runner/CMakeLists.txt +++ b/src/runner/CMakeLists.txt @@ -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 diff --git a/src/runner/driver.hpp b/src/runner/driver.hpp index 861df1e..20f2e7b 100644 --- a/src/runner/driver.hpp +++ b/src/runner/driver.hpp @@ -1,3 +1,4 @@ +#pragma once #include "service_handle.hpp" class driver diff --git a/src/runner/driver_device.cpp b/src/runner/driver_device.cpp index ced1747..b34ea80 100644 --- a/src/runner/driver_device.cpp +++ b/src/runner/driver_device.cpp @@ -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(input.data()), - input.size(), + static_cast(input.size()), output.data(), - output.size(), + static_cast(output.size()), &size_returned, nullptr ) != FALSE; diff --git a/src/runner/driver_device.hpp b/src/runner/driver_device.hpp index 86da7b2..eaab3ea 100644 --- a/src/runner/driver_device.hpp +++ b/src/runner/driver_device.hpp @@ -1,3 +1,4 @@ +#pragma once #include "native_handle.hpp" class driver_device diff --git a/src/runner/native_handle.hpp b/src/runner/native_handle.hpp index 3cb23bc..3c7c045 100644 --- a/src/runner/native_handle.hpp +++ b/src/runner/native_handle.hpp @@ -1,3 +1,5 @@ +#pragma once + class native_handle { public: diff --git a/src/runner/service_handle.hpp b/src/runner/service_handle.hpp index b2377d1..8d761e6 100644 --- a/src/runner/service_handle.hpp +++ b/src/runner/service_handle.hpp @@ -1,3 +1,5 @@ +#pragma once + class service_handle { public: