⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 controldriver.cpp

📁 这个例子是演示用文件驱动监控注册表
💻 CPP
字号:
//ControlDriver.cpp
/////////////////////////////////////////////////////////////////////////////
// the file contains function that control drivers.
// interface with DriverFile.
/////////////////////////////////////////////////////////////////////////////

#include <afxwin.h>

//function pre declare.
BOOL UnloadDeviceDriver(LPCTSTR lpszDriverName);
BOOL LoadDeviceDriver( LPCTSTR lpszDriverName, LPCTSTR lpszFullFileName);
BOOL RemoveDriver(IN SC_HANDLE schSCManger, IN LPCTSTR lspzDriverName);
BOOL UnloadDeviceDriver(LPCTSTR lpszDriverName);
BOOL DeleteDriver( SC_HANDLE scHandle, LPCTSTR lpszDriverName);
BOOL StopDriver( SC_HANDLE scHandle, LPCTSTR lpszDriverName);
BOOL InstallDriver( IN SC_HANDLE schSCManger, IN LPCTSTR lpszDriverName, IN LPCTSTR lpszPathName);
BOOL StartDriver( IN SC_HANDLE schSCManger, IN LPCTSTR lpszDriverName);

BOOL InitializeMyDriver( LPCTSTR lpszDriverName, LPCTSTR lpszDriverFileName)
{
  char szCurDir[MAX_PATH], szCurFileName[MAX_PATH],szWinDir[MAX_PATH], szSystemFileName[MAX_PATH];
  CFile cfile;
  char szError[1200];

  szError[0] = 0;
  //unload old driver.
  UnloadDeviceDriver( lpszDriverName);
  //copy driver file into System32's Drivers path.
  GetCurrentDirectory( MAX_PATH, szCurDir);
  wsprintf( szCurFileName,"%s\\%s", szCurDir, lpszDriverFileName);
  if( !cfile.Open( szCurFileName, CFile::shareDenyNone)){
    wsprintf( szError,"文件 %s 不存在", szCurFileName);
    goto ErrorQuit;
  }
  cfile.Close();
  GetWindowsDirectory( szWinDir, MAX_PATH);
  wsprintf( szSystemFileName,"%s\\System32\\Drivers\\%s", szWinDir,lpszDriverFileName);
  CopyFile( szCurFileName, szSystemFileName, FALSE); //copy & overwrite.
  //load driver.
  LoadDeviceDriver( lpszDriverName, szSystemFileName);
  //delete the driver file name.
  DeleteFile( szSystemFileName);
  return TRUE;

ErrorQuit:
  MessageBox(NULL, szError, "Error", MB_ICONHAND);
  return FALSE;
}

//Load Driver & Start it.
BOOL LoadDeviceDriver( LPCTSTR lpszDriverName, LPCTSTR lpszFullFileName)
{
  SC_HANDLE schSCManger;

  schSCManger = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
  if( !schSCManger)
    return FALSE;

  RemoveDriver( schSCManger, lpszDriverName);
  InstallDriver( schSCManger, lpszDriverName, lpszFullFileName);
  StartDriver( schSCManger, lpszDriverName);
  CloseServiceHandle( schSCManger);
  return TRUE;
}

//start the driver
BOOL StartDriver( IN SC_HANDLE schSCManger, IN LPCTSTR lpszDriverName)
{
  SC_HANDLE schService;
  BOOL bRetValue;

  schService = OpenService( schSCManger, lpszDriverName, SERVICE_ALL_ACCESS);
  if( !schService) return FALSE;
  if( !StartService( schService, 0, NULL)){
    switch( GetLastError()){
    case ERROR_SERVICE_ALREADY_RUNNING:
    case ERROR_SERVICE_DISABLED:
      bRetValue = TRUE;
    default:
      bRetValue = FALSE;
    }
  }
  else
    bRetValue = TRUE;
  CloseServiceHandle( schService);
  return bRetValue;
}

//Install driver into memory.
BOOL InstallDriver( IN SC_HANDLE schSCManger, IN LPCTSTR lpszDriverName, IN LPCTSTR lpszPathName)
{
  SC_HANDLE schService;

  schService = CreateService( schSCManger,
    lpszDriverName,
    lpszDriverName,
    SERVICE_ALL_ACCESS,
    SERVICE_KERNEL_DRIVER,
    SERVICE_DEMAND_START,
    SERVICE_ERROR_NORMAL,
    lpszPathName,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL);
  if( !schService) return FALSE;
  CloseServiceHandle( schService);
  return TRUE;
}

//remove driver from system drivers
BOOL RemoveDriver(IN SC_HANDLE schSCManger, IN LPCTSTR lpszDriverName)
{
  SC_HANDLE schService;
  BOOL bRetValue;

  schService = OpenService(schSCManger, lpszDriverName, SERVICE_ALL_ACCESS);
  if( !schService) return FALSE;
  bRetValue = DeleteService( schService);
  CloseServiceHandle( schService);
  return bRetValue;
}

//unload Driver that have already started.
BOOL UnloadDeviceDriver(LPCTSTR lpszDriverName)
{
  SC_HANDLE scHandle;

  scHandle = OpenSCManager( 
    NULL,  // pointer to machine name string
    NULL,  // pointer to database name string
    SC_MANAGER_ALL_ACCESS // type of access
  );
  
  if( !scHandle) 
    return FALSE; //cannot open.
  StopDriver( scHandle, lpszDriverName); //stop & remove
  DeleteDriver( scHandle, lpszDriverName);

  CloseServiceHandle( scHandle);
  return TRUE;
}

//Delete the Driver
BOOL DeleteDriver( IN SC_HANDLE scHandle, IN LPCTSTR lpszDriverName)
{
  SC_HANDLE schService;
  BOOL bRetValue;

  schService = OpenService( scHandle, lpszDriverName, SERVICE_ALL_ACCESS);
  if( !schService) 
    return FALSE;
  bRetValue = DeleteService( schService);
  CloseServiceHandle( schService);
  return bRetValue;
}

//Stop the Driver.
BOOL StopDriver( IN SC_HANDLE scHandle, IN LPCTSTR lpszDriverName)
{
  SC_HANDLE schService;
  BOOL bRetValue;
  SERVICE_STATUS serviceStatus;

  schService = OpenService( scHandle, lpszDriverName, SERVICE_ALL_ACCESS);
  if( !schService)
    return FALSE;
  bRetValue = ControlService( schService, SERVICE_CONTROL_STOP, &serviceStatus);
  CloseServiceHandle( schService);
  return bRetValue;
}
      
//use CreateFile to open a Device Control Handle.
HANDLE CreateDriverFileHandle(IN LPCTSTR lpszDriverName)
{
  char szDriverName[MAX_PATH];
  BOOL b2000;

  b2000 = ( GetVersion() & 0xff >= 5)?TRUE:FALSE; //is win2000?
  wsprintf( szDriverName,"\\\\.%s\\%s", b2000?"\\Global":"", lpszDriverName);
  return CreateFile( szDriverName,
    GENERIC_READ|GENERIC_WRITE,
    0,
    NULL,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    NULL);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -