You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
2.6 KiB
98 lines
2.6 KiB
// Windows/MemoryLock.cpp
|
|
|
|
#include "StdAfx.h"
|
|
|
|
#include "MemoryLock.h"
|
|
|
|
namespace NWindows {
|
|
namespace NSecurity {
|
|
|
|
#ifndef UNDER_CE
|
|
|
|
#ifdef _UNICODE
|
|
#define MY_FUNC_SELECT(f) :: f
|
|
#else
|
|
#define MY_FUNC_SELECT(f) my_ ## f
|
|
extern "C" {
|
|
typedef BOOL (WINAPI * Func_OpenProcessToken)(HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle);
|
|
typedef BOOL (WINAPI * Func_LookupPrivilegeValue)(LPCTSTR lpSystemName, LPCTSTR lpName, PLUID lpLuid);
|
|
typedef BOOL (WINAPI * Func_AdjustTokenPrivileges)(HANDLE TokenHandle, BOOL DisableAllPrivileges,
|
|
PTOKEN_PRIVILEGES NewState, DWORD BufferLength, PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength);
|
|
}
|
|
#define GET_PROC_ADDR(fff, name) Func_ ## fff my_ ## fff = (Func_ ## fff)GetProcAddress(hModule, name)
|
|
#endif
|
|
|
|
bool EnablePrivilege(LPCTSTR privilegeName, bool enable)
|
|
{
|
|
bool res = false;
|
|
|
|
#ifndef _UNICODE
|
|
|
|
HMODULE hModule = ::LoadLibrary(TEXT("Advapi32.dll"));
|
|
if (hModule == NULL)
|
|
return false;
|
|
|
|
GET_PROC_ADDR(OpenProcessToken, "OpenProcessToken");
|
|
GET_PROC_ADDR(LookupPrivilegeValue, "LookupPrivilegeValueA");
|
|
GET_PROC_ADDR(AdjustTokenPrivileges, "AdjustTokenPrivileges");
|
|
|
|
if (my_OpenProcessToken &&
|
|
my_AdjustTokenPrivileges &&
|
|
my_LookupPrivilegeValue)
|
|
|
|
#endif
|
|
|
|
{
|
|
HANDLE token;
|
|
if (MY_FUNC_SELECT(OpenProcessToken)(::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &token))
|
|
{
|
|
TOKEN_PRIVILEGES tp;
|
|
if (MY_FUNC_SELECT(LookupPrivilegeValue)(NULL, privilegeName, &(tp.Privileges[0].Luid)))
|
|
{
|
|
tp.PrivilegeCount = 1;
|
|
tp.Privileges[0].Attributes = (enable ? SE_PRIVILEGE_ENABLED : 0);
|
|
if (MY_FUNC_SELECT(AdjustTokenPrivileges)(token, FALSE, &tp, 0, NULL, NULL))
|
|
res = (GetLastError() == ERROR_SUCCESS);
|
|
}
|
|
::CloseHandle(token);
|
|
}
|
|
}
|
|
|
|
#ifndef _UNICODE
|
|
|
|
::FreeLibrary(hModule);
|
|
|
|
#endif
|
|
|
|
return res;
|
|
}
|
|
|
|
|
|
|
|
typedef void (WINAPI * Func_RtlGetVersion) (OSVERSIONINFOEXW *);
|
|
|
|
/*
|
|
We suppose that Window 10 works incorrectly with "Large Pages" at:
|
|
- Windows 10 1703 (15063)
|
|
- Windows 10 1709 (16299)
|
|
*/
|
|
|
|
unsigned Get_LargePages_RiskLevel()
|
|
{
|
|
OSVERSIONINFOEXW vi;
|
|
HMODULE ntdll = ::GetModuleHandleW(L"ntdll.dll");
|
|
if (!ntdll)
|
|
return 0;
|
|
Func_RtlGetVersion func = (Func_RtlGetVersion)GetProcAddress(ntdll, "RtlGetVersion");
|
|
if (!func)
|
|
return 0;
|
|
func(&vi);
|
|
return (vi.dwPlatformId == VER_PLATFORM_WIN32_NT
|
|
&& vi.dwMajorVersion + vi.dwMinorVersion == 10
|
|
&& vi.dwBuildNumber <= 16299) ? 1 : 0;
|
|
}
|
|
|
|
#endif
|
|
|
|
}}
|