00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007 #include "vmsVistaFx.h"
00008 #include "shellapi.h"
00009
00010 #pragma data_seg("shdata")
00011
00012 HHOOK _hHook = NULL;
00013 char _szPath [MAX_PATH] = "";
00014 char _szParameters [MAX_PATH] = "";
00015 char _szDirectory [MAX_PATH] = "";
00016 UINT _uRunMsg = 0;
00017 #pragma data_seg()
00018 #pragma comment(linker, "/section:shdata,rws")
00019
00020 typedef struct _TOKEN_ELEVATION {
00021 DWORD TokenIsElevated;
00022 } TOKEN_ELEVATION, *PTOKEN_ELEVATION;
00023
00024 vmsVistaFx::vmsVistaFx()
00025 {
00026
00027 }
00028
00029 vmsVistaFx::~vmsVistaFx()
00030 {
00031
00032 }
00033
00034 BOOL vmsVistaFx::IsElevated()
00035 {
00036 HANDLE hToken = NULL;
00037
00038 if (FALSE == OpenProcessToken (GetCurrentProcess (), TOKEN_QUERY, &hToken))
00039 return FALSE;
00040
00041 TOKEN_ELEVATION te = {0};
00042 DWORD dwReturnLength = 0;
00043
00044 GetTokenInformation (hToken, (TOKEN_INFORMATION_CLASS)20, &te, sizeof (te), &dwReturnLength);
00045
00046 CloseHandle (hToken);
00047
00048 return te.TokenIsElevated;
00049 }
00050
00051 BOOL vmsVistaFx::RunNonElevated(LPCSTR pszPath, LPCSTR pszParameters, LPCSTR pszDirectory)
00052 {
00053 if (IsWow64 ())
00054 return FALSE;
00055
00056 while (_hHook)
00057 Sleep (10);
00058
00059 if (_uRunMsg == 0)
00060 _uRunMsg = RegisterWindowMessage ("VistaFx_Run_msg");
00061 if (_uRunMsg == 0)
00062 return FALSE;
00063
00064 HWND hwndShell = FindWindow ("Progman", NULL);
00065 if (hwndShell == NULL)
00066 return FALSE;
00067
00068 HMODULE hModule = NULL;
00069
00070 if (FALSE == GetModuleHandleEx (GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
00071 (LPCTSTR)_HookProc, &hModule))
00072 return FALSE;
00073
00074 _hHook = SetWindowsHookEx (WH_CALLWNDPROCRET, _HookProc, hModule, 0);
00075 if (_hHook == NULL)
00076 return FALSE;
00077
00078 lstrcpy (_szPath, pszPath);
00079 lstrcpy (_szParameters, pszParameters);
00080 lstrcpy (_szDirectory, pszDirectory);
00081
00082 SendMessage (hwndShell, _uRunMsg, 0, 0);
00083
00084 UnhookWindowsHookEx (_hHook);
00085 _hHook = NULL;
00086
00087 return TRUE;
00088 }
00089
00090 LRESULT CALLBACK vmsVistaFx::_HookProc(int code, WPARAM wp, LPARAM lp)
00091 {
00092 if (code >= 0 && lp)
00093 {
00094 CWPRETSTRUCT * pwrs = (CWPRETSTRUCT*) lp;
00095 if (pwrs->message == _uRunMsg)
00096 ShellExecute (NULL, "open", _szPath, _szParameters, _szDirectory, SW_SHOW);
00097 }
00098
00099 return CallNextHookEx (_hHook, code, wp, lp);
00100 }
00101
00102 BOOL vmsVistaFx::IsWow64()
00103 {
00104 typedef BOOL (WINAPI *FNIW64P)(HANDLE, LPBOOL);
00105 FNIW64P pfn = (FNIW64P) GetProcAddress (GetModuleHandle ("kernel32"), "IsWow64Process");
00106 BOOL b64 = FALSE;
00107 if (pfn)
00108 pfn (GetCurrentProcess (), &b64);
00109 return b64;
00110 }