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
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
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
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
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
\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
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
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
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
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
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
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
\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
{\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
{\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
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
};\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
&m_olNotify, Mayu::mailslotProc);\r
return result;\r
}\r
-#endif // USE_MAILSLOT\r
\r
/// register class for tasktray\r
ATOM Register_tasktray() {\r
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
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
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
\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
showBanner(false);\r
load();\r
\r
-#ifdef USE_MAILSLOT\r
mailslotHandler(0, 0);\r
while (1) {\r
HANDLE handles[] = { m_hNotifyEvent };\r
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