From 1d4c8dda96640e9e2bffb8c86bfa0dcc4d1ed173 Mon Sep 17 00:00:00 2001 From: XMRig Date: Mon, 16 Dec 2019 03:41:58 +0700 Subject: [PATCH] #1423 Implemented driver reuse. --- src/crypto/rx/Rx_windows.cpp | 67 +++++++++++++++++++++++------------- 1 file changed, 43 insertions(+), 24 deletions(-) diff --git a/src/crypto/rx/Rx_windows.cpp b/src/crypto/rx/Rx_windows.cpp index 3436c1ae..0c46eb0d 100644 --- a/src/crypto/rx/Rx_windows.cpp +++ b/src/crypto/rx/Rx_windows.cpp @@ -58,6 +58,7 @@ enum MsrMod : uint32_t { static const char *tag = YELLOW_BG_BOLD(WHITE_BOLD_S " msr ") " "; static const std::array modNames = { nullptr, "Ryzen", "Intel" }; +static bool reuseDriver = false; static SC_HANDLE hManager; @@ -71,16 +72,18 @@ static bool wrmsr_uninstall_driver() } bool result = true; - SERVICE_STATUS serviceStatus; - if (!ControlService(hService, SERVICE_CONTROL_STOP, &serviceStatus)) { - LOG_ERR(CLEAR "%s" RED_S "failed to stop WinRing0 driver, error %u", tag, GetLastError()); - result = false; - } + if (!reuseDriver) { + SERVICE_STATUS serviceStatus; - if (!DeleteService(hService)) { - LOG_ERR(CLEAR "%s" RED_S "failed to remove WinRing0 driver, error %u", tag, GetLastError()); - result = false; + if (!ControlService(hService, SERVICE_CONTROL_STOP, &serviceStatus)) { + result = false; + } + + if (!DeleteService(hService)) { + LOG_ERR(CLEAR "%s" RED_S "failed to remove WinRing0 driver, error %u", tag, GetLastError()); + result = false; + } } CloseServiceHandle(hService); @@ -133,27 +136,43 @@ static HANDLE wrmsr_install_driver() driverPath += L"WinRing0x64.sys"; hService = OpenServiceW(hManager, SERVICE_NAME, SERVICE_ALL_ACCESS); - if (hService && !wrmsr_uninstall_driver()) { - return nullptr; + if (hService) { + LOG_WARN(CLEAR "%s" YELLOW("service ") YELLOW_BOLD("WinRing0_1_2_0") YELLOW(" is already exists"), tag); + + SERVICE_STATUS status; + const auto rc = QueryServiceStatus(hService, &status); + + if (rc && status.dwCurrentState == SERVICE_RUNNING) { + reuseDriver = true; + } + else if (!wrmsr_uninstall_driver()) { + return nullptr; + } } - hService = CreateServiceW(hManager, SERVICE_NAME, SERVICE_NAME, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, driverPath.c_str(), nullptr, nullptr, nullptr, nullptr, nullptr); - if (!hService) { - LOG_ERR(CLEAR "%s" RED_S "failed to install WinRing0 driver, error %u", tag, GetLastError()); - - return nullptr; - } - - if (!StartService(hService, 0, nullptr)) { - err = GetLastError(); - if (err != ERROR_SERVICE_ALREADY_RUNNING) { - LOG_ERR(CLEAR "%s" RED_S "failed to start WinRing0 driver, error %u", tag, err); - - CloseServiceHandle(hService); - hService = nullptr; + if (!reuseDriver) { + hService = CreateServiceW(hManager, SERVICE_NAME, SERVICE_NAME, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, driverPath.c_str(), nullptr, nullptr, nullptr, nullptr, nullptr); + if (!hService) { + LOG_ERR(CLEAR "%s" RED_S "failed to install WinRing0 driver, error %u", tag, GetLastError()); return nullptr; } + + if (!StartService(hService, 0, nullptr)) { + err = GetLastError(); + if (err != ERROR_SERVICE_ALREADY_RUNNING) { + if (err == ERROR_FILE_NOT_FOUND) { + LOG_ERR(CLEAR "%s" RED("failed to start WinRing0 driver: ") RED_BOLD("\"WinRing0x64.sys not found\""), tag); + } + else { + LOG_ERR(CLEAR "%s" RED_S "failed to start WinRing0 driver, error %u", tag, err); + } + + wrmsr_uninstall_driver(); + + return nullptr; + } + } } HANDLE hDriver = CreateFileW(L"\\\\.\\" SERVICE_NAME, GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);