MainFrm.cpp
上传用户:ykzxjx
上传日期:2022-04-03
资源大小:1175k
文件大小:10k
开发平台:

Visual C++

  1. ///////////////////////////////////////////////////////////////////////////////
  2. //
  3. // (C) Copyright 1999 - 2000 Mark Roddy
  4. // All Rights Reserved
  5. //
  6. // Hollis Technology Solutions
  7. // 94 Dow Road
  8. // Hollis, NH 03049
  9. // info@hollistech.com
  10. //
  11. // Synopsis: 
  12. // 
  13. //
  14. // Version Information:
  15. //
  16. // $Header: /iphook/usr/IpMonitor/MainFrm.cpp 3     1/27/00 10:35p Markr $ 
  17. //
  18. ///////////////////////////////////////////////////////////////////////////////
  19. // MainFrm.cpp : implementation of the CMainFrame class
  20. //
  21. #include "stdafx.h"
  22. #include "IpMonitor.h"
  23. #include "MainFrm.h"
  24. #include "winioctl.h"
  25. #ifdef _DEBUG
  26. #define new DEBUG_NEW
  27. #undef THIS_FILE
  28. static char THIS_FILE[] = __FILE__;
  29. #endif
  30. /////////////////////////////////////////////////////////////////////////////
  31. // CMainFrame
  32. IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
  33. BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
  34. //{{AFX_MSG_MAP(CMainFrame)
  35. ON_WM_CREATE()
  36. ON_COMMAND(START_HOOK, OnStartHook)
  37. ON_COMMAND(STOP_HOOK, OnStopHook)
  38. ON_UPDATE_COMMAND_UI(START_HOOK, OnUpdateStartHook)
  39. ON_UPDATE_COMMAND_UI(STOP_HOOK, OnUpdateStopHook)
  40. ON_MESSAGE(BUFFER_AVAILABLE_MSG, OnBufferMessage)
  41. //}}AFX_MSG_MAP
  42. // Global help commands
  43. ON_COMMAND(ID_HELP_FINDER, CFrameWnd::OnHelpFinder)
  44. ON_COMMAND(ID_HELP, CFrameWnd::OnHelp)
  45. ON_COMMAND(ID_CONTEXT_HELP, CFrameWnd::OnContextHelp)
  46. ON_COMMAND(ID_DEFAULT_HELP, CFrameWnd::OnHelpFinder)
  47. END_MESSAGE_MAP()
  48. static UINT indicators[] =
  49. {
  50. ID_SEPARATOR,           // status line indicator
  51. ID_INDICATOR_CAPS,
  52. ID_INDICATOR_NUM,
  53. ID_INDICATOR_SCRL,
  54. };
  55. /////////////////////////////////////////////////////////////////////////////
  56. // CMainFrame construction/destruction
  57. CMainFrame::CMainFrame()
  58. {
  59. m_Enabled = FALSE;
  60. m_Started = FALSE;
  61. }
  62. CMainFrame::~CMainFrame()
  63. {
  64. }
  65. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  66. {
  67. if ((theApp.hookDriver.handle() == INVALID_HANDLE_VALUE) ||
  68. (theApp.filterDriver.handle() == INVALID_HANDLE_VALUE)) {
  69. m_Started = FALSE;
  70. m_Enabled = FALSE;
  71. } else {
  72. m_Started = FALSE;
  73. m_Enabled = TRUE;
  74. }
  75. if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
  76. return -1;
  77. if (!m_wndStatusBar.Create(this) ||
  78. !m_wndStatusBar.SetIndicators(indicators,
  79.   sizeof(indicators)/sizeof(UINT)))
  80. {
  81. TRACE0("Failed to create status barn");
  82. return -1;      // fail to create
  83. }
  84. return 0;
  85. }
  86. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
  87. {
  88. if( !CFrameWnd::PreCreateWindow(cs) )
  89. return FALSE;
  90. // TODO: Modify the Window class or styles here by modifying
  91. //  the CREATESTRUCT cs
  92. return TRUE;
  93. }
  94. /////////////////////////////////////////////////////////////////////////////
  95. // CMainFrame diagnostics
  96. #ifdef _DEBUG
  97. void CMainFrame::AssertValid() const
  98. {
  99. CFrameWnd::AssertValid();
  100. }
  101. void CMainFrame::Dump(CDumpContext& dc) const
  102. {
  103. CFrameWnd::Dump(dc);
  104. }
  105. #endif //_DEBUG
  106. /////////////////////////////////////////////////////////////////////////////
  107. // CMainFrame message handlers
  108. void CMainFrame::OnStartHook() 
  109. {
  110. if (theApp.hookDriver.handle() == INVALID_HANDLE_VALUE) {
  111. m_Enabled = FALSE;
  112. m_Started = FALSE;
  113. return;
  114. }
  115. if (m_Started) {
  116. return;
  117. }
  118. //
  119. // send the start ioctl
  120. //
  121. DWORD bytesReturned;
  122. BOOL result = 
  123. DeviceIoControl(theApp.hookDriver.handle(), 
  124. START_IP_HOOK,       // operation control code
  125. NULL,           // input data buffer
  126. 0,         // size of input data buffer
  127. NULL,          // output data buffer
  128. 0,        // size of output data buffer
  129. &bytesReturned,     // byte count
  130. NULL    // overlapped information
  131. );
  132. if (FALSE == result) {
  133. AfxErrorMessageBox(CString(_T("DeviceIoControl START_IP_HOOK")), GetLastError());
  134. return;
  135. }
  136. //
  137. // prime the pump with some buffers
  138. //
  139. if (FALSE == startSomeBuffers(4)) {
  140. //
  141. // ug, clean up the mess here
  142. //
  143. (void) DeviceIoControl(theApp.hookDriver.handle(), 
  144. STOP_IP_HOOK,       // operation control code
  145. NULL,           // input data buffer
  146. 0,         // size of input data buffer
  147. NULL,          // output data buffer
  148. 0,        // size of output data buffer
  149. &bytesReturned,     // byte count
  150. NULL    // overlapped information
  151. );
  152. } else {
  153. //
  154. // if that worked, then check and disable this menu item
  155. //
  156. m_Started = TRUE;
  157. }
  158. }
  159. void CMainFrame::OnStopHook() 
  160. {
  161. if (theApp.hookDriver.handle() == INVALID_HANDLE_VALUE) {
  162. m_Started = FALSE;
  163. m_Enabled = FALSE;
  164. return;
  165. }
  166. if (!m_Started) {
  167. return;
  168. }
  169. //
  170. // send the stop ioctl
  171. //
  172. DWORD bytesReturned;
  173. BOOL result = 
  174. DeviceIoControl(theApp.hookDriver.handle(), 
  175. STOP_IP_HOOK,       // operation control code
  176. NULL,           // input data buffer
  177. 0,         // size of input data buffer
  178. NULL,          // output data buffer
  179. 0,        // size of output data buffer
  180. &bytesReturned,     // byte count
  181. NULL    // overlapped information
  182. );
  183. if (FALSE == result) {
  184. AfxErrorMessageBox(CString(_T("DeviceIoControl STOP_IP_HOOK")), GetLastError());
  185. } else {
  186. //
  187. // if that worked then check and disable this menu item
  188. //
  189. m_Started = FALSE;
  190. //
  191. // wait for our worker thread to terminate
  192. //
  193. DWORD waitResult = WaitForSingleObject(workerHandle, 5000);
  194. if (waitResult != WAIT_OBJECT_0) {
  195. //
  196. // terminate the worker thread with prejudice
  197. //
  198. TerminateThread(workerHandle, 1);
  199. }
  200. CloseHandle(workerHandle);
  201. }
  202. }
  203. void CMainFrame::OnUpdateStartHook(CCmdUI* pCmdUI) 
  204. {
  205. pCmdUI->Enable(m_Enabled);
  206. pCmdUI->SetCheck(m_Started);
  207. }
  208. void CMainFrame::OnUpdateStopHook(CCmdUI* pCmdUI) 
  209. {
  210. pCmdUI->Enable(m_Enabled);
  211. if (m_Enabled) {
  212. pCmdUI->SetCheck(!m_Started);
  213. } else {
  214. pCmdUI->SetCheck(FALSE);
  215. }
  216. }
  217. IoContext::IoContext(UINT nbuffs)
  218. {
  219. if (nbuffs < 1) {
  220. AfxErrorMessageBox(CString(_T("nBuffers too small:")), nbuffs);
  221. ExitProcess(1);
  222. //
  223. // not reached
  224. //
  225. }
  226. nbuffers = nbuffs;
  227. //
  228. // create an event
  229. //
  230. event = CreateEvent(NULL, TRUE, FALSE, NULL);
  231. if (event == NULL) {
  232. DWORD error = GetLastError();
  233. AfxErrorMessageBox(CString(_T("CreateEvent:")), error);
  234. ExitProcess(error);
  235. //
  236. // not reached
  237. //
  238. }
  239. rawBuffer = NULL;
  240. buffer = NULL;
  241. }
  242. IoContext::~IoContext()
  243. {
  244. if (rawBuffer) {
  245. delete[] rawBuffer;
  246. }
  247. if (event) {
  248. CloseHandle(event);
  249. }
  250. }
  251. bool IoContext::init()
  252. {
  253. rawBuffer = new UCHAR[sizeof(IPHOOK_BUFFER) + (sizeof(IPHOOK_DATA) * (nbuffers -1))];
  254. if (rawBuffer == NULL) {
  255. AfxErrorMessageBox(CString(_T("nBuffers too small:")), nbuffers);
  256. return false;
  257. //
  258. // not reached
  259. //
  260. }
  261. buffer = (IPHOOK_BUFFER*) rawBuffer;
  262. overlapped.hEvent = event;
  263. buffer->entries=nbuffers;
  264. buffer->valid = 0;
  265. buffer->tag = IPHOOK_BUFFER_TAG;
  266. memset(&buffer->buffer[0], 0, sizeof(IPHOOK_DATA) * nbuffers);
  267. return true;
  268. }
  269. DWORD WINAPI workerStart(
  270.   LPVOID lpParameter   // thread data
  271. )
  272. {
  273. WIN_CONTEXT context  = *((WIN_CONTEXT *) lpParameter); // ignored for now
  274. //
  275. // until we get asked to stop,
  276. // produce numBufs, wait for completion or termination,
  277. // repeat as needed.
  278. //
  279. // we actually need to keep the buffers ordered, or else we
  280. // will have a re-ordering problem on the other side. The easiest
  281. // way to do that is to use only two buffers.
  282. //
  283. IoContext buffArray[2] = { 100, 100 };
  284. //
  285. // prime the pump
  286. //
  287. DWORD bytesReturned;
  288. while (*context.pStarted == TRUE) {
  289. for (UINT index = 0; index < 2; index++) {
  290. //
  291. // init allocates an io buffer and sets up the
  292. // contents of the buffer.
  293. //
  294. buffArray[index].init();
  295. BOOL result = 
  296. DeviceIoControl(theApp.hookDriver.handle(), 
  297. HOOK_THIS,       // operation control code
  298. NULL,           // input data buffer
  299. 0,         // size of input data buffer
  300. buffArray[index].IoBuffer(),          // output data buffer
  301. buffArray[index].IoSize(),        // size of output data buffer
  302. &bytesReturned,     // byte count
  303. buffArray[index].over()    // overlapped information
  304. );
  305. if (!result) {
  306. AfxErrorMessage(CString(_T("DeviceIoControl HOOK_THIS: ")), GetLastError());
  307. }
  308. }
  309. //
  310. // as each request completes, poat it to the widow thread
  311. //
  312. for (index = 0; index < 2; index++) {
  313. BOOL result = 
  314. GetOverlappedResult(theApp.hookDriver.handle(), 
  315. buffArray[index].over(),
  316. &bytesReturned,
  317. TRUE);
  318. if (!result) {
  319. AfxErrorMessage(CString(_T("GetOverlappedResult: ")), GetLastError());
  320. //
  321. // we have to free the buffer?
  322. //
  323. buffArray[index].deleteBuffer();
  324. } else {
  325. //
  326. // post this to the window side
  327. //
  328. buffArray[index].releaseBuffer();
  329. PostMessage(context.mainwindow, 
  330.         BUFFER_AVAILABLE_MSG, (UINT) buffArray[index].IoBuffer(), 0);
  331. }
  332. }
  333. }
  334. return 0;
  335. }
  336. BOOLEAN CMainFrame::startSomeBuffers(UINT numBufs)
  337. {
  338. //
  339. // this function spawns a worker thread whose job it is
  340. // to feed the driver with buffers and wait for those buffers
  341. // to return.
  342. //
  343. m_context.numBufs = 2;
  344. m_context.mainwindow = GetSafeHwnd();
  345. m_context.pStarted = &m_Started;
  346. ASSERT(m_context.mainwindow);
  347. workerHandle = CreateThread(NULL, 0, workerStart, (PVOID) &m_context, 0, &workerId);
  348. if (workerHandle == NULL) {
  349. AfxErrorMessage(CString(_T("CreateThread: ")), GetLastError());
  350. return FALSE;
  351. }
  352. return TRUE;
  353. }
  354. afx_msg LRESULT CMainFrame::OnBufferMessage(WPARAM wParam, LPARAM lParam)
  355. {
  356. //
  357. // just hand this to the view
  358. //
  359. CView* view = GetActiveView( );
  360. if (view) {
  361. view->PostMessage(BUFFER_AVAILABLE_MSG, wParam, lParam);
  362. }
  363. return 0;
  364. }
  365. ///////////////////////////////////////////////////////////////////////////////
  366. // 
  367. // Change History Log
  368. //
  369. // $Log: /iphook/usr/IpMonitor/MainFrm.cpp $
  370. // 
  371. // 3     1/27/00 10:35p Markr
  372. // Prepare to release!
  373. //
  374. ///////////////////////////////////////////////////////////////////////////////