#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
BOOL bResult = Process32First(hSnap, &pe);\r
while (bResult){\r
- if (!_tcscmp(pe.szExeFile, _T("winlogon.exe"))) {\r
+ if (!_tcsicmp(pe.szExeFile, _T("winlogon.exe"))) {\r
DWORD sessionId;\r
\r
if (ProcessIdToSessionId(pe.th32ProcessID, &sessionId) != FALSE) {\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