mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
83 lines
2.2 KiB
C++
83 lines
2.2 KiB
C++
|
// Common/MemoryLock.cpp
|
||
|
|
||
|
#include "StdAfx.h"
|
||
|
|
||
|
namespace NWindows {
|
||
|
namespace NSecurity {
|
||
|
|
||
|
#ifndef UNDER_CE
|
||
|
|
||
|
#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
|
||
|
|
||
|
#endif
|
||
|
|
||
|
}}
|