#include <tlhelp32.h>\r
\r
#pragma runtime_checks( "", off )\r
-static DWORD invokeFunc(InjectInfo *info)\r
+static DWORD WINAPI invokeFunc(InjectInfo *info)\r
{\r
BOOL ret;\r
HANDLE hToken;\r
HMODULE hAdvapi32;\r
+ DWORD result = 0;\r
+\r
FpImpersonateLoggedOnUser pImpersonateLoggedOnUser;\r
FpRevertToSelf pRevertToSelf;\r
FpOpenProcessToken pOpenProcessToken;\r
\r
HANDLE hProcess = info->pOpenProcess(PROCESS_QUERY_INFORMATION, FALSE, info->pid_);\r
if (hProcess == NULL) {\r
- return 1;\r
+ result = 1;\r
+ goto exit;\r
}\r
\r
ret = pOpenProcessToken(hProcess, TOKEN_QUERY | TOKEN_DUPLICATE , &hToken);\r
if (ret == FALSE) {\r
- return 2;\r
+ result = 2;\r
+ goto exit;\r
}\r
\r
ret = pImpersonateLoggedOnUser(hToken);\r
if (ret == FALSE) {\r
- return 3;\r
+ result = 3;\r
+ goto exit;\r
}\r
\r
- info->pUpdate(0, 1);\r
+ if (info->isVistaOrLater_) {\r
+ info->pUpdate4(1);\r
+ } else {\r
+ info->pUpdate8(0, 1);\r
+ }\r
\r
ret = pRevertToSelf();\r
if (ret == FALSE) {\r
- return 4;\r
+ result = 4;\r
+ goto exit;\r
}\r
\r
- info->pCloseHandle(hToken);\r
- info->pCloseHandle(hProcess);\r
- return 0;\r
+exit:\r
+ if (hToken != NULL) {\r
+ info->pCloseHandle(hToken);\r
+ }\r
+\r
+ if (hProcess != NULL) {\r
+ info->pCloseHandle(hProcess);\r
+ }\r
+\r
+ return result;\r
}\r
static int afterFunc(int arg)\r
{\r
\r
hMod = GetModuleHandle(_T("user32.dll"));\r
if (hMod != NULL) {\r
- m_info.pUpdate = (FpUpdatePerUserSystemParameters)GetProcAddress(hMod, "UpdatePerUserSystemParameters");\r
- if (m_info.pUpdate == NULL) {\r
+ m_info.pUpdate4 = (FpUpdatePerUserSystemParameters4)GetProcAddress(hMod, "UpdatePerUserSystemParameters");\r
+ m_info.pUpdate8 = (FpUpdatePerUserSystemParameters8)m_info.pUpdate4;\r
+ if (m_info.pUpdate4 == NULL) {\r
return;\r
}\r
}\r
m_pReg = &m_regHKLM; // Windows7 or later\r
}\r
\r
+ // prototype of UpdatePerUserSystemParameters() differ vista or earlier\r
+ if (checkWindowsVersion(6, 0) == FALSE) {\r
+ m_info.isVistaOrLater_ = 0; // before Vista\r
+ } else {\r
+ m_info.isVistaOrLater_ = 1; // Vista or later\r
+ }\r
+\r
m_errorOnConstruct = acquirePrivileges();\r
if (m_errorOnConstruct) {\r
goto exit;\r
\r
typedef HMODULE (WINAPI *FpGetModuleHandleW)(LPCWSTR);\r
typedef FARPROC (WINAPI *FpGetProcAddress)(HMODULE, LPCSTR);\r
-typedef BOOL (WINAPI *FpUpdatePerUserSystemParameters)(DWORD, BOOL);\r
+typedef BOOL (WINAPI *FpUpdatePerUserSystemParameters4)(BOOL);\r
+typedef BOOL (WINAPI *FpUpdatePerUserSystemParameters8)(DWORD, BOOL);\r
typedef HANDLE (WINAPI *FpOpenProcess)(DWORD, BOOL, DWORD);\r
typedef BOOL (WINAPI *FpOpenProcessToken)(HANDLE, DWORD, PHANDLE);\r
typedef BOOL (WINAPI *FpImpersonateLoggedOnUser)(HANDLE);\r
typedef BOOL (WINAPI *FpCloseHandle)(HANDLE);\r
\r
typedef struct {\r
+ DWORD isVistaOrLater_;\r
DWORD pid_;\r
TCHAR advapi32_[64];\r
CHAR impersonateLoggedOnUser_[32];\r
CHAR openProcessToken_[32];\r
FpGetModuleHandleW pGetModuleHandle;\r
FpGetProcAddress pGetProcAddress;\r
- FpUpdatePerUserSystemParameters pUpdate;\r
+ FpUpdatePerUserSystemParameters4 pUpdate4;\r
+ FpUpdatePerUserSystemParameters8 pUpdate8;\r
FpOpenProcess pOpenProcess;\r
FpCloseHandle pCloseHandle;\r
} InjectInfo;\r