mirror of
https://github.com/momo5502/hypervisor.git
synced 2025-07-05 18:51:53 +00:00
Cleanup user-mode side
This commit is contained in:
@ -1,32 +1,11 @@
|
||||
#include <Windows.h>
|
||||
#include <Shlwapi.h>
|
||||
#include "std_include.hpp"
|
||||
#include "finally.hpp"
|
||||
#include <filesystem>
|
||||
#include "driver.hpp"
|
||||
#include "driver_device.hpp"
|
||||
|
||||
#pragma comment(lib, "Shlwapi.lib")
|
||||
|
||||
#define SERVICE_NAME "MomoLul"
|
||||
|
||||
#define HELLO_DRV_IOCTL CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_NEITHER, FILE_ANY_ACCESS)
|
||||
const char kDevName[] = "\\\\.\\HelloDev";
|
||||
|
||||
HANDLE open_device(const char* device_name)
|
||||
{
|
||||
HANDLE device = CreateFileA(device_name,
|
||||
GENERIC_READ | GENERIC_WRITE,
|
||||
NULL,
|
||||
NULL,
|
||||
OPEN_EXISTING,
|
||||
NULL,
|
||||
NULL
|
||||
);
|
||||
return device;
|
||||
}
|
||||
|
||||
void close_device(HANDLE device)
|
||||
{
|
||||
CloseHandle(device);
|
||||
}
|
||||
|
||||
BOOL send_ioctl(HANDLE device, DWORD ioctl_code)
|
||||
{
|
||||
@ -63,67 +42,36 @@ std::filesystem::path get_current_path()
|
||||
return selfdir;
|
||||
}
|
||||
|
||||
int main(const int /*argc*/, char* /*argv*/[])
|
||||
void unsafe_main(const int /*argc*/, char* /*argv*/[])
|
||||
{
|
||||
const auto manager = OpenSCManagerA(nullptr, nullptr, SC_MANAGER_ALL_ACCESS);
|
||||
if (manager == nullptr)
|
||||
driver driver{get_current_path() / "driver.sys", "MomoLul"};
|
||||
driver_device driver_device{"\\\\.\\HelloDev"};
|
||||
|
||||
driver_device::data input{};
|
||||
input.resize(4);
|
||||
|
||||
(void)driver_device.send(HELLO_DRV_IOCTL, input);
|
||||
|
||||
MessageBoxA(0, "Service started!", 0, 0);
|
||||
}
|
||||
|
||||
int main(const int argc, char* argv[])
|
||||
{
|
||||
try
|
||||
{
|
||||
unsafe_main(argc, argv);
|
||||
return 0;
|
||||
}
|
||||
catch (std::exception& e)
|
||||
{
|
||||
printf("Error: %s\n", e.what());
|
||||
return 1;
|
||||
}
|
||||
|
||||
const auto _1 = utils::finally([&manager]()
|
||||
catch (...)
|
||||
{
|
||||
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);
|
||||
printf("An unknown error occurd!\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (service == nullptr)
|
||||
{
|
||||
service = OpenServiceA(manager, SERVICE_NAME,
|
||||
SERVICE_ALL_ACCESS);
|
||||
}
|
||||
|
||||
if (service)
|
||||
{
|
||||
StartServiceA(service, 0, nullptr);
|
||||
|
||||
HANDLE dev = open_device(kDevName);
|
||||
if (dev == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
printf("Failed!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
send_ioctl(dev, HELLO_DRV_IOCTL);
|
||||
|
||||
close_device(dev);
|
||||
|
||||
MessageBoxA(0, "Service started!", 0, 0);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int __stdcall WinMain(HINSTANCE, HINSTANCE, char*, int)
|
||||
|
Reference in New Issue
Block a user