1 // Common/MemoryLock.cpp
\r
6 namespace NSecurity {
\r
11 typedef BOOL (WINAPI * OpenProcessTokenP)(HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle);
\r
12 typedef BOOL (WINAPI * LookupPrivilegeValueP)(LPCTSTR lpSystemName, LPCTSTR lpName, PLUID lpLuid);
\r
13 typedef BOOL (WINAPI * AdjustTokenPrivilegesP)(HANDLE TokenHandle, BOOL DisableAllPrivileges,
\r
14 PTOKEN_PRIVILEGES NewState, DWORD BufferLength, PTOKEN_PRIVILEGES PreviousState,PDWORD ReturnLength);
\r
18 bool EnableLockMemoryPrivilege(
\r
20 static bool EnableLockMemoryPrivilege2(HMODULE hModule,
\r
25 if (hModule == NULL)
\r
27 OpenProcessTokenP openProcessToken = (OpenProcessTokenP)GetProcAddress(hModule, "OpenProcessToken");
\r
28 LookupPrivilegeValueP lookupPrivilegeValue = (LookupPrivilegeValueP)GetProcAddress(hModule, "LookupPrivilegeValueA" );
\r
29 AdjustTokenPrivilegesP adjustTokenPrivileges = (AdjustTokenPrivilegesP)GetProcAddress(hModule, "AdjustTokenPrivileges");
\r
30 if (openProcessToken == NULL || adjustTokenPrivileges == NULL || lookupPrivilegeValue == NULL)
\r
41 (::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &token))
\r
43 TOKEN_PRIVILEGES tp;
\r
47 ::LookupPrivilegeValue
\r
49 lookupPrivilegeValue
\r
51 (NULL, SE_LOCK_MEMORY_NAME, &(tp.Privileges[0].Luid)))
\r
53 tp.PrivilegeCount = 1;
\r
54 tp.Privileges[0].Attributes = enable ? SE_PRIVILEGE_ENABLED: 0;
\r
57 ::AdjustTokenPrivileges
\r
59 adjustTokenPrivileges
\r
61 (token, FALSE, &tp, 0, NULL, NULL))
\r
62 res = (GetLastError() == ERROR_SUCCESS);
\r
64 ::CloseHandle(token);
\r
69 bool EnableLockMemoryPrivilege(bool enable)
\r
71 HMODULE hModule = LoadLibrary(TEXT("Advapi32.dll"));
\r
72 if (hModule == NULL)
\r
74 bool res = EnableLockMemoryPrivilege2(hModule, enable);
\r
75 ::FreeLibrary(hModule);
\r