Nessuna descrizione

DaemonClient.cpp 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. #include "StdAfx.h"
  2. #include "DaemonClient.h"
  3. #include <io.h>
  4. #include <tlhelp32.h>
  5. SINGLETON_IMPLEMENT(CDaemonClient)
  6. CDaemonClient::CDaemonClient(void) : m_pProcessInfo(NULL), m_FileConfig(INVALID_HANDLE_VALUE), m_MapFileConfig(INVALID_HANDLE_VALUE)
  7. {
  8. ZeroMemory(m_ProcessName, PROCESS_NAME_LEN);
  9. CreateEx(0, AfxRegisterWndClass(CS_GLOBALCLASS), "", 0, 0, 0, 0, 0, 0, 0);
  10. }
  11. CDaemonClient::~CDaemonClient(void)
  12. {
  13. KillTimer(TIMER_WATCH_ID);
  14. if(m_FileConfig != NULL) CloseHandle(m_FileConfig);
  15. if(m_MapFileConfig != NULL) CloseHandle(m_MapFileConfig);
  16. }
  17. BEGIN_MESSAGE_MAP(CDaemonClient, CWnd)
  18. ON_WM_TIMER()
  19. END_MESSAGE_MAP()
  20. /*****************************************************************
  21. **【函数名称】 doWork
  22. **【函数功能】 监控客户端开始工作
  23. **【参数】
  24. **【返回值】
  25. ****************************************************************/
  26. void CDaemonClient::doWork()
  27. {
  28. // 初始化文件映射
  29. if(!__initMapFile()) return;
  30. // 获取进程名称
  31. __getProcessName(m_ProcessName);
  32. // 创建定时器
  33. SetTimer(TIMER_WATCH_ID, WATCH_TIMER_CLIENT, NULL);
  34. }
  35. void CDaemonClient::Release()
  36. {
  37. KillTimer(TIMER_WATCH_ID);
  38. if (m_FileConfig != NULL) CloseHandle(m_FileConfig);
  39. if (m_MapFileConfig != NULL) CloseHandle(m_MapFileConfig);
  40. }
  41. /*****************************************************************
  42. **【函数名称】 __initMapFile
  43. **【函数功能】 初始化文件映射
  44. **【参数】
  45. **【返回值】
  46. ****************************************************************/
  47. BOOL CDaemonClient::__initMapFile()
  48. {
  49. // 加载配置文件
  50. if(_access(FILE_PATH, 0) == -1) CreateDirectoryA(FILE_PATH, NULL);
  51. m_FileConfig = CreateFile(FILE_NAME,
  52. GENERIC_READ|GENERIC_WRITE,
  53. FILE_SHARE_READ|FILE_SHARE_WRITE,
  54. NULL,
  55. OPEN_ALWAYS,
  56. FILE_ATTRIBUTE_NORMAL,
  57. NULL);
  58. if(m_FileConfig == NULL) return FALSE;
  59. // 打开内存映射文件
  60. m_MapFileConfig = CreateFileMapping(m_FileConfig, NULL, PAGE_READWRITE, 0, sizeof(ProcessInfo)*WATCH_MAX_COUNT, VIEW_NAME);
  61. if(m_MapFileConfig == NULL)
  62. {
  63. CloseHandle(m_FileConfig);
  64. m_FileConfig = NULL;
  65. return FALSE;
  66. }
  67. // 映射文件对象到进程地址空间
  68. LPVOID hViewFile = MapViewOfFile(m_MapFileConfig, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(ProcessInfo)*WATCH_MAX_COUNT);
  69. if(hViewFile == NULL)
  70. {
  71. CloseHandle(m_MapFileConfig);
  72. m_MapFileConfig = NULL;
  73. CloseHandle(m_FileConfig);
  74. m_FileConfig = NULL;
  75. return FALSE;
  76. }
  77. // 保存内存指针
  78. if(m_FileConfig != NULL)
  79. {
  80. CloseHandle(m_FileConfig);
  81. m_FileConfig = NULL;
  82. }
  83. if(m_MapFileConfig != NULL)
  84. {
  85. CloseHandle(m_MapFileConfig);
  86. m_MapFileConfig = NULL;
  87. }
  88. m_pProcessInfo = (ProcessInfo*)hViewFile;
  89. return TRUE;
  90. }
  91. /*****************************************************************
  92. **【函数名称】 __setSignal
  93. **【函数功能】 设置进程标志
  94. **【参数】
  95. **【返回值】
  96. ****************************************************************/
  97. void CDaemonClient::__setSignal()
  98. {
  99. for(int i = 0; i < WATCH_MAX_COUNT; i++)
  100. {
  101. if(strcmp(m_pProcessInfo[i].m_szName, m_ProcessName) == 0)
  102. {
  103. m_pProcessInfo[i].m_bActiveFlag = TRUE;
  104. }
  105. } // endfor
  106. }
  107. /*****************************************************************
  108. **【函数名称】 OnTimer
  109. **【函数功能】 定时器处理
  110. **【参数】
  111. **【返回值】
  112. ****************************************************************/
  113. void CDaemonClient::OnTimer(UINT_PTR nIDEvent)
  114. {
  115. // 设置进程状态信息
  116. if(nIDEvent == TIMER_WATCH_ID)
  117. __setSignal();
  118. CWnd::OnTimer(nIDEvent);
  119. }
  120. /*****************************************************************
  121. **【函数名称】 __getProcessName
  122. **【函数功能】 获取当前进程名
  123. **【参数】 lpProcessName 进程名称
  124. **【返回值】
  125. ****************************************************************/
  126. void CDaemonClient::__getProcessName(LPTSTR lpProcessName)
  127. {
  128. HANDLE hSnapshot;
  129. PROCESSENTRY32 lppe;
  130. DWORD dwID = GetCurrentProcessId();
  131. hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
  132. if(hSnapshot == INVALID_HANDLE_VALUE) return;
  133. lppe.dwSize = sizeof(PROCESSENTRY32);
  134. if(Process32First(hSnapshot, &lppe))
  135. {
  136. do
  137. {
  138. if(lppe.th32ProcessID == dwID)
  139. {
  140. lstrcpy(lpProcessName, lppe.szExeFile);
  141. break;
  142. }
  143. }
  144. while(Process32Next(hSnapshot, &lppe)); // 查找下一个进程
  145. }
  146. CloseHandle(hSnapshot);
  147. }