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

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/sys/driver/IpHookGlobal.h 4     1/27/00 10:35p Markr $ 
  17. //
  18. ///////////////////////////////////////////////////////////////////////////////
  19. #pragma once
  20. //
  21. // this was a simple structure but alas it has developed class
  22. // it ought to be a class in fact and as it is the single global
  23. // data object it ought to enforce its singleton nature.
  24. //
  25. class IP_HOOK_GLOBAL_DATA {
  26. private:
  27. //
  28. // we track the thread that started a hook
  29. //
  30. PVOID owningContext;
  31. PDEVICE_OBJECT IpfDeviceObject;
  32. PFILE_OBJECT IpfFileObject;
  33. ULONG IpHookSequence;
  34. //
  35. // we don't know what the actual situation
  36. // is here - are we called serially at our
  37. // hook function? Are we called at DISPATCH_LEVEL?
  38. //
  39. // until we figure this out use a spinlock.
  40. // 
  41. spinLock Lock;
  42. LIST_ENTRY queue;
  43. LIST_ENTRY cancelQueue;
  44. PIRP currentIrp;
  45. PIPHOOK_BUFFER currentBuffer;
  46. //
  47. // a worker thread wakes up every now and then and flushes the
  48. // current buffer
  49. //
  50. HANDLE  workerThread;
  51. PVOID workerThreadObject;
  52. KEVENT  stopEvent;
  53. public:
  54. NTSTATUS createThread();
  55. NTSTATUS initDevice();
  56. void queueRequest(PIRP Irp);
  57. PIRP popQueue(BOOLEAN locked = FALSE);
  58. PIPHOOK_DATA getBuffer();
  59. void flushBuffer(BOOLEAN locked = FALSE);
  60. void flushBufferIfData();
  61. void releaseAllBuffers(BOOLEAN locked = FALSE);
  62. IP_HOOK_GLOBAL_DATA();
  63. ~IP_HOOK_GLOBAL_DATA();
  64. BOOLEAN IsOwner(PVOID context)
  65. {
  66. if (context == owningContext) {
  67. return TRUE;
  68. }
  69. return FALSE;
  70. }
  71. BOOLEAN owned()
  72. {
  73. return (owningContext != NULL);
  74. }
  75. PVOID owner()
  76. {
  77. return owningContext;
  78. }
  79. BOOLEAN setOwner(PVOID context)
  80. {
  81. //
  82. // we sort of kinda hafta serialize this
  83. //
  84. PVOID inUse = 
  85. InterlockedCompareExchangePointer(&owningContext, 
  86.   context,
  87.   NULL);
  88. if (inUse != NULL) {
  89. return FALSE;
  90. }
  91. return TRUE;
  92. }
  93. void freeOwner(PVOID context)
  94. {
  95. PVOID lockContext;
  96. lock(lockContext);
  97. if (IsOwner(context)) {
  98. releaseAllBuffers(TRUE);
  99. InterlockedExchangePointer(&owningContext, NULL);
  100. }
  101. unlock(lockContext);
  102. }
  103. ULONG getSequence()
  104. {
  105. return InterlockedIncrement((PLONG)&IpHookSequence);
  106. }
  107. PDEVICE_OBJECT getIpDevice()
  108. {
  109. return IpfDeviceObject;
  110. }
  111. void lock(PVOID& context)
  112. {
  113. Lock.lock(context);
  114. }
  115. void unlock(PVOID context)
  116. {
  117. Lock.unlock(context);
  118. }
  119. };
  120. ///////////////////////////////////////////////////////////////////////////////
  121. // 
  122. // Change History Log
  123. //
  124. // $Log: /iphook/sys/driver/IpHookGlobal.h $
  125. // 
  126. // 4     1/27/00 10:35p Markr
  127. // Prepare to release!
  128. //
  129. ///////////////////////////////////////////////////////////////////////////////