1cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky// Windows/MemoryLock.cpp 2baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 3baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "StdAfx.h" 4baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 5f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka#include "MemoryLock.h" 6f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka 7baa3858d3f5d128a5c8466b700098109edcad5f2repo syncnamespace NWindows { 8baa3858d3f5d128a5c8466b700098109edcad5f2repo syncnamespace NSecurity { 9baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 10baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#ifndef UNDER_CE 11baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 12baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#ifdef _UNICODE 13cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#define MY_FUNC_SELECT(f) :: f 14baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#else 15cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#define MY_FUNC_SELECT(f) my_ ## f 16cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyextern "C" { 17cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckytypedef BOOL (WINAPI * Func_OpenProcessToken)(HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle); 18cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckytypedef BOOL (WINAPI * Func_LookupPrivilegeValue)(LPCTSTR lpSystemName, LPCTSTR lpName, PLUID lpLuid); 19cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckytypedef BOOL (WINAPI * Func_AdjustTokenPrivileges)(HANDLE TokenHandle, BOOL DisableAllPrivileges, 20cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky PTOKEN_PRIVILEGES NewState, DWORD BufferLength, PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength); 21cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 22cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#define GET_PROC_ADDR(fff, name) Func_ ## fff my_ ## fff = (Func_ ## fff)GetProcAddress(hModule, name) 23baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#endif 24cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 25cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckybool EnablePrivilege(LPCTSTR privilegeName, bool enable) 26baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 27cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky bool res = false; 28cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 29baa3858d3f5d128a5c8466b700098109edcad5f2repo sync #ifndef _UNICODE 30cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 31cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky HMODULE hModule = ::LoadLibrary(TEXT("Advapi32.dll")); 32baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (hModule == NULL) 33baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return false; 34cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 35cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky GET_PROC_ADDR(OpenProcessToken, "OpenProcessToken"); 36cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky GET_PROC_ADDR(LookupPrivilegeValue, "LookupPrivilegeValueA"); 37cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky GET_PROC_ADDR(AdjustTokenPrivileges, "AdjustTokenPrivileges"); 38cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 39cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (my_OpenProcessToken && 40cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky my_AdjustTokenPrivileges && 41cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky my_LookupPrivilegeValue) 42cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 43baa3858d3f5d128a5c8466b700098109edcad5f2repo sync #endif 44baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 45baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 46cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky HANDLE token; 47cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (MY_FUNC_SELECT(OpenProcessToken)(::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &token)) 48cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 49cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky TOKEN_PRIVILEGES tp; 50cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (MY_FUNC_SELECT(LookupPrivilegeValue)(NULL, privilegeName, &(tp.Privileges[0].Luid))) 51cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 52cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky tp.PrivilegeCount = 1; 53cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky tp.Privileges[0].Attributes = (enable ? SE_PRIVILEGE_ENABLED : 0); 54cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (MY_FUNC_SELECT(AdjustTokenPrivileges)(token, FALSE, &tp, 0, NULL, NULL)) 55cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky res = (GetLastError() == ERROR_SUCCESS); 56cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 57cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky ::CloseHandle(token); 58cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 59baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 60cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 61cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky #ifndef _UNICODE 62baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 63baa3858d3f5d128a5c8466b700098109edcad5f2repo sync ::FreeLibrary(hModule); 64cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 65cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky #endif 66cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 67baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return res; 68baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 69baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 70baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#endif 71baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 72baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}} 73