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