1 // Common/MemoryLock.cpp
2 
3 #include "StdAfx.h"
4 
5 namespace NWindows {
6 namespace NSecurity {
7 
8 #ifndef UNDER_CE
9 
10 #ifndef _UNICODE
11 typedef BOOL (WINAPI * OpenProcessTokenP)(HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle);
12 typedef BOOL (WINAPI * LookupPrivilegeValueP)(LPCTSTR lpSystemName, LPCTSTR lpName, PLUID  lpLuid);
13 typedef BOOL (WINAPI * AdjustTokenPrivilegesP)(HANDLE TokenHandle, BOOL DisableAllPrivileges,
14     PTOKEN_PRIVILEGES NewState, DWORD BufferLength, PTOKEN_PRIVILEGES PreviousState,PDWORD ReturnLength);
15 #endif
16 
17 #ifdef _UNICODE
EnableLockMemoryPrivilege(bool enable)18 bool EnableLockMemoryPrivilege(
19 #else
20 static bool EnableLockMemoryPrivilege2(HMODULE hModule,
21 #endif
22 bool enable)
23 {
24   #ifndef _UNICODE
25   if (hModule == NULL)
26     return false;
27   OpenProcessTokenP openProcessToken = (OpenProcessTokenP)GetProcAddress(hModule, "OpenProcessToken");
28   LookupPrivilegeValueP lookupPrivilegeValue = (LookupPrivilegeValueP)GetProcAddress(hModule, "LookupPrivilegeValueA" );
29   AdjustTokenPrivilegesP adjustTokenPrivileges = (AdjustTokenPrivilegesP)GetProcAddress(hModule, "AdjustTokenPrivileges");
30   if (openProcessToken == NULL || adjustTokenPrivileges == NULL || lookupPrivilegeValue == NULL)
31     return false;
32   #endif
33 
34   HANDLE token;
35   if (!
36     #ifdef _UNICODE
37     ::OpenProcessToken
38     #else
39     openProcessToken
40     #endif
41     (::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &token))
42     return false;
43   TOKEN_PRIVILEGES tp;
44   bool res = false;
45   if (
46     #ifdef _UNICODE
47     ::LookupPrivilegeValue
48     #else
49     lookupPrivilegeValue
50     #endif
51     (NULL, SE_LOCK_MEMORY_NAME, &(tp.Privileges[0].Luid)))
52   {
53     tp.PrivilegeCount = 1;
54     tp.Privileges[0].Attributes = enable ? SE_PRIVILEGE_ENABLED: 0;
55     if (
56       #ifdef _UNICODE
57       ::AdjustTokenPrivileges
58       #else
59       adjustTokenPrivileges
60       #endif
61       (token, FALSE, &tp, 0, NULL, NULL))
62       res = (GetLastError() == ERROR_SUCCESS);
63   }
64   ::CloseHandle(token);
65   return res;
66 }
67 
68 #ifndef _UNICODE
EnableLockMemoryPrivilege(bool enable)69 bool EnableLockMemoryPrivilege(bool enable)
70 {
71   HMODULE hModule = LoadLibrary(TEXT("Advapi32.dll"));
72   if (hModule == NULL)
73     return false;
74   bool res = EnableLockMemoryPrivilege2(hModule, enable);
75   ::FreeLibrary(hModule);
76   return res;
77 }
78 #endif
79 
80 #endif
81 
82 }}
83