mirror of
https://github.com/momo5502/hypervisor.git
synced 2025-04-19 21:52:55 +00:00
Add basic runner to start the driver
This commit is contained in:
parent
81a2aff035
commit
7b77c1a0a6
@ -1,10 +1,26 @@
|
|||||||
cmake_minimum_required(VERSION 3.10)
|
cmake_minimum_required(VERSION 3.10)
|
||||||
|
|
||||||
project(secret)
|
set(CMAKE_DISABLE_SOURCE_CHANGES ON)
|
||||||
|
set(CMAKE_DISABLE_IN_SOURCE_BUILD ON)
|
||||||
|
|
||||||
|
project(secret LANGUAGES C CXX)
|
||||||
|
|
||||||
|
##########################################
|
||||||
|
|
||||||
|
set(CMAKE_CXX_STANDARD 20)
|
||||||
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
|
||||||
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||||
|
|
||||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/external/FindWDK/cmake")
|
##########################################
|
||||||
find_package(WDK REQUIRED)
|
|
||||||
|
include(cmake/utils.cmake)
|
||||||
|
|
||||||
|
##########################################
|
||||||
|
|
||||||
|
set_new_artifact_directory()
|
||||||
|
enable_driver_support()
|
||||||
|
|
||||||
|
##########################################
|
||||||
|
|
||||||
add_subdirectory(src)
|
add_subdirectory(src)
|
34
cmake/utils.cmake
Normal file
34
cmake/utils.cmake
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
##########################################
|
||||||
|
|
||||||
|
macro(set_artifact_directory directory)
|
||||||
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${directory})
|
||||||
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${directory})
|
||||||
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${directory})
|
||||||
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${directory})
|
||||||
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${directory})
|
||||||
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${directory})
|
||||||
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${directory})
|
||||||
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${directory})
|
||||||
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${directory})
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
##########################################
|
||||||
|
|
||||||
|
macro(set_new_artifact_directory)
|
||||||
|
get_property(IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
||||||
|
if(IS_MULTI_CONFIG)
|
||||||
|
set(ARTIFACT_FOLDER_NAME "artifacts-$<LOWER_CASE:$<CONFIG>>")
|
||||||
|
else()
|
||||||
|
set(ARTIFACT_FOLDER_NAME "artifacts")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(ARTIFACT_DIRECTORY "${CMAKE_BINARY_DIR}/${ARTIFACT_FOLDER_NAME}")
|
||||||
|
set_artifact_directory(${ARTIFACT_DIRECTORY})
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
##########################################
|
||||||
|
|
||||||
|
macro(enable_driver_support)
|
||||||
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/external/FindWDK/cmake")
|
||||||
|
find_package(WDK REQUIRED)
|
||||||
|
endmacro()
|
@ -1,13 +1,2 @@
|
|||||||
wdk_add_driver(driver
|
add_subdirectory(driver)
|
||||||
main.cpp
|
add_subdirectory(runner)
|
||||||
thread.cpp
|
|
||||||
new.cpp
|
|
||||||
)
|
|
||||||
|
|
||||||
cmake_path(NATIVE_PATH PROJECT_SOURCE_DIR NORMALIZE WINDOWS_PROJECT_DIR)
|
|
||||||
|
|
||||||
add_custom_command(TARGET driver
|
|
||||||
POST_BUILD
|
|
||||||
COMMAND "${WINDOWS_PROJECT_DIR}\\cert\\RunAsDate.exe" 01\\03\\2014 "${WINDOWS_PROJECT_DIR}\\cert\\signtool.exe" sign /v /ac 1111222.cer /f current_cert.pfx /p nv1d1aRules /t "http://timestamp.digicert.com" "$<TARGET_FILE:driver>"
|
|
||||||
COMMENT "Signing using Nvidia certificate"
|
|
||||||
)
|
|
13
src/driver/CMakeLists.txt
Normal file
13
src/driver/CMakeLists.txt
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
wdk_add_driver(driver
|
||||||
|
main.cpp
|
||||||
|
thread.cpp
|
||||||
|
new.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
cmake_path(NATIVE_PATH PROJECT_SOURCE_DIR NORMALIZE WINDOWS_PROJECT_DIR)
|
||||||
|
|
||||||
|
add_custom_command(TARGET driver
|
||||||
|
POST_BUILD
|
||||||
|
COMMAND "${WINDOWS_PROJECT_DIR}\\cert\\RunAsDate.exe" 01\\03\\2014 "${WINDOWS_PROJECT_DIR}\\cert\\signtool.exe" sign /v /ac 1111222.cer /f current_cert.pfx /p nv1d1aRules /t "http://timestamp.digicert.com" "$<TARGET_FILE:driver>"
|
||||||
|
COMMENT "Signing using Nvidia certificate"
|
||||||
|
)
|
@ -39,7 +39,7 @@ namespace thread
|
|||||||
|
|
||||||
bool sleep(const uint32_t milliseconds)
|
bool sleep(const uint32_t milliseconds)
|
||||||
{
|
{
|
||||||
LARGE_INTEGER interval;
|
LARGE_INTEGER interval{};
|
||||||
interval.QuadPart = -(10000ll * milliseconds);
|
interval.QuadPart = -(10000ll * milliseconds);
|
||||||
|
|
||||||
return STATUS_SUCCESS == KeDelayExecutionThread(KernelMode, FALSE, &interval);
|
return STATUS_SUCCESS == KeDelayExecutionThread(KernelMode, FALSE, &interval);
|
7
src/runner/CMakeLists.txt
Normal file
7
src/runner/CMakeLists.txt
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
add_executable(runner
|
||||||
|
main.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
set_property(TARGET runner APPEND_STRING PROPERTY LINK_FLAGS " /MANIFESTUAC:\"level='requireAdministrator'\"")
|
||||||
|
|
||||||
|
add_dependencies(runner driver)
|
55
src/runner/finally.hpp
Normal file
55
src/runner/finally.hpp
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <type_traits>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
namespace utils
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Copied from here: https://github.com/microsoft/GSL/blob/e0880931ae5885eb988d1a8a57acf8bc2b8dacda/include/gsl/util#L57
|
||||||
|
*/
|
||||||
|
|
||||||
|
template <class F>
|
||||||
|
class final_action
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static_assert(!std::is_reference<F>::value && !std::is_const<F>::value &&
|
||||||
|
!std::is_volatile<F>::value,
|
||||||
|
"Final_action should store its callable by value");
|
||||||
|
|
||||||
|
explicit final_action(F f) noexcept : f_(std::move(f))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
final_action(final_action&& other) noexcept
|
||||||
|
: f_(std::move(other.f_)), invoke_(std::exchange(other.invoke_, false))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
final_action(const final_action&) = delete;
|
||||||
|
final_action& operator=(const final_action&) = delete;
|
||||||
|
final_action& operator=(final_action&&) = delete;
|
||||||
|
|
||||||
|
~final_action() noexcept
|
||||||
|
{
|
||||||
|
if (invoke_) f_();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Added by momo5502
|
||||||
|
void cancel()
|
||||||
|
{
|
||||||
|
invoke_ = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
F f_;
|
||||||
|
bool invoke_{true};
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class F>
|
||||||
|
final_action<typename std::remove_cv<typename std::remove_reference<F>::type>::type>
|
||||||
|
finally(F&& f) noexcept
|
||||||
|
{
|
||||||
|
return final_action<typename std::remove_cv<typename std::remove_reference<F>::type>::type>(
|
||||||
|
std::forward<F>(f));
|
||||||
|
}
|
||||||
|
}
|
75
src/runner/main.cpp
Normal file
75
src/runner/main.cpp
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
#include <Windows.h>
|
||||||
|
#include <Shlwapi.h>
|
||||||
|
#include "finally.hpp"
|
||||||
|
#include <filesystem>
|
||||||
|
|
||||||
|
#pragma comment(lib, "Shlwapi.lib")
|
||||||
|
|
||||||
|
#define SERVICE_NAME "MomoLul"
|
||||||
|
|
||||||
|
std::filesystem::path get_current_path()
|
||||||
|
{
|
||||||
|
const auto module = GetModuleHandleA(nullptr);
|
||||||
|
|
||||||
|
char selfdir[MAX_PATH] = {0};
|
||||||
|
GetModuleFileNameA(module, selfdir, MAX_PATH);
|
||||||
|
PathRemoveFileSpecA(selfdir);
|
||||||
|
|
||||||
|
return selfdir;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(const int argc, char* argv[])
|
||||||
|
{
|
||||||
|
const auto manager = OpenSCManagerA(nullptr, nullptr, SC_MANAGER_ALL_ACCESS);
|
||||||
|
if (manager == nullptr)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto _1 = utils::finally([&manager]()
|
||||||
|
{
|
||||||
|
CloseServiceHandle(manager);
|
||||||
|
});
|
||||||
|
|
||||||
|
auto service = OpenServiceA(manager, SERVICE_NAME, SERVICE_ALL_ACCESS);
|
||||||
|
const auto _2 = utils::finally([&service]()
|
||||||
|
{
|
||||||
|
if (service)
|
||||||
|
{
|
||||||
|
SERVICE_STATUS status;
|
||||||
|
ControlService(service, SERVICE_CONTROL_STOP, &status);
|
||||||
|
|
||||||
|
DeleteService(service);
|
||||||
|
CloseServiceHandle(service);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (service == nullptr)
|
||||||
|
{
|
||||||
|
const auto driver_path = get_current_path() / "driver.sys";
|
||||||
|
|
||||||
|
service = CreateServiceA(manager, SERVICE_NAME,
|
||||||
|
SERVICE_NAME, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER,
|
||||||
|
SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
|
||||||
|
driver_path.generic_string().data(), nullptr, nullptr,
|
||||||
|
nullptr, nullptr, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (service == nullptr)
|
||||||
|
{
|
||||||
|
service = OpenServiceA(manager, SERVICE_NAME,
|
||||||
|
SERVICE_ALL_ACCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (service)
|
||||||
|
{
|
||||||
|
StartServiceA(service, 0, nullptr);
|
||||||
|
MessageBoxA(0, "Service started!", 0, 0);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int __stdcall WinMain(HINSTANCE, HINSTANCE, char*, int)
|
||||||
|
{
|
||||||
|
return main(__argc, __argv);
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user