mirror of
https://github.com/momo5502/hypervisor.git
synced 2025-04-19 13:42: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)
|
||||
|
||||
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)
|
||||
|
||||
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)
|
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
|
||||
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"
|
||||
)
|
||||
add_subdirectory(driver)
|
||||
add_subdirectory(runner)
|
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)
|
||||
{
|
||||
LARGE_INTEGER interval;
|
||||
LARGE_INTEGER interval{};
|
||||
interval.QuadPart = -(10000ll * milliseconds);
|
||||
|
||||
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