| // Common/MemoryLock.cpp |
| |
| #include "StdAfx.h" |
| |
| namespace NWindows { |
| namespace NSecurity { |
| |
| #ifndef _UNICODE |
| typedef BOOL (WINAPI * OpenProcessTokenP)(HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle); |
| typedef BOOL (WINAPI * LookupPrivilegeValueP)(LPCTSTR lpSystemName, LPCTSTR lpName, PLUID lpLuid); |
| typedef BOOL (WINAPI * AdjustTokenPrivilegesP)(HANDLE TokenHandle, BOOL DisableAllPrivileges, |
| PTOKEN_PRIVILEGES NewState, DWORD BufferLength, PTOKEN_PRIVILEGES PreviousState,PDWORD ReturnLength); |
| #endif |
| |
| #ifdef _UNICODE |
| bool EnableLockMemoryPrivilege( |
| #else |
| static bool EnableLockMemoryPrivilege2(HMODULE hModule, |
| #endif |
| bool enable) |
| { |
| #ifndef _UNICODE |
| if (hModule == NULL) |
| return false; |
| OpenProcessTokenP openProcessToken = (OpenProcessTokenP)GetProcAddress(hModule, "OpenProcessToken"); |
| LookupPrivilegeValueP lookupPrivilegeValue = (LookupPrivilegeValueP)GetProcAddress(hModule, "LookupPrivilegeValueA" ); |
| AdjustTokenPrivilegesP adjustTokenPrivileges = (AdjustTokenPrivilegesP)GetProcAddress(hModule, "AdjustTokenPrivileges"); |
| if (openProcessToken == NULL || adjustTokenPrivileges == NULL || lookupPrivilegeValue == NULL) |
| return false; |
| #endif |
| |
| HANDLE token; |
| if (! |
| #ifdef _UNICODE |
| ::OpenProcessToken |
| #else |
| openProcessToken |
| #endif |
| (::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &token)) |
| return false; |
| TOKEN_PRIVILEGES tp; |
| bool res = false; |
| if ( |
| #ifdef _UNICODE |
| ::LookupPrivilegeValue |
| #else |
| lookupPrivilegeValue |
| #endif |
| (NULL, SE_LOCK_MEMORY_NAME, &(tp.Privileges[0].Luid))) |
| { |
| tp.PrivilegeCount = 1; |
| tp.Privileges[0].Attributes = enable ? SE_PRIVILEGE_ENABLED: 0; |
| if ( |
| #ifdef _UNICODE |
| ::AdjustTokenPrivileges |
| #else |
| adjustTokenPrivileges |
| #endif |
| (token, FALSE, &tp, 0, NULL, NULL)) |
| res = (GetLastError() == ERROR_SUCCESS); |
| } |
| ::CloseHandle(token); |
| return res; |
| } |
| |
| #ifndef _UNICODE |
| bool EnableLockMemoryPrivilege(bool enable) |
| { |
| HMODULE hModule = LoadLibrary(TEXT("Advapi32.dll")); |
| if (hModule == NULL) |
| return false; |
| bool res = EnableLockMemoryPrivilege2(hModule, enable); |
| ::FreeLibrary(hModule); |
| return res; |
| } |
| #endif |
| |
| }} |