OSDN Git Service

1. use WM_COPYDATA to notify from yamy{32,64}.dll to yamy instead of mailslot if...
authorU-i7\gimy <gimy@users.sourceforge.jp>
Sun, 13 Sep 2009 07:48:20 +0000 (16:48 +0900)
committerU-i7\gimy <gimy@users.sourceforge.jp>
Sun, 13 Sep 2009 07:48:20 +0000 (16:48 +0900)
2. yamy{32,64}.dll put log to file in %USEPROFILE%\AppData\LocalLow folder for process in low integrity level as protected mode IE. to enable this, define HOOK_LOG_TO_FILE in hook.{h,cpp}

engine.cpp
hook.cpp
hook.h
mayu.cpp
proj/yamy.vsprops
yamyd.cpp

index d939cad..490fa76 100644 (file)
@@ -1213,6 +1213,13 @@ Engine::Engine(tomsgstream &i_log)
                m_afShellExecute(NULL),\r
                m_variable(0),\r
                m_log(i_log) {\r
+       BOOL (WINAPI *pChangeWindowMessageFilter)(UINT, DWORD) =\r
+               reinterpret_cast<BOOL (WINAPI*)(UINT, DWORD)>(GetProcAddress(GetModuleHandle(_T("user32.dll")), "ChangeWindowMessageFilter"));\r
+\r
+       if(pChangeWindowMessageFilter != NULL) {\r
+               pChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_ADD);\r
+       }\r
+\r
        for (size_t i = 0; i < NUMBER_OF(m_lastPressedKey); ++ i)\r
                m_lastPressedKey[i] = NULL;\r
 \r
index 75c5a1f..5e69394 100644 (file)
--- a/hook.cpp
+++ b/hook.cpp
@@ -78,6 +78,9 @@ struct Globals {
        DWORD m_hwndTaskTray;                           ///\r
        HANDLE m_hMailslot;\r
        bool m_isInitialized;\r
+#ifdef HOOK_LOG_TO_FILE\r
+       HANDLE m_logFile;\r
+#endif // HOOK_LOG_TO_FILE\r
 #ifndef NDEBUG\r
        bool m_isLogging;\r
        _TCHAR m_moduleName[GANA_MAX_PATH];\r
@@ -94,15 +97,33 @@ static Globals g;
 static void notifyThreadDetach();\r
 static void notifyShow(NotifyShow::Show i_show, bool i_isMDI);\r
 static void notifyLog(_TCHAR *i_msg);\r
-static bool mapHookData();\r
+static bool mapHookData(bool i_isYamy);\r
 static void unmapHookData();\r
-static bool initialize();\r
+static bool initialize(bool i_isYamy);\r
 \r
 \r
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
 // Functions\r
 \r
-bool initialize()\r
+\r
+#ifdef HOOK_LOG_TO_FILE\r
+static void WriteToLog(const char *data)\r
+{\r
+       char buf[1024];\r
+       DWORD count;\r
+\r
+       WideCharToMultiByte(CP_THREAD_ACP, 0, g.m_moduleName, -1, buf, NUMBER_OF(buf), NULL, NULL);\r
+       strcat(buf, ": ");\r
+       strcat(buf, data);\r
+       SetFilePointer(g.m_logFile, 0, NULL, FILE_END);\r
+       WriteFile(g.m_logFile, buf, strlen(buf), &count, NULL);\r
+       FlushFileBuffers(g.m_logFile);\r
+}\r
+#else // !HOOK_LOG_TO_FILE\r
+#define WriteToLog(data)\r
+#endif // !HOOK_LOG_TO_FILE\r
+\r
+bool initialize(bool i_isYamy)\r
 {\r
 #ifndef NDEBUG\r
        _TCHAR path[GANA_MAX_PATH];\r
@@ -113,7 +134,14 @@ bool initialize()
                g.m_isLogging = true;\r
        }\r
 #endif // !NDEBUG\r
-#ifdef USE_MAILSLOT\r
+#ifdef HOOK_LOG_TO_FILE\r
+       _TCHAR logFileName[GANA_MAX_PATH];\r
+       GetEnvironmentVariable(_T("USERPROFILE"), logFileName, NUMBER_OF(logFileName));\r
+       _tcsncat(logFileName, _T("\\AppData\\LocalLow\\yamydll.txt"), _tcslen(_T("\\AppData\\LocalLow\\yamydll.log")));\r
+       g.m_logFile = CreateFile(logFileName, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,\r
+               OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);\r
+#endif // HOOK_LOG_TO_FILE\r
+       WriteToLog("try to open mailslot\r\n");\r
        g.m_hMailslot =\r
                CreateFile(NOTIFY_MAILSLOT_NAME, GENERIC_WRITE,\r
                                   FILE_SHARE_READ | FILE_SHARE_WRITE,\r
@@ -121,11 +149,12 @@ bool initialize()
                                   FILE_ATTRIBUTE_NORMAL, (HANDLE)NULL);\r
        if (g.m_hMailslot == INVALID_HANDLE_VALUE) {\r
                HOOK_RPT2("MAYU: %S create mailslot failed(0x%08x)\r\n", g.m_moduleName, GetLastError());\r
+               WriteToLog("open mailslot NG\r\n");\r
        } else {\r
                HOOK_RPT1("MAYU: %S create mailslot successed\r\n", g.m_moduleName);\r
+               WriteToLog("open mailslot OK\r\n");\r
        }\r
-#endif //USE_MAILSLOT\r
-       if (!mapHookData())\r
+       if (!mapHookData(i_isYamy))\r
                return false;\r
        _tsetlocale(LC_ALL, _T(""));\r
        g.m_WM_MAYU_MESSAGE =\r
@@ -153,12 +182,16 @@ BOOL WINAPI DllMain(HINSTANCE i_hInstDLL, DWORD i_fdwReason,
        case DLL_PROCESS_DETACH:\r
                notifyThreadDetach();\r
                unmapHookData();\r
-#ifdef USE_MAILSLOT\r
                if (g.m_hMailslot != INVALID_HANDLE_VALUE) {\r
                        CloseHandle(g.m_hMailslot);\r
                        g.m_hMailslot = INVALID_HANDLE_VALUE;\r
                }\r
-#endif //USE_MAILSLOT\r
+#ifdef HOOK_LOG_TO_FILE\r
+               if (g.m_logFile != INVALID_HANDLE_VALUE) {\r
+                       CloseHandle(g.m_logFile);\r
+                       g.m_logFile = INVALID_HANDLE_VALUE;\r
+               }\r
+#endif // HOOK_LOG_TO_FILE\r
                break;\r
        case DLL_THREAD_DETACH:\r
                notifyThreadDetach();\r
@@ -171,36 +204,27 @@ BOOL WINAPI DllMain(HINSTANCE i_hInstDLL, DWORD i_fdwReason,
 \r
 \r
 /// map hook data\r
-static bool mapHookData()\r
+static bool mapHookData(bool i_isYamy)\r
 {\r
-       g.m_hHookData = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,\r
-                                                                         0, sizeof(HookData),\r
-                                                                         addSessionId(HOOK_DATA_NAME).c_str());\r
-       if (!g.m_hHookData) {\r
-               unmapHookData();\r
-               return false;\r
-       }\r
+       DWORD access = FILE_MAP_READ;\r
 \r
-       g_hookData =\r
-               (HookData *)MapViewOfFile(g.m_hHookData, FILE_MAP_READ | FILE_MAP_WRITE,\r
-                                                                 0, 0, sizeof(HookData));\r
-       if (!g_hookData) {\r
-               unmapHookData();\r
-               return false;\r
+       if (i_isYamy) {\r
+               access |= FILE_MAP_WRITE;\r
+               g.m_hHookData = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,   0, sizeof(HookData), addSessionId(HOOK_DATA_NAME).c_str());\r
+               g.m_hHookDataArch = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,       0, sizeof(HookDataArch), addSessionId(HOOK_DATA_NAME_ARCH).c_str());\r
+       } else {\r
+               g.m_hHookData = OpenFileMapping(access, FALSE, addSessionId(HOOK_DATA_NAME).c_str());\r
+               g.m_hHookDataArch = OpenFileMapping(access, FALSE, addSessionId(HOOK_DATA_NAME_ARCH).c_str());\r
        }\r
 \r
-       g.m_hHookDataArch = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,\r
-                                                                                 0, sizeof(HookDataArch),\r
-                                                                                 addSessionId(HOOK_DATA_NAME_ARCH).c_str());\r
-       if (!g.m_hHookDataArch) {\r
+       if (g.m_hHookData == NULL || g.m_hHookDataArch == NULL) {\r
                unmapHookData();\r
                return false;\r
        }\r
 \r
-       s_hookDataArch =\r
-               (HookDataArch *)MapViewOfFile(g.m_hHookDataArch, FILE_MAP_READ | FILE_MAP_WRITE,\r
-                                                                         0, 0, sizeof(HookDataArch));\r
-       if (!s_hookDataArch) {\r
+       g_hookData = (HookData *)MapViewOfFile(g.m_hHookData, access, 0, 0, sizeof(HookData));\r
+       s_hookDataArch = (HookDataArch *)MapViewOfFile(g.m_hHookDataArch, access, 0, 0, sizeof(HookDataArch));\r
+       if (g_hookData == NULL || s_hookDataArch == NULL) {\r
                unmapHookData();\r
                return false;\r
        }\r
@@ -237,7 +261,6 @@ DllExport bool notify(void *i_data, size_t i_dataSize)
        DWORD result;\r
 #endif // MAYU64\r
 \r
-#ifdef USE_MAILSLOT\r
        DWORD len;\r
        if (g.m_hMailslot != INVALID_HANDLE_VALUE) {\r
                BOOL ret;\r
@@ -249,20 +272,19 @@ DllExport bool notify(void *i_data, size_t i_dataSize)
                        HOOK_RPT1("MAYU: %S WriteFile to mailslot successed\r\n", g.m_moduleName);\r
                }\r
 #endif // !NDEBUG\r
+       } else {\r
+               cd.dwData = reinterpret_cast<Notify *>(i_data)->m_type;\r
+               cd.cbData = i_dataSize;\r
+               cd.lpData = i_data;\r
+               if (g.m_hwndTaskTray == 0 || cd.dwData == Notify::Type_threadDetach)\r
+                       return false;\r
+               if (!SendMessageTimeout(reinterpret_cast<HWND>(g.m_hwndTaskTray),\r
+                                                               WM_COPYDATA, NULL, reinterpret_cast<LPARAM>(&cd),\r
+                                                               SMTO_ABORTIFHUNG | SMTO_NORMAL, 5000, &result)) {\r
+                       _RPT0(_CRT_WARN, "MAYU: SendMessageTimeout() timeouted\r\n");\r
+                       return false;\r
+               }\r
        }\r
-#else // !USE_MAILSLOT\r
-       cd.dwData = reinterpret_cast<Notify *>(i_data)->m_type;\r
-       cd.cbData = i_dataSize;\r
-       cd.lpData = i_data;\r
-       if (g.m_hwndTaskTray == 0)\r
-               return false;\r
-       if (!SendMessageTimeout(reinterpret_cast<HWND>(g.m_hwndTaskTray),\r
-                                                       WM_COPYDATA, NULL, reinterpret_cast<LPARAM>(&cd),\r
-                                                       SMTO_ABORTIFHUNG | SMTO_NORMAL, 5000, &result)) {\r
-               _RPT0(_CRT_WARN, "MAYU: SendMessageTimeout() timeouted\r\n");\r
-               return false;\r
-       }\r
-#endif // !USE_MAILSLOT\r
        return true;\r
 }\r
 \r
@@ -554,7 +576,7 @@ DllExport void notifyLockState()
 LRESULT CALLBACK getMessageProc(int i_nCode, WPARAM i_wParam, LPARAM i_lParam)\r
 {\r
        if (!g.m_isInitialized)\r
-               initialize();\r
+               initialize(false);\r
 \r
        if (!g_hookData)\r
                return 0;\r
@@ -635,7 +657,7 @@ finally:
 LRESULT CALLBACK callWndProc(int i_nCode, WPARAM i_wParam, LPARAM i_lParam)\r
 {\r
        if (!g.m_isInitialized)\r
-               initialize();\r
+               initialize(false);\r
 \r
        if (!g_hookData)\r
                return 0;\r
@@ -747,7 +769,7 @@ LRESULT CALLBACK callWndProc(int i_nCode, WPARAM i_wParam, LPARAM i_lParam)
 static LRESULT CALLBACK lowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam)\r
 {\r
        if (!g.m_isInitialized)\r
-               initialize();\r
+               initialize(false);\r
 \r
        if (!g_hookData || nCode < 0)\r
                goto through;\r
@@ -771,7 +793,7 @@ static LRESULT CALLBACK lowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lP
        KBDLLHOOKSTRUCT *pKbll = (KBDLLHOOKSTRUCT*)lParam;\r
 \r
        if (!g.m_isInitialized)\r
-               initialize();\r
+               initialize(false);\r
 \r
        if (!g_hookData || nCode < 0)\r
                goto through;\r
@@ -790,11 +812,14 @@ through:
 \r
 \r
 /// install message hook\r
-DllExport int installMessageHook()\r
+DllExport int installMessageHook(DWORD i_hwndTaskTray)\r
 {\r
        if (!g.m_isInitialized)\r
-               initialize();\r
+               initialize(true);\r
 \r
+       if (i_hwndTaskTray) {\r
+               g_hookData->m_hwndTaskTray = i_hwndTaskTray;\r
+       }\r
        g.m_hwndTaskTray = g_hookData->m_hwndTaskTray;\r
        s_hookDataArch->m_hHookGetMessage =\r
                SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)getMessageProc,\r
@@ -824,7 +849,7 @@ DllExport int installKeyboardHook(INPUT_DETOUR i_keyboardDetour, Engine *i_engin
 {\r
        if (i_install) {\r
                if (!g.m_isInitialized)\r
-                       initialize();\r
+                       initialize(true);\r
 \r
                g.m_keyboardDetour = i_keyboardDetour;\r
                g.m_engine = i_engine;\r
@@ -845,7 +870,7 @@ DllExport int installMouseHook(INPUT_DETOUR i_mouseDetour, Engine *i_engine, boo
 {\r
        if (i_install) {\r
                if (!g.m_isInitialized)\r
-                       initialize();\r
+                       initialize(true);\r
 \r
                g.m_mouseDetour = i_mouseDetour;\r
                g.m_engine = i_engine;\r
diff --git a/hook.h b/hook.h
index 6db9b3d..604a0a9 100644 (file)
--- a/hook.h
+++ b/hook.h
 #  define HOOK_PIPE_NAME \\r
  _T("\\\\.\\pipe\\GANAware\\mayu\\{4B22D464-7A4E-494b-982A-C2B2BBAAF9F3}") _T(VERSION)\r
 ///\r
-#ifdef USE_MAILSLOT\r
 #  define NOTIFY_MAILSLOT_NAME \\r
 _T("\\\\.\\mailslot\\GANAware\\mayu\\{330F7914-EB5B-49be-ACCE-D2B8DF585B32}") _T(VERSION)\r
 ///\r
-#endif // USE_MAILSLOT\r
 #  define WM_MAYU_MESSAGE_NAME _T("GANAware\\mayu\\WM_MAYU_MESSAGE")\r
 \r
 ///\r
@@ -140,7 +138,7 @@ public:
 \r
 #  ifndef _HOOK_CPP\r
 extern DllImport HookData *g_hookData;\r
-extern DllImport int installMessageHook();\r
+extern DllImport int installMessageHook(DWORD i_hwndTaskTray);\r
 extern DllImport int uninstallMessageHook();\r
 extern DllImport int installKeyboardHook(INPUT_DETOUR i_keyboardDetour, Engine *i_engine, bool i_install);\r
 extern DllImport int installMouseHook(INPUT_DETOUR i_mouseDetour, Engine *i_engine, bool i_install);\r
index 0425d57..a35e406 100644 (file)
--- a/mayu.cpp
+++ b/mayu.cpp
@@ -70,12 +70,10 @@ class Mayu
        PROCESS_INFORMATION m_pi;\r
 #endif // _WIN64\r
        HANDLE m_mutex;\r
-#ifdef USE_MAILSLOT\r
        HANDLE m_hNotifyMailslot;                       /// mailslot to receive notify\r
        HANDLE m_hNotifyEvent;                  /// event on receive notify\r
        OVERLAPPED m_olNotify;                  ///\r
        BYTE m_notifyBuf[NOTIFY_MESSAGE_SIZE];\r
-#endif // USE_MAILSLOT\r
        static const DWORD SESSION_LOCKED = 1<<0;\r
        static const DWORD SESSION_DISCONNECTED = 1<<1;\r
        static const DWORD SESSION_END_QUERIED = 1<<2;\r
@@ -103,7 +101,6 @@ class Mayu
        };\r
 \r
 private:\r
-#ifdef USE_MAILSLOT\r
        static VOID CALLBACK mailslotProc(DWORD i_code, DWORD i_len, LPOVERLAPPED i_ol) {\r
                Mayu *pThis;\r
 \r
@@ -131,7 +128,6 @@ private:
                                                        &m_olNotify, Mayu::mailslotProc);\r
                return result;\r
        }\r
-#endif // USE_MAILSLOT\r
 \r
        /// register class for tasktray\r
        ATOM Register_tasktray() {\r
@@ -1020,7 +1016,6 @@ public:
                        m_engine(m_log) {\r
                Registry reg(MAYU_REGISTRY_ROOT);\r
                reg.read(_T("escapeNLSKeys"), &m_escapeNlsKeys, 0);\r
-#ifdef USE_MAILSLOT\r
                m_hNotifyMailslot = CreateMailslot(NOTIFY_MAILSLOT_NAME, 0, MAILSLOT_WAIT_FOREVER, (SECURITY_ATTRIBUTES *)NULL);\r
                ASSERT(m_hNotifyMailslot != INVALID_HANDLE_VALUE);\r
                int err;\r
@@ -1036,7 +1031,6 @@ public:
                m_olNotify.Offset = 0;\r
                m_olNotify.OffsetHigh = 0;\r
                m_olNotify.hEvent = m_hNotifyEvent;\r
-#endif // USE_MAILSLOT\r
                time(&m_startTime);\r
 \r
                CHECK_TRUE( Register_focus() );\r
@@ -1062,10 +1056,7 @@ public:
                CHECK_TRUE( m_hwndTaskTray );\r
 \r
                // set window handle of tasktray to hooks\r
-#ifndef USE_MAILSLOT\r
-               g_hookData->m_hwndTaskTray = reinterpret_cast<DWORD>(m_hwndTaskTray);\r
-#endif // !USE_MAILSLOT\r
-               CHECK_FALSE( installMessageHook() );\r
+               CHECK_FALSE( installMessageHook(reinterpret_cast<DWORD>(m_hwndTaskTray)) );\r
                m_usingSN = wtsRegisterSessionNotification(m_hwndTaskTray,\r
                                        NOTIFY_FOR_THIS_SESSION);\r
 \r
@@ -1179,12 +1170,10 @@ public:
 \r
        ///\r
        ~Mayu() {\r
-#ifdef USE_MAILSLOT\r
                CancelIo(m_hNotifyMailslot);\r
                SleepEx(0, TRUE);\r
                CloseHandle(m_hNotifyMailslot);\r
                CloseHandle(m_hNotifyEvent);\r
-#endif // USE_MAILSLOT\r
                ReleaseMutex(m_mutex);\r
                WaitForSingleObject(m_mutex, INFINITE);\r
                // first, detach log from edit control to avoid deadlock\r
@@ -1236,7 +1225,6 @@ public:
                showBanner(false);\r
                load();\r
 \r
-#ifdef USE_MAILSLOT\r
                mailslotHandler(0, 0);\r
                while (1) {\r
                        HANDLE handles[] = { m_hNotifyEvent };\r
@@ -1273,20 +1261,6 @@ public:
                                break;\r
                        }\r
                }\r
-#else // !USE_MAILSLOT\r
-               MSG msg;\r
-               while (0 < GetMessage(&msg, NULL, 0, 0)) {\r
-                       if (IsDialogMessage(m_hwndLog, &msg))\r
-                               continue;\r
-                       if (IsDialogMessage(m_hwndInvestigate, &msg))\r
-                               continue;\r
-                       if (IsDialogMessage(m_hwndVersion, &msg))\r
-                               continue;\r
-                       TranslateMessage(&msg);\r
-                       DispatchMessage(&msg);\r
-               }\r
-               return msg.wParam;\r
-#endif // !USE_MAILSLOT\r
        }\r
 };\r
 \r
index 359be53..23ddc60 100755 (executable)
@@ -9,7 +9,7 @@
        <Tool\r
                Name="VCCLCompilerTool"\r
                AdditionalIncludeDirectories="../../boost_$(BOOST_MAJOR)_$(BOOST_MINOR)"\r
-               PreprocessorDefinitions="VERSION=\&quot;$(VERSION)\&quot;;LOGNAME=\&quot;$(USERNAME)\&quot;;COMPUTERNAME=\&quot;$(COMPUTERNAME)\&quot;;_CRT_SECURE_NO_WARNINGS;MAYU64;USE_MAILSLOT;USE_INI"\r
+               PreprocessorDefinitions="VERSION=\&quot;$(VERSION)\&quot;;LOGNAME=\&quot;$(USERNAME)\&quot;;COMPUTERNAME=\&quot;$(COMPUTERNAME)\&quot;;_CRT_SECURE_NO_WARNINGS;MAYU64;USE_INI"\r
        />\r
        <Tool\r
                Name="VCLinkerTool"\r
index 8ab5a48..88a018f 100644 (file)
--- a/yamyd.cpp
+++ b/yamyd.cpp
@@ -10,7 +10,7 @@ int WINAPI _tWinMain(HINSTANCE /* i_hInstance */, HINSTANCE /* i_hPrevInstance *
 {\r
        HANDLE mutex = OpenMutex(SYNCHRONIZE, FALSE, MUTEX_YAMYD_BLOCKER);\r
        if (mutex != NULL) {\r
-               CHECK_FALSE( installMessageHook() );\r
+               CHECK_FALSE( installMessageHook(0) );\r
 \r
                // wait for master process exit\r
                WaitForSingleObject(mutex, INFINITE);\r