升龙物业 老版本 ocx IPO, 加密狗 转值班电话

DaemonClient.cpp 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  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. /*****************************************************************
  36. **【函数名称】 __initMapFile
  37. **【函数功能】 初始化文件映射
  38. **【参数】
  39. **【返回值】
  40. ****************************************************************/
  41. BOOL CDaemonClient::__initMapFile()
  42. {
  43. // 加载配置文件
  44. if(_access(FILE_PATH, 0) == -1) CreateDirectoryA(FILE_PATH, NULL);
  45. m_FileConfig = CreateFile(FILE_NAME,
  46. GENERIC_READ|GENERIC_WRITE,
  47. FILE_SHARE_READ|FILE_SHARE_WRITE,
  48. NULL,
  49. OPEN_ALWAYS,
  50. FILE_ATTRIBUTE_NORMAL,
  51. NULL);
  52. if(m_FileConfig == NULL) return FALSE;
  53. // 打开内存映射文件
  54. m_MapFileConfig = CreateFileMapping(m_FileConfig, NULL, PAGE_READWRITE, 0, sizeof(ProcessInfo)*WATCH_MAX_COUNT, VIEW_NAME);
  55. if(m_MapFileConfig == NULL)
  56. {
  57. CloseHandle(m_FileConfig);
  58. m_FileConfig = NULL;
  59. return FALSE;
  60. }
  61. // 映射文件对象到进程地址空间
  62. LPVOID hViewFile = MapViewOfFile(m_MapFileConfig, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(ProcessInfo)*WATCH_MAX_COUNT);
  63. if(hViewFile == NULL)
  64. {
  65. CloseHandle(m_MapFileConfig);
  66. m_MapFileConfig = NULL;
  67. CloseHandle(m_FileConfig);
  68. m_FileConfig = NULL;
  69. return FALSE;
  70. }
  71. // 保存内存指针
  72. if(m_FileConfig != NULL)
  73. {
  74. CloseHandle(m_FileConfig);
  75. m_FileConfig = NULL;
  76. }
  77. if(m_MapFileConfig != NULL)
  78. {
  79. CloseHandle(m_MapFileConfig);
  80. m_MapFileConfig = NULL;
  81. }
  82. m_pProcessInfo = (ProcessInfo*)hViewFile;
  83. return TRUE;
  84. }
  85. /*****************************************************************
  86. **【函数名称】 __setSignal
  87. **【函数功能】 设置进程标志
  88. **【参数】
  89. **【返回值】
  90. ****************************************************************/
  91. void CDaemonClient::__setSignal()
  92. {
  93. for(int i = 0; i < WATCH_MAX_COUNT; i++)
  94. {
  95. if(strcmp(m_pProcessInfo[i].m_szName, m_ProcessName) == 0)
  96. {
  97. m_pProcessInfo[i].m_bActiveFlag = TRUE;
  98. }
  99. } // endfor
  100. }
  101. /*****************************************************************
  102. **【函数名称】 OnTimer
  103. **【函数功能】 定时器处理
  104. **【参数】
  105. **【返回值】
  106. ****************************************************************/
  107. void CDaemonClient::OnTimer(UINT_PTR nIDEvent)
  108. {
  109. // 设置进程状态信息
  110. if(nIDEvent == TIMER_WATCH_ID)
  111. __setSignal();
  112. CWnd::OnTimer(nIDEvent);
  113. }
  114. /*****************************************************************
  115. **【函数名称】 __getProcessName
  116. **【函数功能】 获取当前进程名
  117. **【参数】 lpProcessName 进程名称
  118. **【返回值】
  119. ****************************************************************/
  120. void CDaemonClient::__getProcessName(LPTSTR lpProcessName)
  121. {
  122. HANDLE hSnapshot;
  123. PROCESSENTRY32 lppe;
  124. DWORD dwID = GetCurrentProcessId();
  125. hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
  126. if(hSnapshot == INVALID_HANDLE_VALUE) return;
  127. lppe.dwSize = sizeof(PROCESSENTRY32);
  128. if(Process32First(hSnapshot, &lppe))
  129. {
  130. do
  131. {
  132. if(lppe.th32ProcessID == dwID)
  133. {
  134. lstrcpy(lpProcessName, lppe.szExeFile);
  135. break;
  136. }
  137. }
  138. while(Process32Next(hSnapshot, &lppe)); // 查找下一个进程
  139. }
  140. CloseHandle(hSnapshot);
  141. }