INSTDRV.C
上传用户:kevenhsn
上传日期:2007-01-03
资源大小:251k
文件大小:8k
源码类别:

系统编程

开发平台:

Visual C++

  1. /******************************************************************************
  2. *
  3. *       Regmon - Registry Monitor for Windows NT and Windows 9x
  4. *
  5. * Copyright (c) 1996 - 1998 Mark Russinovich and Bryce Cogswell
  6. *
  7. * See readme.txt for terms and conditions.
  8. *
  9. *     FILE: Instdrv.c
  10. *
  11. *     PURPOSE: Loads and unloads device drivers. This code
  12. * is taken from the instdrv example in the NT DDK.
  13. *
  14. ******************************************************************************/
  15. #include <windows.h>
  16. #include <stdlib.h>
  17. #include <string.h>
  18. #include "regmon.h"
  19. /****************************************************************************
  20. *
  21. *    FUNCTION: InstallDriver( IN SC_HANDLE, IN LPCTSTR, IN LPCTSTR)
  22. *
  23. *    PURPOSE: Creates a driver service.
  24. *
  25. ****************************************************************************/
  26. BOOL InstallDriver( IN SC_HANDLE SchSCManager, IN LPCTSTR DriverName, IN LPCTSTR ServiceExe )
  27. {
  28.     SC_HANDLE  schService;
  29.     //
  30.     // NOTE: This creates an entry for a standalone driver. If this
  31.     //       is modified for use with a driver that requires a Tag,
  32.     //       Group, and/or Dependencies, it may be necessary to
  33.     //       query the registry for existing driver information
  34.     //       (in order to determine a unique Tag, etc.).
  35.     //
  36.     schService = CreateService( SchSCManager,          // SCManager database
  37.                                 DriverName,           // name of service
  38.                                 DriverName,           // name to display
  39.                                 SERVICE_ALL_ACCESS,    // desired access
  40.                                 SERVICE_KERNEL_DRIVER, // service type
  41.                                 SERVICE_DEMAND_START,  // start type
  42.                                 SERVICE_ERROR_NORMAL,  // error control type
  43.                                 ServiceExe,            // service's binary
  44.                                 NULL,                  // no load ordering group
  45.                                 NULL,                  // no tag identifier
  46.                                 NULL,                  // no dependencies
  47.                                 NULL,                  // LocalSystem account
  48.                                 NULL                   // no password
  49.                                 );
  50.     if ( schService == NULL )
  51.         return FALSE;
  52.     CloseServiceHandle( schService );
  53.     return TRUE;
  54. }
  55. /****************************************************************************
  56. *
  57. *    FUNCTION: StartDriver( IN SC_HANDLE, IN LPCTSTR)
  58. *
  59. *    PURPOSE: Starts the driver service.
  60. *
  61. ****************************************************************************/
  62. BOOL StartDriver( IN SC_HANDLE SchSCManager, IN LPCTSTR DriverName )
  63. {
  64.     SC_HANDLE  schService;
  65.     BOOL       ret;
  66.     schService = OpenService( SchSCManager,
  67.                               DriverName,
  68.                               SERVICE_ALL_ACCESS
  69.                               );
  70.     if ( schService == NULL )
  71.         return FALSE;
  72.     ret = StartService( schService, 0, NULL )
  73.        || GetLastError() == ERROR_SERVICE_ALREADY_RUNNING;
  74.     CloseServiceHandle( schService );
  75.     return ret;
  76. }
  77. /****************************************************************************
  78. *
  79. *    FUNCTION: OpenDevice( IN LPCTSTR, HANDLE *)
  80. *
  81. *    PURPOSE: Opens the device and returns a handle if desired.
  82. *
  83. ****************************************************************************/
  84. BOOL OpenDevice( IN LPCTSTR DriverName, HANDLE * lphDevice )
  85. {
  86.     TCHAR    completeDeviceName[64];
  87.     HANDLE   hDevice;
  88.     //
  89.     // Create a \.XXX device name that CreateFile can use
  90.     //
  91.     // NOTE: We're making an assumption here that the driver
  92.     //       has created a symbolic link using it's own name
  93.     //       (i.e. if the driver has the name "XXX" we assume
  94.     //       that it used IoCreateSymbolicLink to create a
  95.     //       symbolic link "DosDevicesXXX". Usually, there
  96.     //       is this understanding between related apps/drivers.
  97.     //
  98.     //       An application might also peruse the DEVICEMAP
  99.     //       section of the registry, or use the QueryDosDevice
  100.     //       API to enumerate the existing symbolic links in the
  101.     //       system.
  102.     //
  103.     wsprintf( completeDeviceName, TEXT("\\.\%s"), DriverName );
  104.     hDevice = CreateFile( completeDeviceName,
  105.                           GENERIC_READ | GENERIC_WRITE,
  106.                           0,
  107.                           NULL,
  108.                           OPEN_EXISTING,
  109.                           FILE_ATTRIBUTE_NORMAL,
  110.                           NULL
  111.                           );
  112.     if ( hDevice == ((HANDLE)-1) )
  113.         return FALSE;
  114. // If user wants handle, give it to them.  Otherwise, just close it.
  115. if ( lphDevice )
  116. *lphDevice = hDevice;
  117. else
  118.     CloseHandle( hDevice );
  119.     return TRUE;
  120. }
  121. /****************************************************************************
  122. *
  123. *    FUNCTION: StopDriver( IN SC_HANDLE, IN LPCTSTR)
  124. *
  125. *    PURPOSE: Has the configuration manager stop the driver (unload it)
  126. *
  127. ****************************************************************************/
  128. BOOL StopDriver( IN SC_HANDLE SchSCManager, IN LPCTSTR DriverName )
  129. {
  130.     SC_HANDLE       schService;
  131.     BOOL            ret;
  132.     SERVICE_STATUS  serviceStatus;
  133.     schService = OpenService( SchSCManager, DriverName, SERVICE_ALL_ACCESS );
  134.     if ( schService == NULL )
  135.         return FALSE;
  136.     ret = ControlService( schService, SERVICE_CONTROL_STOP, &serviceStatus );
  137.     CloseServiceHandle( schService );
  138.     return ret;
  139. }
  140. /****************************************************************************
  141. *
  142. *    FUNCTION: RemoveDriver( IN SC_HANDLE, IN LPCTSTR)
  143. *
  144. *    PURPOSE: Deletes the driver service.
  145. *
  146. ****************************************************************************/
  147. BOOL RemoveDriver( IN SC_HANDLE SchSCManager, IN LPCTSTR DriverName )
  148. {
  149.     SC_HANDLE  schService;
  150.     BOOL       ret;
  151.     schService = OpenService( SchSCManager,
  152.                               DriverName,
  153.                               SERVICE_ALL_ACCESS
  154.                               );
  155.     if ( schService == NULL )
  156.         return FALSE;
  157.     ret = DeleteService( schService );
  158.     CloseServiceHandle( schService );
  159.     return ret;
  160. }
  161. /****************************************************************************
  162. *
  163. *    FUNCTION: UnloadDeviceDriver( const TCHAR *)
  164. *
  165. *    PURPOSE: Stops the driver and has the configuration manager unload it.
  166. *
  167. ****************************************************************************/
  168. BOOL UnloadDeviceDriver( const TCHAR * Name )
  169. {
  170. SC_HANDLE schSCManager;
  171. schSCManager = OpenSCManager( NULL,                 // machine (NULL == local)
  172.                                NULL,                 // database (NULL == default)
  173. SC_MANAGER_ALL_ACCESS // access required
  174. );
  175. StopDriver( schSCManager, Name );
  176. RemoveDriver( schSCManager, Name );
  177.  
  178. CloseServiceHandle( schSCManager );
  179. return TRUE;
  180. }
  181. /****************************************************************************
  182. *
  183. *    FUNCTION: LoadDeviceDriver( const TCHAR, const TCHAR, HANDLE *)
  184. *
  185. *    PURPOSE: Registers a driver with the system configuration manager 
  186. *  and then loads it.
  187. *
  188. ****************************************************************************/
  189. BOOL LoadDeviceDriver( const TCHAR * Name, const TCHAR * Path, HANDLE * lphDevice )
  190. {
  191. SC_HANDLE schSCManager;
  192. BOOL okay;
  193. schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
  194. // Remove old instances
  195. RemoveDriver( schSCManager, Name );
  196. // Ignore success of installation: it may already be installed.
  197. InstallDriver( schSCManager, Name, Path );
  198. // Ignore success of start: it may already be started.
  199. StartDriver( schSCManager, Name );
  200. // Do make sure we can open it.
  201. okay = OpenDevice( Name, lphDevice );
  202.   CloseServiceHandle( schSCManager );
  203. return okay;
  204. }