MemoryLock.cpp 2.1 KB

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