OSDN Git Service

prototype of UpdatePerUserSystemParameters differ by vista or earlier
[yamy/yamy.git] / fixscancodemap.cpp
index 97bce7b..df4665f 100755 (executable)
@@ -5,11 +5,13 @@
 #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
@@ -22,29 +24,44 @@ static DWORD invokeFunc(InjectInfo *info)
 \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
@@ -117,7 +134,7 @@ DWORD FixScancodeMap::getWinLogonPid()
 \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
@@ -420,8 +437,9 @@ FixScancodeMap::FixScancodeMap() :
 \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
@@ -456,6 +474,13 @@ FixScancodeMap::FixScancodeMap() :
                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