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

钩子与API截获

开发平台:

Visual C++

  1. //---------------------------------------------------------------------------
  2. //
  3. // NtDriverController.cpp
  4. //
  5. // SUBSYSTEM: 
  6. // API Hooking system
  7. // MODULE:    
  8. // Provides simple interface for managing device driver 
  9. //              administration
  10. //
  11. // DESCRIPTION:
  12. //
  13. // AUTHOR: Ivo Ivanov (ivopi@hotmail.com)
  14. //                                                                         
  15. //---------------------------------------------------------------------------
  16. #include "..CommonCommon.h"
  17. #include "NtDriverController.h"
  18. #include "..CommonSysUtils.h"
  19. //---------------------------------------------------------------------------
  20. //
  21. // class CNtDriverController
  22. //
  23. //---------------------------------------------------------------------------
  24. CNtDriverController::CNtDriverController():
  25. m_hSCM(NULL),
  26. m_hDriver(NULL),
  27. m_bDriverStarted(FALSE),
  28. m_bErrorOnStart(FALSE)
  29. {
  30. if (TRUE == Open())
  31. {
  32. strcpy(m_szName, "NTProcDrv");
  33. strcpy(m_szInfo, "Process creation detector for NT.");
  34. char szFullFileName[MAX_PATH];
  35. GetProcessHostFullName(szFullFileName);
  36. if (TRUE == ReplaceFileName(szFullFileName, "NtProcDrv.sys", m_szFullFileName))
  37. m_bDriverStarted = InstallAndStart();
  38. } // if
  39. }
  40. CNtDriverController::~CNtDriverController()
  41. {
  42. StopAndRemove();
  43. Close();
  44. }
  45. //
  46. // Obtain manager handle
  47. //
  48. BOOL CNtDriverController::Open()
  49. {
  50. m_hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
  51. return (m_hSCM != NULL);
  52. }
  53. //
  54. // Close handle obtained from Open()
  55. //
  56. void CNtDriverController::Close()
  57. {
  58. if (m_hDriver != NULL)
  59. {
  60. ::CloseServiceHandle(m_hDriver);
  61. m_hDriver = NULL;
  62. }
  63. if (m_hSCM != NULL)
  64. {
  65. ::CloseServiceHandle(m_hSCM);
  66. m_hSCM = NULL;
  67. }
  68. //
  69. // Wait until driver reaches desired state or error occurs
  70. //
  71. BOOL CNtDriverController::WaitForState(
  72. DWORD           dwDesiredState, 
  73. SERVICE_STATUS* pss
  74. {
  75. BOOL bResult = FALSE;
  76. if (NULL != m_hDriver)
  77. {
  78. // Loop until driver reaches desired state or error occurs
  79. while (1)
  80. {
  81. // Get current state of driver
  82. bResult = ::QueryServiceStatus(m_hDriver, pss);
  83. // If we can't query the driver, we're done
  84. if (!bResult) 
  85. break;
  86. // If the driver reaches the desired state
  87. if (pss->dwCurrentState == dwDesiredState) 
  88. break;
  89. // We're not done, wait the specified period of time
  90. DWORD dwWaitHint = pss->dwWaitHint / 10;    // Poll 1/10 of the wait hint
  91. if (dwWaitHint <  1000) dwWaitHint = 1000;  // At most once a second
  92. if (dwWaitHint > 10000) dwWaitHint = 10000; // At least every 10 seconds
  93. ::Sleep(dwWaitHint);
  94. } // while
  95. } // if
  96. return bResult;
  97. }
  98. //
  99. // Add the driver to the system and start it up
  100. //
  101. BOOL CNtDriverController::InstallAndStart()
  102. {
  103. BOOL bResult = FALSE;
  104. if (NULL != m_hSCM)
  105. {
  106. m_hDriver = ::CreateService(
  107. m_hSCM, 
  108. m_szName, 
  109. m_szInfo,
  110. SERVICE_ALL_ACCESS,
  111. SERVICE_KERNEL_DRIVER,
  112. SERVICE_DEMAND_START,
  113. SERVICE_ERROR_NORMAL,
  114. m_szFullFileName, 
  115. NULL, 
  116. NULL,
  117. NULL, 
  118. NULL, 
  119. NULL
  120. );
  121. if (NULL == m_hDriver)
  122. {
  123. if ( (::GetLastError() == ERROR_SERVICE_EXISTS) ||
  124.      (::GetLastError() == ERROR_SERVICE_MARKED_FOR_DELETE) )
  125. m_hDriver = ::OpenService(
  126. m_hSCM,
  127. m_szName,
  128. SERVICE_ALL_ACCESS
  129. );
  130. }
  131. if (NULL != m_hDriver)
  132. {
  133. SERVICE_STATUS serviceStatus = { 0 };
  134. bResult = ::StartService(m_hDriver, 0, NULL);
  135. if (bResult)
  136. bResult = WaitForState(SERVICE_RUNNING, &serviceStatus);
  137. else
  138. bResult = (::GetLastError() == ERROR_SERVICE_ALREADY_RUNNING);
  139. // We should call DeleteService() if the SCM reports an error
  140. // on StartService(). Otherwise, the service will remain loaded
  141. // in an undesired state
  142. if (!bResult)
  143. {
  144. // Mark the service for deletion.
  145. ::DeleteService(m_hDriver);
  146. if (m_hDriver != NULL)
  147. {
  148. ::CloseServiceHandle(m_hDriver);
  149. m_hDriver = NULL;
  150. }
  151. m_bErrorOnStart = TRUE;
  152. }
  153. } // if
  154. } // if
  155. return bResult;
  156. }
  157. //
  158. // Stop the driver and remove it from the system
  159. //
  160. void CNtDriverController::StopAndRemove()
  161. {
  162. if ((NULL != m_hDriver) && (!m_bErrorOnStart))
  163. {
  164. BOOL bResult;
  165. SERVICE_STATUS serviceStatus = { 0 };
  166. // Notifies a service that it should stop. 
  167. bResult = ::ControlService(m_hDriver, SERVICE_CONTROL_STOP, &serviceStatus);
  168. if (bResult)
  169. bResult = WaitForState(SERVICE_STOPPED, &serviceStatus);
  170. // Mark the service for deletion.
  171. ::DeleteService(m_hDriver);
  172. } // if
  173. }
  174. //----------------------------End of the file -------------------------------