diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1eae14d..666e26f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,6 +1,7 @@ wdk_add_driver(driver main.cpp thread.cpp + new.cpp ) cmake_path(NATIVE_PATH PROJECT_SOURCE_DIR NORMALIZE WINDOWS_PROJECT_DIR) diff --git a/src/main.cpp b/src/main.cpp index 34564c3..80a5108 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,5 @@ -#include +#include "std_include.hpp" #include "logging.hpp" -#include "nt_ext.hpp" #include "thread.hpp" @@ -14,7 +13,6 @@ void unload(PDRIVER_OBJECT /*DriverObject*/) extern "C" NTSTATUS DriverEntry(const PDRIVER_OBJECT DriverObject, PUNICODE_STRING /*RegistryPath*/) { DriverObject->DriverUnload = unload; - debug_log("Hello World\n"); volatile long i = 0; diff --git a/src/new.cpp b/src/new.cpp new file mode 100644 index 0000000..bb1fcb8 --- /dev/null +++ b/src/new.cpp @@ -0,0 +1,48 @@ +#include "std_include.hpp" +#include "new.hpp" + +void* __cdecl operator new(const size_t size, const POOL_TYPE pool, const unsigned long tag) +{ + return ExAllocatePoolWithTag(pool, size, tag); +} + +void* __cdecl operator new[](const size_t size, const POOL_TYPE pool, const unsigned long tag) +{ + return ExAllocatePoolWithTag(pool, size, tag); +} + +void* __cdecl operator new(const size_t size) +{ + return operator new(size, NonPagedPool); +} + +void* __cdecl operator new[](const size_t size) +{ + return operator new[](size, NonPagedPool); +} + +// Placement new +inline void* operator new(size_t, void* where) +{ + return where; +} + +void __cdecl operator delete(void* ptr, size_t) +{ + ExFreePool(ptr); +} + +void __cdecl operator delete(void* ptr) +{ + ExFreePool(ptr); +} + +void __cdecl operator delete[](void* ptr, size_t) +{ + ExFreePool(ptr); +} + +void __cdecl operator delete[](void* ptr) +{ + ExFreePool(ptr); +} diff --git a/src/new.hpp b/src/new.hpp new file mode 100644 index 0000000..94bba9e --- /dev/null +++ b/src/new.hpp @@ -0,0 +1,54 @@ +#pragma once + +void* __cdecl operator new(size_t size, POOL_TYPE pool, unsigned long tag = 'momo'); +void* __cdecl operator new[](size_t size, POOL_TYPE pool, unsigned long tag = 'momo'); +void* __cdecl operator new(size_t size); +void* __cdecl operator new[](size_t size); + +inline void* operator new(size_t, void* where); + +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/std_include.hpp b/src/std_include.hpp new file mode 100644 index 0000000..c060a19 --- /dev/null +++ b/src/std_include.hpp @@ -0,0 +1,5 @@ +#pragma once + +#include +#include "nt_ext.hpp" +#include "new.hpp" \ No newline at end of file diff --git a/src/thread.cpp b/src/thread.cpp index 142b6c5..3acae45 100644 --- a/src/thread.cpp +++ b/src/thread.cpp @@ -1,6 +1,5 @@ #include "thread.hpp" -#include -#include "nt_ext.hpp" +#include "std_include.hpp" namespace thread {