summaryrefslogtreecommitdiffstats
path: root/xmrstak/backend
diff options
context:
space:
mode:
authorpsychocrypt <psychocrypt@users.noreply.github.com>2017-10-05 22:15:32 +0200
committerGitHub <noreply@github.com>2017-10-05 22:15:32 +0200
commite96a761d5a748ab06749a18db5e16d87739d7716 (patch)
tree5619ff90e4701dd22a39cac4cee27a217b00f54c /xmrstak/backend
parent34a87c64a19cbdd9f73eb0142b9e6f3f573e726e (diff)
parentf6b310dc86ec437c6df0f0f036f763bbdf010cba (diff)
downloadxmr-stak-e96a761d5a748ab06749a18db5e16d87739d7716.zip
xmr-stak-e96a761d5a748ab06749a18db5e16d87739d7716.tar.gz
Merge pull request #12 from fireice-uk/topic-large-pages-win
Fix large pages on Windows and make them more user-friendly
Diffstat (limited to 'xmrstak/backend')
-rw-r--r--xmrstak/backend/backendConnector.cpp3
-rw-r--r--xmrstak/backend/cpu/crypto/cryptonight_common.cpp93
2 files changed, 91 insertions, 5 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..0690415 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>
@@ -70,6 +71,8 @@ void do_skein_hash(const void* input, size_t len, char* output) {
void (* const extra_hashes[4])(const void *, size_t, char *) = {do_blake_hash, do_groestl_hash, do_jh_hash, do_skein_hash};
#ifdef _WIN32
+BOOL bRebootDesirable = FALSE; //If VirtualAlloc fails, suggest a reboot
+
BOOL AddPrivilege(TCHAR* pszPrivilege)
{
HANDLE hToken;
@@ -92,16 +95,97 @@ 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";
+ bRebootDesirable = TRUE;
+ }
+ else
+ msg->warning = "Obtaning SeLockMemoryPrivilege failed.";
+
return 0;
}
+
+ bRebootDesirable = TRUE;
return 1;
#else
return 1;
@@ -133,7 +217,10 @@ cryptonight_ctx* cryptonight_alloc_ctx(size_t use_fast_mem, size_t use_mlock, al
if(ptr->long_state == NULL)
{
_mm_free(ptr);
- msg->warning = "VirtualAlloc failed.";
+ if(bRebootDesirable)
+ msg->warning = "VirtualAlloc failed. Reboot might help.";
+ else
+ msg->warning = "VirtualAlloc failed.";
return NULL;
}
else
OpenPOWER on IntegriCloud