OSDN Git Service

fix ticket #18663
[yamy/yamy.git] / fixscancodemap.h
1 #include <list>\r
2 #include <windows.h>\r
3 #include "registry.h"\r
4 \r
5 typedef HMODULE (WINAPI *FpGetModuleHandleW)(LPCWSTR);\r
6 typedef FARPROC (WINAPI *FpGetProcAddress)(HMODULE, LPCSTR);\r
7 typedef BOOL (WINAPI *FpUpdatePerUserSystemParameters4)(BOOL);\r
8 typedef BOOL (WINAPI *FpUpdatePerUserSystemParameters8)(DWORD, BOOL);\r
9 typedef HANDLE (WINAPI *FpOpenProcess)(DWORD, BOOL, DWORD);\r
10 typedef BOOL (WINAPI *FpOpenProcessToken)(HANDLE, DWORD, PHANDLE);\r
11 typedef BOOL (WINAPI *FpImpersonateLoggedOnUser)(HANDLE);\r
12 typedef BOOL (WINAPI *FpRevertToSelf)(VOID);\r
13 typedef BOOL (WINAPI *FpCloseHandle)(HANDLE);\r
14 \r
15 typedef struct {\r
16         DWORD isVistaOrLater_;\r
17         DWORD pid_;\r
18         TCHAR advapi32_[64];\r
19         CHAR impersonateLoggedOnUser_[32];\r
20         CHAR revertToSelf_[32];\r
21         CHAR openProcessToken_[32];\r
22         FpGetModuleHandleW pGetModuleHandle;\r
23         FpGetProcAddress pGetProcAddress;\r
24         FpUpdatePerUserSystemParameters4 pUpdate4;\r
25         FpUpdatePerUserSystemParameters8 pUpdate8;\r
26         FpOpenProcess pOpenProcess;\r
27         FpCloseHandle pCloseHandle;\r
28 } InjectInfo;\r
29 \r
30 class FixScancodeMap {\r
31 private:\r
32         typedef struct {\r
33                 DWORD header1;\r
34                 DWORD header2;\r
35                 DWORD count;\r
36                 DWORD entry[1];\r
37         } ScancodeMap;\r
38 \r
39         typedef struct {\r
40                 HANDLE m_hProcess;\r
41                 LPVOID m_remoteMem;\r
42                 LPVOID m_remoteInfo;\r
43                 HANDLE m_hThread;\r
44         } WlInfo;\r
45 \r
46 private:\r
47         static const DWORD s_fixEntryNum;\r
48         static const DWORD s_fixEntry[];\r
49 \r
50 private:\r
51         HWND m_hwnd;\r
52         UINT m_messageOnFail;\r
53         int m_errorOnConstruct;\r
54         DWORD m_winlogonPid;\r
55         std::list<WlInfo> m_wlTrash;\r
56         InjectInfo m_info;\r
57         Registry m_regHKCU;\r
58         Registry m_regHKLM;\r
59         Registry *m_pReg;\r
60         HANDLE m_hFixEvent;\r
61         HANDLE m_hRestoreEvent;\r
62         HANDLE m_hQuitEvent;\r
63         HANDLE m_hThread;\r
64         unsigned m_threadId;\r
65 \r
66 private:\r
67         int acquirePrivileges();\r
68         DWORD getWinLogonPid();\r
69         static bool clean(WlInfo wl);\r
70         int injectThread(DWORD dwPID);\r
71         int update();\r
72         int fix();\r
73         int restore();\r
74         static unsigned int WINAPI threadLoop(void *i_this);\r
75 \r
76 public:\r
77         FixScancodeMap();\r
78         ~FixScancodeMap();\r
79 \r
80         int init(HWND i_hwnd, UINT i_messageOnFail);\r
81         int escape(bool i_escape);\r
82 };\r