OSDN Git Service

collect injection fails as list, and try to clean them on next chance
authorU-i7\gimy <gimy@users.sourceforge.jp>
Wed, 19 Aug 2009 13:56:44 +0000 (22:56 +0900)
committerU-i7\gimy <gimy@users.sourceforge.jp>
Wed, 19 Aug 2009 13:56:44 +0000 (22:56 +0900)
fixscancodemap.cpp
fixscancodemap.h

index 5fece9d..52496cd 100755 (executable)
@@ -135,37 +135,34 @@ DWORD FixScancodeMap::getWinLogonPid()
 }\r
 \r
 \r
-int FixScancodeMap::clean()\r
+bool FixScancodeMap::clean(WlInfo wl)\r
 {\r
        int ret = 0;\r
 \r
-       if (WaitForSingleObject(m_hThread, 5000) == WAIT_TIMEOUT) {\r
-               ret = 15;\r
-               goto dirty_exit;\r
-       }\r
-       DWORD result = -1;\r
-       GetExitCodeThread(m_hThread, &result);\r
-       ret = result;\r
-       CloseHandle(m_hThread);\r
-       m_hThread = NULL;\r
+       if (wl.m_hThread != NULL) {\r
+               DWORD result;\r
 \r
-       if (m_remoteMem != NULL && m_hProcess != NULL) {\r
-               VirtualFreeEx(m_hProcess, m_remoteMem, 0, MEM_RELEASE);\r
-               m_remoteMem = NULL;\r
-       }\r
+               if (WaitForSingleObject(wl.m_hThread, 5000) == WAIT_TIMEOUT) {\r
+                       return false;\r
+               }\r
 \r
-       if (m_remoteInfo != NULL && m_hProcess != NULL) {\r
-               VirtualFreeEx(m_hProcess, m_remoteInfo, 0, MEM_RELEASE);\r
-               m_remoteInfo = NULL;\r
-       }\r
+               GetExitCodeThread(wl.m_hThread, &result);\r
+               CloseHandle(wl.m_hThread);\r
+\r
+               if (wl.m_remoteMem != NULL && wl.m_hProcess != NULL) {\r
+                       VirtualFreeEx(wl.m_hProcess, wl.m_remoteMem, 0, MEM_RELEASE);\r
+               }\r
+\r
+               if (wl.m_remoteInfo != NULL && wl.m_hProcess != NULL) {\r
+                       VirtualFreeEx(wl.m_hProcess, wl.m_remoteInfo, 0, MEM_RELEASE);\r
+               }\r
 \r
-       if (m_hProcess != NULL) {\r
-               CloseHandle(m_hProcess);\r
-               m_hProcess = NULL;\r
+               if (wl.m_hProcess != NULL) {\r
+                       CloseHandle(wl.m_hProcess);\r
+               }\r
        }\r
 \r
-dirty_exit:\r
-       return ret;\r
+       return true;\r
 }\r
 \r
 \r
@@ -174,44 +171,43 @@ int FixScancodeMap::injectThread(DWORD dwPID)
        int ret = 0;\r
        DWORD err = 0;\r
        BOOL wFlag;\r
+       WlInfo wi;\r
+\r
+       wi.m_hProcess = NULL;\r
+       wi.m_remoteMem = NULL;\r
+       wi.m_remoteInfo = NULL;\r
+       wi.m_hThread = NULL;\r
 \r
        DWORD invokeFuncAddr = (DWORD)invokeFunc;\r
        DWORD afterFuncAddr = (DWORD)afterFunc;\r
        DWORD memSize =  afterFuncAddr - invokeFuncAddr;\r
 \r
-       if (m_hThread != NULL) {\r
-               ret = clean();\r
-               if (ret) {\r
-                       return ret;\r
-               }\r
-       }\r
-\r
-       if ((m_hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID)) == NULL) {\r
+       if ((wi.m_hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID)) == NULL) {\r
                ret = 8;\r
                goto exit;\r
        }\r
 \r
-       m_remoteMem = VirtualAllocEx(m_hProcess, NULL, memSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);\r
-       if (m_remoteMem == NULL) {\r
+       wi.m_remoteMem = VirtualAllocEx(wi.m_hProcess, NULL, memSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);\r
+       if (wi.m_remoteMem == NULL) {\r
                ret = 9;\r
                err = GetLastError();\r
                goto exit;\r
        }\r
 \r
-       wFlag = WriteProcessMemory(m_hProcess, m_remoteMem, (char*)invokeFunc, memSize, (SIZE_T*)0);\r
+       wFlag = WriteProcessMemory(wi.m_hProcess, wi.m_remoteMem, (char*)invokeFunc, memSize, (SIZE_T*)0);\r
        if (wFlag == FALSE) {\r
                ret = 10;\r
                goto exit;\r
        }\r
 \r
-       m_remoteInfo = VirtualAllocEx(m_hProcess, NULL, sizeof(m_info), MEM_COMMIT, PAGE_READWRITE);\r
-       if (m_remoteInfo == NULL) {\r
+       wi.m_remoteInfo = VirtualAllocEx(wi.m_hProcess, NULL, sizeof(m_info), MEM_COMMIT, PAGE_READWRITE);\r
+       if (wi.m_remoteInfo == NULL) {\r
                ret = 11;\r
                err = GetLastError();\r
                goto exit;\r
        }\r
 \r
-       wFlag = WriteProcessMemory(m_hProcess, m_remoteInfo, (char*)&m_info, sizeof(m_info), (SIZE_T*)0);\r
+       wFlag = WriteProcessMemory(wi.m_hProcess, wi.m_remoteInfo, (char*)&m_info, sizeof(m_info), (SIZE_T*)0);\r
        if (wFlag == FALSE) {\r
                ret = 12;\r
                goto exit;\r
@@ -234,37 +230,38 @@ int FixScancodeMap::injectThread(DWORD dwPID)
        }\r
 #endif\r
 \r
-       m_hThread = CreateRemoteThread(m_hProcess, NULL, 0, \r
-               (LPTHREAD_START_ROUTINE)m_remoteMem, m_remoteInfo, 0, NULL);\r
-       if (m_hThread == NULL) {\r
+       wi.m_hThread = CreateRemoteThread(wi.m_hProcess, NULL, 0, \r
+               (LPTHREAD_START_ROUTINE)wi.m_remoteMem, wi.m_remoteInfo, 0, NULL);\r
+       if (wi.m_hThread == NULL) {\r
                ret = 13;\r
                goto exit;\r
        }\r
 \r
-       if (WaitForSingleObject(m_hThread, 5000) == WAIT_TIMEOUT) {\r
+       if (WaitForSingleObject(wi.m_hThread, 5000) == WAIT_TIMEOUT) {\r
                ret = 14;\r
+               m_wlTrash.push_back(wi);\r
                goto dirty_exit;\r
        }\r
        DWORD result = -1;\r
-       GetExitCodeThread(m_hThread, &result);\r
+       GetExitCodeThread(wi.m_hThread, &result);\r
        ret = result;\r
-       CloseHandle(m_hThread);\r
-       m_hThread = NULL;\r
+       CloseHandle(wi.m_hThread);\r
+       wi.m_hThread = NULL;\r
 \r
 exit:\r
-       if (m_remoteMem != NULL && m_hProcess != NULL) {\r
-               VirtualFreeEx(m_hProcess, m_remoteMem, 0, MEM_RELEASE);\r
-               m_remoteMem = NULL;\r
+       if (wi.m_remoteMem != NULL && wi.m_hProcess != NULL) {\r
+               VirtualFreeEx(wi.m_hProcess, wi.m_remoteMem, 0, MEM_RELEASE);\r
+               wi.m_remoteMem = NULL;\r
        }\r
 \r
-       if (m_remoteInfo != NULL && m_hProcess != NULL) {\r
-               VirtualFreeEx(m_hProcess, m_remoteInfo, 0, MEM_RELEASE);\r
-               m_remoteInfo = NULL;\r
+       if (wi.m_remoteInfo != NULL && wi.m_hProcess != NULL) {\r
+               VirtualFreeEx(wi.m_hProcess, wi.m_remoteInfo, 0, MEM_RELEASE);\r
+               wi.m_remoteInfo = NULL;\r
        }\r
 \r
-       if (m_hProcess != NULL) {\r
-               CloseHandle(m_hProcess);\r
-               m_hProcess = NULL;\r
+       if (wi.m_hProcess != NULL) {\r
+               CloseHandle(wi.m_hProcess);\r
+               wi.m_hProcess = NULL;\r
        }\r
 \r
 dirty_exit:\r
@@ -276,6 +273,8 @@ int FixScancodeMap::update()
        MINIMIZEDMETRICS mm;\r
        int result = 0;\r
 \r
+       m_wlTrash.erase(remove_if(m_wlTrash.begin(), m_wlTrash.end(), FixScancodeMap::clean), m_wlTrash.end());\r
+\r
        result = acquirePrivileges();\r
        if (result) {\r
                goto exit;\r
@@ -292,8 +291,12 @@ int FixScancodeMap::update()
        SystemParametersInfo(SPI_GETMINIMIZEDMETRICS, sizeof(mm), &mm, 0);\r
 \r
        result = injectThread(dwPID);\r
-       if (result && m_hThread == NULL) {\r
-               goto exit;\r
+       if (result == 14) {\r
+               // retry once\r
+               result = injectThread(dwPID);\r
+               if (result == 0) {\r
+                       result = 22;\r
+               }\r
        }\r
 \r
        SystemParametersInfo(SPI_SETMINIMIZEDMETRICS, sizeof(mm), &mm, 0);\r
@@ -406,10 +409,6 @@ int FixScancodeMap::restore()
 }\r
 \r
 FixScancodeMap::FixScancodeMap() :\r
-       m_hProcess(NULL),\r
-       m_remoteMem(NULL),\r
-       m_remoteInfo(NULL),\r
-       m_hThread(NULL),\r
        m_regHKCU(HKEY_CURRENT_USER, _T("Keyboard Layout")),\r
        m_regHKLM(HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Control\\Keyboard Layout")),\r
        m_pReg(NULL)\r
index d9531ec..dacc7a4 100755 (executable)
@@ -1,3 +1,4 @@
+#include <list>\r
 #include <windows.h>\r
 #include "registry.h"\r
 \r
@@ -32,15 +33,19 @@ private:
                DWORD entry[1];\r
        } ScancodeMap;\r
 \r
+       typedef struct {\r
+               HANDLE m_hProcess;\r
+               LPVOID m_remoteMem;\r
+               LPVOID m_remoteInfo;\r
+               HANDLE m_hThread;\r
+       } WlInfo;\r
+\r
 private:\r
        static const DWORD s_fixEntryNum;\r
        static const DWORD s_fixEntry[];\r
 \r
 private:\r
-       HANDLE m_hProcess;\r
-       LPVOID m_remoteMem;\r
-       LPVOID m_remoteInfo;\r
-       HANDLE m_hThread;\r
+       std::list<WlInfo> m_wlTrash;\r
        InjectInfo m_info;\r
        Registry m_regHKCU;\r
        Registry m_regHKLM;\r
@@ -49,7 +54,7 @@ private:
 private:\r
        int acquirePrivileges();\r
        DWORD getWinLogonPid();\r
-       int clean();\r
+       static bool clean(WlInfo wl);\r
        int injectThread(DWORD dwPID);\r
        int update();\r
 \r