}\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
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
}\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
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
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
}\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