/admin/win/nsi/nsis_uac/uac.h

http://github.com/tomahawk-player/tomahawk · C Header · 169 lines · 134 code · 25 blank · 10 comment · 5 complexity · 4d605c083624b8d004e4b5a51f4e21d5 MD5 · raw file

  1. //Copyright (C) 2007 Anders Kjersem. Licensed under the zlib/libpng license, see License.txt for details.
  2. #pragma once
  3. /** /#define BUILD_DBGRELEASE // Include simple debug output in release version */
  4. /** /#define BUILD_DBGSELECTELVMODE //Test MyRunAs*/
  5. /** /#define UNICODE // Unicode build */
  6. /**/#define FEAT_CUSTOMRUNASDLG // Include custom runas dialog */
  7. /**/#define FEAT_CUSTOMRUNASDLG_TRANSLATE //*/
  8. /**/#define FEAT_MSRUNASDLGMODHACK // Default to other user radio button */
  9. #if !defined(APSTUDIO_INVOKED) && !defined(RC_INVOKED)
  10. #if (defined(_MSC_VER) && !defined(_DEBUG))
  11. #pragma comment(linker,"/opt:nowin98")
  12. #pragma comment(linker,"/ignore:4078")
  13. #pragma comment(linker,"/merge:.rdata=.text")
  14. //#pragma intrinsic(memset) //http://www.codeguru.com/forum/showthread.php?t=371491&page=2&pp=15 | http://www.ddj.com/windows/184416623
  15. #endif
  16. #if defined(UNICODE) && !defined(_UNICODE)
  17. #define _UNICODE
  18. #endif
  19. #ifdef _UNICODE
  20. #define TFUNCSUFFIX W
  21. #else
  22. #define TFUNCSUFFIX A
  23. #endif
  24. #define _PCJOIN(a,b) a##b
  25. #define PCJOIN(a,b) _PCJOIN(a,b)
  26. #define _WIN32_WINNT 0x0501
  27. #define WIN32_LEAN_AND_MEAN
  28. #include <windows.h>
  29. #include <ShellAPI.h>
  30. #include <TChar.h>
  31. #include "NSISUtil.h"
  32. #ifndef SEE_MASK_NOZONECHECKS
  33. #define SEE_MASK_NOZONECHECKS 0x00800000
  34. #endif
  35. #define COUNTOF(___c) ( sizeof(___c)/sizeof(___c[0]) )
  36. #ifndef ARRAYSIZE
  37. #define ARRAYSIZE COUNTOF
  38. #endif
  39. #define FORCEINLINE __forceinline
  40. #if _MSC_VER >= 1400
  41. extern void* __cdecl memset(void*mem,int c,size_t len);
  42. #endif
  43. FORCEINLINE LRESULT MySndDlgItemMsg(HWND hDlg,int id,UINT Msg,WPARAM wp=0,LPARAM lp=0) {return SendMessage(GetDlgItem(hDlg,id),Msg,wp,lp);}
  44. #ifndef UAC_NOCUSTOMIMPLEMENTATIONS
  45. FORCEINLINE HANDLE WINAPI GetCurrentProcess(){return ((HANDLE)(-1));}
  46. FORCEINLINE HANDLE WINAPI GetCurrentThread(){return ((HANDLE)(-2));}
  47. #define MyTStrLen lstrlen
  48. #undef lstrcpy
  49. #define lstrcpy MyTStrCpy
  50. FORCEINLINE LPTSTR MyTStrCpy(LPTSTR s1,LPCTSTR s2) {return PCJOIN(lstr,PCJOIN(cpyn,TFUNCSUFFIX))(s1,s2,0x7FFFFFFF);}
  51. #undef lstrcat
  52. #define lstrcat MyTStrCat
  53. LPTSTR MyTStrCat(LPTSTR s1,LPCTSTR s2)
  54. #ifdef UAC_INITIMPORTS
  55. {return s1?MyTStrCpy(&s1[MyTStrLen(s1)],s2):NULL;}
  56. #else
  57. ;
  58. #endif //UAC_INITIMPORTS
  59. #endif //UAC_NOCUSTOMIMPLEMENTATIONS
  60. //DelayLoaded functions:
  61. typedef BOOL (WINAPI*ALLOWSETFOREGROUNDWINDOW)(DWORD dwProcessId);
  62. typedef BOOL (WINAPI*OPENPROCESSTOKEN)(HANDLE ProcessHandle,DWORD DesiredAccess,PHANDLE TokenHandle);
  63. typedef BOOL (WINAPI*OPENTHREADTOKEN)(HANDLE ThreadHandle,DWORD DesiredAccess,BOOL OpenAsSelf,PHANDLE TokenHandle);
  64. typedef BOOL (WINAPI*GETTOKENINFORMATION)(HANDLE hToken,TOKEN_INFORMATION_CLASS TokInfoClass,LPVOID TokInfo,DWORD TokInfoLenh,PDWORD RetLen);
  65. typedef BOOL (WINAPI*ALLOCATEANDINITIALIZESID)(PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority,BYTE nSubAuthorityCount,DWORD sa0,DWORD sa1,DWORD sa2,DWORD sa3,DWORD sa4,DWORD sa5,DWORD sa6,DWORD sa7,PSID*pSid);
  66. typedef PVOID (WINAPI*FREESID)(PSID pSid);
  67. typedef BOOL (WINAPI*EQUALSID)(PSID pSid1,PSID pSid2);
  68. typedef BOOL (WINAPI*CHECKTOKENMEMBERSHIP)(HANDLE TokenHandle,PSID SidToCheck,PBOOL IsMember);
  69. #ifdef FEAT_CUSTOMRUNASDLG
  70. typedef BOOL (WINAPI*GETUSERNAME)(LPTSTR lpBuffer,LPDWORD nSize);
  71. typedef BOOL (WINAPI*CREATEPROCESSWITHLOGONW)(LPCWSTR lpUsername,LPCWSTR lpDomain,LPCWSTR lpPassword,DWORD dwLogonFlags,LPCWSTR lpApplicationName,LPWSTR lpCommandLine,DWORD dwCreationFlags,LPVOID pEnv,LPCWSTR WorkDir,LPSTARTUPINFOW pSI,LPPROCESS_INFORMATION pPI);
  72. #define SECURITY_WIN32
  73. #include <Security.h>//NameSamCompatible
  74. typedef BOOLEAN (WINAPI*GETUSERNAMEEX)(EXTENDED_NAME_FORMAT NameFormat,LPTSTR lpNameBuffer,PULONG nSize);
  75. #endif
  76. #ifdef UAC_INITIMPORTS
  77. ALLOWSETFOREGROUNDWINDOW _AllowSetForegroundWindow=0;
  78. OPENPROCESSTOKEN _OpenProcessToken=0;
  79. OPENTHREADTOKEN _OpenThreadToken=0;
  80. GETTOKENINFORMATION _GetTokenInformation=0;
  81. ALLOCATEANDINITIALIZESID _AllocateAndInitializeSid=0;
  82. FREESID _FreeSid=0;
  83. EQUALSID _EqualSid=0;
  84. CHECKTOKENMEMBERSHIP _CheckTokenMembership=0;
  85. #ifdef FEAT_CUSTOMRUNASDLG
  86. GETUSERNAME _GetUserName=0;
  87. GETUSERNAMEEX _GetUserNameEx=0;
  88. CREATEPROCESSWITHLOGONW _CreateProcessWithLogonW=0;
  89. #endif
  90. #else
  91. #ifdef FEAT_CUSTOMRUNASDLG
  92. extern GETUSERNAME _GetUserName;
  93. extern GETUSERNAMEEX _GetUserNameEx;
  94. extern CREATEPROCESSWITHLOGONW _CreateProcessWithLogonW;
  95. #endif
  96. #endif /* UAC_INITIMPORTS */
  97. extern DWORD DelayLoadDlls();
  98. #ifdef FEAT_CUSTOMRUNASDLG
  99. extern DWORD MyRunAs(HINSTANCE hInstDll,SHELLEXECUTEINFO&sei);
  100. #endif
  101. #if !defined(NTDDI_VISTA) || defined(BUILD_OLDSDK)
  102. //#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < 0x06000000) || !defined(NTDDI_VISTA)
  103. //#if !defined(TOKEN_ELEVATION_TYPE) || defined(BUILD_OLDSDK)
  104. enum TOKEN_ELEVATION_TYPE {
  105. TokenElevationTypeDefault = 1,
  106. TokenElevationTypeFull,
  107. TokenElevationTypeLimited
  108. };
  109. enum _TOKEN_INFORMATION_CLASS___VISTA {
  110. TokenElevationType = (TokenOrigin+1),
  111. TokenLinkedToken,
  112. TokenElevation,
  113. TokenHasRestrictions,
  114. TokenAccessInformation,
  115. TokenVirtualizationAllowed,
  116. TokenVirtualizationEnabled,
  117. TokenIntegrityLevel,
  118. TokenUIAccess,
  119. TokenMandatoryPolicy,
  120. TokenLogonSid,
  121. };
  122. #endif
  123. #if defined(_DEBUG) || defined(BUILD_DBGRELEASE)
  124. //Simple debug helpers:
  125. #define BUILD_DBG
  126. /** /#define BUILD_XPTEST //Pretend UAC exists and "elevate" with NT runas */
  127. #define DBG_RESETDBGVIEW() do{HWND hDbgView=FindWindowA("dbgviewClass",0);PostMessage(hDbgView,WM_COMMAND,40020,0);if(0)SetForegroundWindow(hDbgView);}while(0)
  128. #define _pp_MakeStr_(x) #x
  129. #define pp_MakeStr(x) _pp_MakeStr_(x)
  130. #define TRACE OutputDebugStringA
  131. #define DBGONLY(_x) _x
  132. #ifndef ASSERT
  133. #define ASSERT(_x) do{if(!(_x)){MessageBoxA(GetActiveWindow(),#_x##"\n\n"##__FILE__##":"## pp_MakeStr(__LINE__),"SimpleAssert",0);/*TRACE(#_x##"\n"##__FILE__##":" pp_MakeStr(__LINE__)"\n");*/}}while(0)
  134. #endif
  135. #define VERIFY(_x) ASSERT(_x)
  136. static void TRACEF(const char*fmt,...) {va_list a;va_start(a,fmt);static TCHAR b[1024*4];if (sizeof(TCHAR)!=sizeof(char)){static TCHAR fmtBuf[COUNTOF(b)];VERIFY(wsprintf(fmtBuf,_T("%hs"),fmt)<COUNTOF(fmtBuf));fmt=(LPCSTR)fmtBuf;}wvsprintf(b,(TCHAR*)fmt,a);OutputDebugString(b);}
  137. #else
  138. #define TRACE /*(void)0*/
  139. #define DBGONLY(_x)
  140. #define ASSERT(_x)
  141. #define VERIFY(_x) ((void)(_x))
  142. #define TRACEF TRACE
  143. #endif /* DEBUG */
  144. #endif /* APSTUDIO_INVOKED */