Source code

Revision control

Copy as Markdown

Other Tools

// 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
}}↩