00001
00002
00003
00004 #pragma once
00005
00006 #ifndef __AFXWIN_H__
00007 #error include 'stdafx.h' before including this file for PCH
00008 #endif
00009
00010
00012
00013
00014
00015
00016 class CComponentApp : public CWinApp
00017 {
00018 public:
00019 CComponentApp();
00020
00021
00022
00023
00024 public:
00025 virtual BOOL InitInstance();
00026
00027
00028
00029
00030
00031
00032 DECLARE_MESSAGE_MAP()
00033 };
00034
00035
00037
00038
00039
00040
00041
00042
00043 class CUACUtils
00044 {
00045 public:
00046
00047
00048 #ifndef BCM_FIRST
00049 static const DWORD BCM_FIRST = 0x1600;
00050 #endif
00051 #ifndef BCM_SETSHIELD
00052 static const DWORD BCM_SETSHIELD = (BCM_FIRST + 0x000C);
00053 #endif
00054
00055 static bool isVistaOrLater()
00056 {
00057 OSVERSIONINFO osvi;
00058
00059 ::ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
00060 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
00061
00062 GetVersionEx(&osvi);
00063
00064 return (osvi.dwMajorVersion >= 6);
00065 }
00066
00067 static bool isElevated()
00068 {
00069 if ( !isVistaOrLater() ) {
00070 return true;
00071 }
00072
00073 HANDLE hToken = NULL;
00074
00075 if ( !::OpenProcessToken(
00076 ::GetCurrentProcess(),
00077 TOKEN_QUERY,
00078 &hToken ) )
00079 {
00080 return false;
00081 }
00082
00083 DWORD dwReturnLength = 0;
00084 TOKEN_ELEVATION te;
00085 ::ZeroMemory(&te, sizeof(te));
00086
00087 if ( ::GetTokenInformation(
00088 hToken,
00089 TokenElevation,
00090 &te,
00091 sizeof(te),
00092 &dwReturnLength ) )
00093 {
00094 ASSERT( dwReturnLength == sizeof( te ) );
00095 return (te.TokenIsElevated != 0);
00096 }
00097
00098 ::CloseHandle( hToken );
00099
00100 return false;
00101 }
00102
00103 template <typename T>
00104 static HRESULT CreateElevatedInstance(LPCOLESTR progId,
00105 T** object, HWND window = 0)
00106 {
00107 CLSID clsId;
00108 HRESULT hr = ::CLSIDFromProgID(progId, &clsId);
00109 if (FAILED(hr)) {
00110 return hr;
00111 }
00112
00113 return CreateElevatedInstance(clsId, object, window);
00114 }
00115
00116 template <typename T>
00117 static HRESULT CreateElevatedInstance(REFCLSID classId,
00118 T** object, HWND window = 0)
00119 {
00120 BIND_OPTS3 bindOptions;
00121 gettokeninformation
00122 ::ZeroMemory(&bindOptions, sizeof (BIND_OPTS3));
00123 bindOptions.cbStruct = sizeof (BIND_OPTS3);
00124 bindOptions.hwnd = window;
00125 bindOptions.dwClassContext = CLSCTX_LOCAL_SERVER;
00126
00127 WCHAR wszMonikerName[300];
00128 WCHAR wszCLSID[50];
00129
00130 #define cntof(a) (sizeof(a)/sizeof(a[0]))
00131
00132 ::StringFromGUID2(classId, wszCLSID,
00133 cntof(wszCLSID));
00134
00135 HRESULT hr = ::StringCchPrintfW(wszMonikerName, cntof(wszMonikerName), L"Elevation:Administrator!new:%s", wszCLSID);
00136
00137 if (FAILED(hr))
00138 {
00139 return hr;
00140 }
00141
00142 return ::CoGetObject(wszMonikerName,
00143 &bindOptions,
00144 __uuidof(T),
00145 reinterpret_cast<void**>(object));
00146 }
00147
00148 static void SetShieldIcon(const CButton& button, bool on=true)
00149 {
00150 button.SendMessage(BCM_SETSHIELD, 0, on ? TRUE : FALSE);
00151 }
00152 };
00153
00154
00155 class CComponentReg
00156 {
00157 public:
00158 CComponentReg();
00159
00160 CStringList paradigms;
00161 HRESULT RegisterParadigms(regaccessmode_enum loc = REGACCESS_USER);
00162 HRESULT UnregisterParadigms(regaccessmode_enum loc = REGACCESS_USER);
00163 };