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

文件操作

开发平台:

Visual C++

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