OSDN Git Service

Fix a bug where the icon doesn't reflect the hook state on Internet Explorer
authorKazuhiro Fujieda <fujieda@users.sourceforge.jp>
Tue, 9 Sep 2014 10:46:40 +0000 (19:46 +0900)
committerKazuhiro Fujieda <fujieda@users.sourceforge.jp>
Thu, 11 Sep 2014 13:22:28 +0000 (22:22 +0900)
Each window on Internet Explorer runs on a separate process at a low
integrity level. These processes can't write the named pipe to notify
the hook state. This fix allow them to do it.

xkeymacs/mainfrm.cpp
xkeymacs/mainfrm.h

index fdab78c..55c79df 100644 (file)
@@ -6,6 +6,8 @@
 #include "profile.h"\r
 #include "../xkeymacsdll/xkeymacsdll.h"\r
 #include "../xkeymacsdll/Utils.h"\r
+#include <Sddl.h>\r
+#include <AclAPI.h>\r
 \r
 #ifdef _DEBUG\r
 #define new DEBUG_NEW\r
@@ -196,14 +198,9 @@ bool SendAck(HANDLE pipe)
 \r
 DWORD WINAPI CMainFrame::PollMessage(LPVOID)\r
 {\r
-       HANDLE pipe = CreateNamedPipe(PipeName(PIPENAME_IPC32).GetName(), PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE, 1,\r
-                                                                       sizeof(DWORD), sizeof(IPC32Message), 0, NULL);\r
-       if (pipe == INVALID_HANDLE_VALUE) {\r
-#ifdef DEBUG_IPC\r
-               CUtils::Log(_T("PollMessage: CreateNamedPipe failed. (%d)"), GetLastError());\r
-#endif\r
+       HANDLE pipe = CreateNamedPipeWithLowIntegrityAccess();\r
+       if (pipe == INVALID_HANDLE_VALUE)\r
                return 1;\r
-       }\r
        for (; ;) {\r
                if (ConnectNamedPipe(pipe, NULL) ? FALSE : (GetLastError() != ERROR_PIPE_CONNECTED)) {\r
 #ifdef DEBUG_IPC\r
@@ -246,6 +243,31 @@ exit:
        return 0;\r
 }\r
 \r
+HANDLE CMainFrame::CreateNamedPipeWithLowIntegrityAccess()\r
+{\r
+       LPCTSTR LOW_INTEGRITY_SDDL_SACL = _T("S:(ML;;NW;;;LW)");\r
+       PSECURITY_DESCRIPTOR sd;\r
+       if (!ConvertStringSecurityDescriptorToSecurityDescriptor(LOW_INTEGRITY_SDDL_SACL, SDDL_REVISION_1, &sd, nullptr)) {\r
+#ifdef DEBUG_IPC\r
+               CUtils::Log(_T("ConvertStringSecurityDescriptorToSecurityDescriptor failed. (%d)"), GetLastError());\r
+#endif\r
+               return INVALID_HANDLE_VALUE;\r
+       }\r
+       SECURITY_ATTRIBUTES sa;\r
+       sa.nLength = sizeof(SECURITY_ATTRIBUTES);\r
+       sa.lpSecurityDescriptor = sd;\r
+       sa.bInheritHandle = false;\r
+       HANDLE pipe = CreateNamedPipe(PipeName(PIPENAME_IPC32).GetName(), PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE, 1,\r
+               sizeof(DWORD), sizeof(IPC32Message), 0, &sa);\r
+       if (pipe == INVALID_HANDLE_VALUE) {\r
+#ifdef DEBUG_IPC\r
+               CUtils::Log(_T("CreateNamedPipeWithLowIntegrityAccess failed. (%d)"), GetLastError());\r
+#endif\r
+       }\r
+       LocalFree(sd);\r
+       return pipe;\r
+}\r
+\r
 void CMainFrame::SetIconData(ICON_TYPE icon, int tip, int on, int off, int reg)\r
 {\r
        m_hIcon[icon][ON_ICON] = AfxGetApp()->LoadIcon(on);\r
index 99ad635..e5dae5b 100644 (file)
@@ -105,6 +105,7 @@ private:
        void StartPollThread();\r
        void TerminatePollThread();\r
        static DWORD WINAPI PollMessage(LPVOID lpParam);\r
+       static HANDLE CreateNamedPipeWithLowIntegrityAccess();\r
 public:\r
        void EnableShell_NotifyIcon(ICON_TYPE icon, BOOL bEnable);\r
 };\r