Interlocked.h
上传用户:jstlsd
上传日期:2007-01-13
资源大小:186k
文件大小:3k
源码类别:

钩子与API截获

开发平台:

Visual C++

  1. //---------------------------------------------------------------------------
  2. //
  3. // Interlocked.h
  4. //
  5. // SUBSYSTEM:   Hook system
  6. //
  7. // MODULE:      Hook tool / Hook server
  8. //
  9. // DESCRIPTION: This class signals a object when its current resource count is 0 
  10. //              and nonsignaled when its current resource count is greater than 0.
  11. // 
  12. //             
  13. // AUTHOR: Ivo Ivanov (ivopi@hotmail.com) 
  14. //              This class is based on a concept suggested by Jeff Richter
  15. //              in his book Programming Windows. For more details see "Creating 
  16. //              Thread-Safe Datatypes and Inverse Semaphores" 
  17. // DATE: 2002 November v1.00
  18. //
  19. //---------------------------------------------------------------------------
  20. #ifndef _INTERLOCKED_H_
  21. #define _INTERLOCKED_H_
  22. #pragma once
  23. // Instances of this class will be accessed by multiple processes. 
  24. template <class T> 
  25. class CWhenZero 
  26. {
  27. public:
  28. CWhenZero(BOOL bInitToZero):
  29. m_InitToZero(bInitToZero),
  30. m_mtx(NULL),
  31. m_hfm(NULL),
  32. m_hevtZero(NULL),
  33. m_pSharedRefCounter(NULL)
  34. {
  35. char szMMF[100];
  36. m_mtx = ::CreateMutexA(NULL, FALSE, "{85773247-082B-4804-8E44-1DD6AB96E41C}");
  37. strcpy(szMMF, "HookTool_RefCounter");
  38. m_hfm = ::CreateFileMappingA((HANDLE) 0xFFFFFFFF, NULL, PAGE_READWRITE, 0, sizeof(T), szMMF);
  39. if (m_hfm != NULL) 
  40. {
  41. m_pSharedRefCounter = (T*)::MapViewOfFile(m_hfm, FILE_MAP_ALL_ACCESS, 0, 0, 0);
  42. m_hevtZero = ::CreateEventA(NULL, TRUE, bInitToZero, "{604CD81D-0B3A-480d-96DC-96A263A97E2D}");
  43. if (bInitToZero)
  44. SetRefCount(0);
  45. else
  46. IncRefCount();
  47. // The event should be signaled if value is 0
  48. }
  49. }
  50. ~CWhenZero() 
  51. {
  52. if (!m_InitToZero)
  53. DecRefCount();
  54. ::UnmapViewOfFile(m_pSharedRefCounter);
  55. ::CloseHandle(m_hevtZero);
  56. ::CloseHandle(m_mtx);
  57. ::CloseHandle(m_hfm);
  58. }
  59. // Return handle to event signaled when value is zero
  60. HANDLE GetZeroHandle() const 
  61. return m_hevtZero; 
  62. }
  63. private:
  64. void SetRefCount(T value)
  65. {
  66. ::WaitForSingleObject(m_mtx, INFINITE);
  67. *m_pSharedRefCounter = value;
  68. OnValueChanged(*m_pSharedRefCounter);
  69. ::ReleaseMutex(m_mtx);
  70. }
  71. void IncRefCount()
  72. {
  73. ::WaitForSingleObject(m_mtx, INFINITE);
  74. ++(*m_pSharedRefCounter);
  75. OnValueChanged(*m_pSharedRefCounter);
  76. ::ReleaseMutex(m_mtx);
  77. }
  78. void DecRefCount()
  79. {
  80. ::WaitForSingleObject(m_mtx, INFINITE);
  81. --(*m_pSharedRefCounter);
  82. OnValueChanged(*m_pSharedRefCounter);
  83. ::ReleaseMutex(m_mtx);
  84. }
  85. void OnValueChanged(const T& newVal) const 
  86. // For best performance, avoid jumping to 
  87. // kernel mode if we don't have to
  88. if (newVal == 0)
  89. {
  90. ::SetEvent(m_hevtZero);
  91. }
  92. else
  93. {
  94. ::ResetEvent(m_hevtZero);
  95. }
  96. }
  97. private:
  98. BOOL m_InitToZero;
  99. HANDLE m_mtx;
  100. HANDLE m_hfm;
  101. HANDLE m_hevtZero;      // Signaled when data value is 0
  102. T* m_pSharedRefCounter;
  103. };
  104. #endif //_INTERLOCKED_H_
  105. //--------------------- End of the file -------------------------------------