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