Home | History | Annotate | Download | only in Windows
      1 // Windows/MemoryLock.cpp
      2 
      3 #include "StdAfx.h"
      4 
      5 #include "MemoryLock.h"
      6 
      7 namespace NWindows {
      8 namespace NSecurity {
      9 
     10 #ifndef UNDER_CE
     11 
     12 #ifdef _UNICODE
     13 #define MY_FUNC_SELECT(f) :: f
     14 #else
     15 #define MY_FUNC_SELECT(f) my_ ## f
     16 extern "C" {
     17 typedef BOOL (WINAPI * Func_OpenProcessToken)(HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle);
     18 typedef BOOL (WINAPI * Func_LookupPrivilegeValue)(LPCTSTR lpSystemName, LPCTSTR lpName, PLUID lpLuid);
     19 typedef BOOL (WINAPI * Func_AdjustTokenPrivileges)(HANDLE TokenHandle, BOOL DisableAllPrivileges,
     20     PTOKEN_PRIVILEGES NewState, DWORD BufferLength, PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength);
     21 }
     22 #define GET_PROC_ADDR(fff, name) Func_ ## fff  my_ ## fff  = (Func_ ## fff)GetProcAddress(hModule, name)
     23 #endif
     24 
     25 bool EnablePrivilege(LPCTSTR privilegeName, bool enable)
     26 {
     27   bool res = false;
     28 
     29   #ifndef _UNICODE
     30 
     31   HMODULE hModule = ::LoadLibrary(TEXT("Advapi32.dll"));
     32   if (hModule == NULL)
     33     return false;
     34 
     35   GET_PROC_ADDR(OpenProcessToken, "OpenProcessToken");
     36   GET_PROC_ADDR(LookupPrivilegeValue, "LookupPrivilegeValueA");
     37   GET_PROC_ADDR(AdjustTokenPrivileges, "AdjustTokenPrivileges");
     38 
     39   if (my_OpenProcessToken &&
     40       my_AdjustTokenPrivileges &&
     41       my_LookupPrivilegeValue)
     42 
     43   #endif
     44 
     45   {
     46     HANDLE token;
     47     if (MY_FUNC_SELECT(OpenProcessToken)(::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &token))
     48     {
     49       TOKEN_PRIVILEGES tp;
     50       if (MY_FUNC_SELECT(LookupPrivilegeValue)(NULL, privilegeName, &(tp.Privileges[0].Luid)))
     51       {
     52         tp.PrivilegeCount = 1;
     53         tp.Privileges[0].Attributes = (enable ? SE_PRIVILEGE_ENABLED : 0);
     54         if (MY_FUNC_SELECT(AdjustTokenPrivileges)(token, FALSE, &tp, 0, NULL, NULL))
     55           res = (GetLastError() == ERROR_SUCCESS);
     56       }
     57       ::CloseHandle(token);
     58     }
     59   }
     60 
     61   #ifndef _UNICODE
     62 
     63   ::FreeLibrary(hModule);
     64 
     65   #endif
     66 
     67   return res;
     68 }
     69 
     70 
     71 
     72 typedef void (WINAPI * Func_RtlGetVersion) (OSVERSIONINFOEXW *);
     73 
     74 /*
     75   We suppose that Window 10 works incorrectly with "Large Pages" at:
     76     - Windows 10 1703 (15063)
     77     - Windows 10 1709 (16299)
     78 */
     79 
     80 unsigned Get_LargePages_RiskLevel()
     81 {
     82   OSVERSIONINFOEXW vi;
     83   HMODULE ntdll = ::GetModuleHandleW(L"ntdll.dll");
     84   if (!ntdll)
     85     return 0;
     86   Func_RtlGetVersion func = (Func_RtlGetVersion)GetProcAddress(ntdll, "RtlGetVersion");
     87   if (!func)
     88     return 0;
     89   func(&vi);
     90   return (vi.dwPlatformId == VER_PLATFORM_WIN32_NT
     91       && vi.dwMajorVersion + vi.dwMinorVersion == 10
     92       && vi.dwBuildNumber <= 16299) ? 1 : 0;
     93 }
     94 
     95 #endif
     96 
     97 }}
     98