OSDN Git Service

prototype of UpdatePerUserSystemParameters differ by vista or earlier
authorU-i7\gimy <gimy@users.sourceforge.jp>
Sun, 23 Aug 2009 14:40:13 +0000 (23:40 +0900)
committerU-i7\gimy <gimy@users.sourceforge.jp>
Sun, 23 Aug 2009 14:40:13 +0000 (23:40 +0900)
fixscancodemap.cpp
fixscancodemap.h

index 58f1f9a..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
@@ -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
index 419f0a5..1f39146 100755 (executable)
@@ -4,7 +4,8 @@
 \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
@@ -12,6 +13,7 @@ typedef BOOL (WINAPI *FpRevertToSelf)(VOID);
 typedef BOOL (WINAPI *FpCloseHandle)(HANDLE);\r
 \r
 typedef struct {\r
+       DWORD isVistaOrLater_;\r
        DWORD pid_;\r
        TCHAR advapi32_[64];\r
        CHAR impersonateLoggedOnUser_[32];\r
@@ -19,7 +21,8 @@ typedef struct {
        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