//Copyright (C) 2007 Anders Kjersem. Licensed under the zlib/libpng license, see License.txt for details. #pragma once /** /#define BUILD_DBGRELEASE // Include simple debug output in release version */ /** /#define BUILD_DBGSELECTELVMODE //Test MyRunAs in release builds*/ /**/#define UNICODE // Unicode build */ /**/#define FEAT_CUSTOMRUNASDLG // Include custom runas dialog */ /**/#define FEAT_CUSTOMRUNASDLG_TRANSLATE //*/ /**/#define FEAT_MSRUNASDLGMODHACK // Default to other user radio button */ #if !defined(APSTUDIO_INVOKED) && !defined(RC_INVOKED) #if (defined(_MSC_VER) && !defined(_DEBUG)) #pragma comment(linker,"/opt:nowin98") #pragma comment(linker,"/ignore:4078") #pragma comment(linker,"/merge:.rdata=.text") //#pragma intrinsic(memset) //http://www.codeguru.com/forum/showthread.php?t=371491&page=2&pp=15 | http://www.ddj.com/windows/184416623 #endif #if defined(UNICODE) && !defined(_UNICODE) #define _UNICODE #endif #define _WIN32_WINNT 0x0501 #define WIN32_LEAN_AND_MEAN #include #include #include #include "NSISUtil.h" #ifndef SEE_MASK_NOZONECHECKS #define SEE_MASK_NOZONECHECKS 0x00800000 #endif #define COUNTOF(___c) ( sizeof(___c)/sizeof(___c[0]) ) #ifndef ARRAYSIZE #define ARRAYSIZE COUNTOF #endif #define FORCEINLINE __forceinline #if _MSC_VER >= 1400 extern void* __cdecl memset(void*mem,int c,size_t len); #endif FORCEINLINE LRESULT MySndDlgItemMsg(HWND hDlg,int id,UINT Msg,WPARAM wp=0,LPARAM lp=0) {return SendMessage(GetDlgItem(hDlg,id),Msg,wp,lp);} //DelayLoaded functions: typedef BOOL (WINAPI*ALLOWSETFOREGROUNDWINDOW)(DWORD dwProcessId); typedef BOOL (WINAPI*OPENPROCESSTOKEN)(HANDLE ProcessHandle,DWORD DesiredAccess,PHANDLE TokenHandle); typedef BOOL (WINAPI*OPENTHREADTOKEN)(HANDLE ThreadHandle,DWORD DesiredAccess,BOOL OpenAsSelf,PHANDLE TokenHandle); typedef BOOL (WINAPI*GETTOKENINFORMATION)(HANDLE hToken,TOKEN_INFORMATION_CLASS TokInfoClass,LPVOID TokInfo,DWORD TokInfoLenh,PDWORD RetLen); 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); typedef PVOID (WINAPI*FREESID)(PSID pSid); typedef BOOL (WINAPI*EQUALSID)(PSID pSid1,PSID pSid2); typedef BOOL (WINAPI*CHECKTOKENMEMBERSHIP)(HANDLE TokenHandle,PSID SidToCheck,PBOOL IsMember); #ifdef FEAT_CUSTOMRUNASDLG typedef BOOL (WINAPI*GETUSERNAME)(LPTSTR lpBuffer,LPDWORD nSize); 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); #define SECURITY_WIN32 #include //NameSamCompatible typedef BOOLEAN (WINAPI*GETUSERNAMEEX)(EXTENDED_NAME_FORMAT NameFormat,LPTSTR lpNameBuffer,PULONG nSize); #endif #ifdef UAC_INITIMPORTS ALLOWSETFOREGROUNDWINDOW _AllowSetForegroundWindow=0; OPENPROCESSTOKEN _OpenProcessToken=0; OPENTHREADTOKEN _OpenThreadToken=0; GETTOKENINFORMATION _GetTokenInformation=0; ALLOCATEANDINITIALIZESID _AllocateAndInitializeSid=0; FREESID _FreeSid=0; EQUALSID _EqualSid=0; CHECKTOKENMEMBERSHIP _CheckTokenMembership=0; #ifdef FEAT_CUSTOMRUNASDLG GETUSERNAME _GetUserName=0; GETUSERNAMEEX _GetUserNameEx=0; CREATEPROCESSWITHLOGONW _CreateProcessWithLogonW=0; #endif #else #ifdef FEAT_CUSTOMRUNASDLG extern GETUSERNAME _GetUserName; extern GETUSERNAMEEX _GetUserNameEx; extern CREATEPROCESSWITHLOGONW _CreateProcessWithLogonW; #endif #endif /* UAC_INITIMPORTS */ extern DWORD DelayLoadDlls(); #ifdef FEAT_CUSTOMRUNASDLG extern DWORD MyRunAs(HINSTANCE hInstDll,SHELLEXECUTEINFO&sei); #endif #if !defined(NTDDI_VISTA) || defined(BUILD_OLDSDK) //#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < 0x06000000) || !defined(NTDDI_VISTA) //#if !defined(TOKEN_ELEVATION_TYPE) || defined(BUILD_OLDSDK) enum TOKEN_ELEVATION_TYPE { TokenElevationTypeDefault = 1, TokenElevationTypeFull, TokenElevationTypeLimited }; enum _TOKEN_INFORMATION_CLASS___VISTA { TokenElevationType = (TokenOrigin+1), TokenLinkedToken, TokenElevation, TokenHasRestrictions, TokenAccessInformation, TokenVirtualizationAllowed, TokenVirtualizationEnabled, TokenIntegrityLevel, TokenUIAccess, TokenMandatoryPolicy, TokenLogonSid, }; #endif #if defined(_DEBUG) || defined(BUILD_DBGRELEASE) //Simple debug helpers: #define BUILD_DBG /** /#define BUILD_XPTEST //Pretend UAC exists and "elevate" with NT runas */ #define DBG_RESETDBGVIEW() do{HWND hDbgView=FindWindowA("dbgviewClass",0);PostMessage(hDbgView,WM_COMMAND,40020,0);if(0)SetForegroundWindow(hDbgView);}while(0) #define _pp_MakeStr_(x) #x #define pp_MakeStr(x) _pp_MakeStr_(x) #define TRACE OutputDebugStringA #define DBGONLY(_x) _x #ifndef ASSERT #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) #endif #define VERIFY(_x) ASSERT(_x) 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)