diff options
author | fireice-uk <fireice-uk@users.noreply.github.com> | 2017-10-04 18:52:46 +0100 |
---|---|---|
committer | fireice-uk <fireice-uk@users.noreply.github.com> | 2017-10-04 18:52:46 +0100 |
commit | 821fe09e97e71247f5454caa7076263647056aa8 (patch) | |
tree | 73beff1c770dfc2ae7137c7b6d8d16d1f9d8f206 /xmrstak/backend | |
parent | 8ee452eefae9be9d467602052131d3c5c9c0afb9 (diff) | |
download | xmr-stak-821fe09e97e71247f5454caa7076263647056aa8.zip xmr-stak-821fe09e97e71247f5454caa7076263647056aa8.tar.gz |
- Add large page initialisation on Windows
- Add a proper UAC manifest requesting elevation when we start
- Fix self_test() - this is integral part of initialisation
Diffstat (limited to 'xmrstak/backend')
-rw-r--r-- | xmrstak/backend/backendConnector.cpp | 3 | ||||
-rw-r--r-- | xmrstak/backend/cpu/crypto/cryptonight_common.cpp | 81 |
2 files changed, 80 insertions, 4 deletions
diff --git a/xmrstak/backend/backendConnector.cpp b/xmrstak/backend/backendConnector.cpp index 6106267..28ba1ac 100644 --- a/xmrstak/backend/backendConnector.cpp +++ b/xmrstak/backend/backendConnector.cpp @@ -52,8 +52,7 @@ namespace xmrstak bool BackendConnector::self_test() { - - return true; + return cpu::minethd::self_test(); } std::vector<iBackend*>* BackendConnector::thread_starter(miner_work& pWork) diff --git a/xmrstak/backend/cpu/crypto/cryptonight_common.cpp b/xmrstak/backend/cpu/crypto/cryptonight_common.cpp index 9d03ed7..1cff5bb 100644 --- a/xmrstak/backend/cpu/crypto/cryptonight_common.cpp +++ b/xmrstak/backend/cpu/crypto/cryptonight_common.cpp @@ -45,6 +45,7 @@ extern "C" #ifdef _WIN32 #include <windows.h> +#include <ntsecapi.h> #else #include <sys/mman.h> #include <errno.h> @@ -92,14 +93,90 @@ BOOL AddPrivilege(TCHAR* pszPrivilege) CloseHandle(hToken); return TRUE; } + +BOOL AddLargePageRights() +{ + HANDLE hToken; + PTOKEN_USER user = NULL; + + if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken) == TRUE) + { + TOKEN_ELEVATION Elevation; + DWORD cbSize = sizeof(TOKEN_ELEVATION); + BOOL bIsElevated = FALSE; + + if (GetTokenInformation(hToken, TokenElevation, &Elevation, sizeof(Elevation), &cbSize)) + bIsElevated = Elevation.TokenIsElevated; + + DWORD size = 0; + GetTokenInformation(hToken, TokenUser, NULL, 0, &size); + + if (size > 0 && bIsElevated) + { + user = (PTOKEN_USER)LocalAlloc(LPTR, size); + GetTokenInformation(hToken, TokenUser, user, size, &size); + } + + CloseHandle(hToken); + } + + if (!user) + return FALSE; + + LSA_HANDLE handle; + LSA_OBJECT_ATTRIBUTES attributes; + ZeroMemory(&attributes, sizeof(attributes)); + + BOOL result = FALSE; + if (LsaOpenPolicy(NULL, &attributes, POLICY_ALL_ACCESS, &handle) == 0) + { + LSA_UNICODE_STRING lockmem; + lockmem.Buffer = L"SeLockMemoryPrivilege"; + lockmem.Length = 42; + lockmem.MaximumLength = 44; + + PLSA_UNICODE_STRING rights = NULL; + ULONG cnt = 0; + BOOL bHasRights = FALSE; + if (LsaEnumerateAccountRights(handle, user->User.Sid, &rights, &cnt) == 0) + { + for (size_t i = 0; i < cnt; i++) + { + if (rights[i].Length == lockmem.Length && + memcmp(rights[i].Buffer, lockmem.Buffer, 42) == 0) + { + bHasRights = TRUE; + break; + } + } + + LsaFreeMemory(rights); + } + + if(!bHasRights) + result = LsaAddAccountRights(handle, user->User.Sid, &lockmem, 1) == 0; + + LsaClose(handle); + } + + LocalFree(user); + return result; +} #endif size_t cryptonight_init(size_t use_fast_mem, size_t use_mlock, alloc_msg* msg) { #ifdef _WIN32 - if (AddPrivilege(TEXT("SeLockMemoryPrivilege")) == 0) + if(use_fast_mem == 0) + return 1; + + if(AddPrivilege(TEXT("SeLockMemoryPrivilege")) == 0) { - msg->warning = "Obtaning SeLockMemoryPrivilege failed."; + if(AddLargePageRights()) + msg->warning = "Added SeLockMemoryPrivilege to the current account. You need to reboot for it to work"; + else + msg->warning = "Obtaning SeLockMemoryPrivilege failed."; + return 0; } return 1; |