vc++ 加载,卸载自己的驱动程序

Posted 狂客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vc++ 加载,卸载自己的驱动程序相关的知识,希望对你有一定的参考价值。

用vc++加载自己的驱动程序主要分为以下几个步骤:

1、加载驱动服务

主要要用到以下几个函数

  1. SC_HANDLE
  2. WINAPI
  3. OpenSCManagerA(
  4.     __in_opt        LPCSTR                lpMachineName,
  5.     __in_opt        LPCSTR                lpDatabaseName,
  6.     __in            DWORD                   dwDesiredAccess
  7.     );
  8. //创建驱动服务
  9. SC_HANDLE
  10. WINAPI
  11. CreateServiceA(
  12.     __in        SC_HANDLE    hSCManager,
  13.     __in        LPCSTR     lpServiceName,
  14.     __in_opt    LPCSTR     lpDisplayName,
  15.     __in        DWORD        dwDesiredAccess,
  16.     __in        DWORD        dwServiceType,
  17.     __in        DWORD        dwStartType,
  18.     __in        DWORD        dwErrorControl,
  19.     __in_opt    LPCSTR     lpBinaryPathName,
  20.     __in_opt    LPCSTR     lpLoadOrderGroup,
  21.     __out_opt   LPDWORD      lpdwTagId,
  22.     __in_opt    LPCSTR     lpDependencies,
  23.     __in_opt    LPCSTR     lpServiceStartName,
  24.     __in_opt    LPCSTR     lpPassword
  25.     );
  26. //打开驱动服务
  27. SC_HANDLE
  28. WINAPI
  29. OpenServiceA(
  30.     __in            SC_HANDLE               hSCManager,
  31.     __in            LPCSTR                lpServiceName,
  32.     __in            DWORD                   dwDesiredAccess
  33.     );
  34. //启动驱动服务
  35. BOOL
  36. WINAPI
  37. StartServiceA(
  38.     __in            SC_HANDLE            hService,
  39.     __in            DWORD                dwNumServiceArgs,
  40.     __in_ecount_opt(dwNumServiceArgs)       
  41.                     LPCSTR             *lpServiceArgVectors
  42.     );

首先调用OpenSCManager函数 建立一个连接到服务控制管理器,然后再调用CreateService创建服务最后调用OpenService和StartService分别打开服务和启动服务。

当服务启动后就可以用CreateFile函数访问驱动程序了代码如下:

1.启动驱动服务程序
  1. //启动驱动服务
  2. void  LoadDriver()
  3. {
  4.     SC_HANDLE    hSCManager = NULL;
  5.     SC_HANDLE    hService = NULL;
  6.     SC_HANDLE    hService1 = NULL;
  7.     hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
  8.     hService = CreateService(hSCManager,
  9.         MYWINRIN0,   //这是驱动服务名称 这里为"MyWinRing0" 可以自定义任意名称
  10.         MYWINRIN0,   //这是驱动服务显示名称,可以自定义任意名称,这里我选择和上面一样
  11.         SERVICE_ALL_ACCESS,
  12.         SERVICE_KERNEL_DRIVER,
  13.         SERVICE_DEMAND_START,
  14.         SERVICE_ERROR_NORMAL,
  15.         gDriverPath, //驱动存放的路径,这里和应用程序同目录
  16.         NULL,
  17.         NULL,
  18.         NULL,
  19.         NULL,
  20.         NULL
  21.         );
  22.     CloseServiceHandle(hService); //上面创建成功后就关闭掉这个句柄
  23.     hService1 = OpenService(hSCManager, MYWINRIN0, SERVICE_ALL_ACCESS); //打开上面创建的服务,名字为"MyWinRing0"
  24.      int  result=StartService(hService1,  0 , NULL); //启动服务
  25.     CloseServiceHandle(hSCManager);
  26.     CloseServiceHandle(hService1);
  27. }
2.打开驱动服务
  1. //驱动服务启动后,打开驱动
  2. BOOL OpenDriver()
  3. {
  4.      char  message[ 2 5 6 ];
  5.     gHandle = CreateFile(
  6.         _T("\\\\\\\\.\\\\") OLS_DRIVER_ID, //这个地方的名字必须是驱动程序里面IoCreateDevice函数创建设备是 使用的名字
  7.         GENERIC_READ | GENERIC_WRITE,
  8.         0,
  9.         NULL,
  10.         OPEN_EXISTING,
  11.         FILE_ATTRIBUTE_NORMAL,
  12.         NULL
  13.         );
  14.      int  code=GetLastError();
  15.      if (gHandle == INVALID_HANDLE_VALUE)
  16.     {
  17.          return  FALSE;
  18.     }
  19.      return  TRUE;
  20. }
3.停止驱动
  1. //停止驱动
  2. BOOL  StopDriver(SC_HANDLE hSCManager,LPCTSTR DriverId)
  3. {
  4.     SC_HANDLE        hService = NULL;
  5.     BOOL            rCode = FALSE;
  6.     SERVICE_STATUS    serviceStatus;
  7.     DWORD        error = NO_ERROR;
  8.     hService = OpenService(hSCManager, DriverId, SERVICE_ALL_ACCESS);
  9.      if (hService != NULL)
  10.     {
  11.         rCode = ControlService(hService, SERVICE_CONTROL_STOP, &serviceStatus);
  12.         error = GetLastError();
  13.         CloseServiceHandle(hService);
  14.     }
  15.      return  rCode;
  16. }
4.卸载驱动
  1. //卸载驱动
  2. BOOL RemoveDriver(SC_HANDLE hSCManager, LPCTSTR DriverId)
  3. {
  4.     SC_HANDLE   hService = NULL;
  5.     BOOL        rCode = FALSE;
  6.     hService = OpenService(hSCManager, DriverId, SERVICE_ALL_ACCESS);
  7.      if (hService == NULL)
  8.     {
  9.         rCode = TRUE;
  10.     }
  11.      else
  12.     {
  13.         rCode = DeleteService(hService);
  14.         CloseServiceHandle(hService);
  15.     }
  16.      return  rCode;
  17. }
  18. rar 改 jpg

以上是关于vc++ 加载,卸载自己的驱动程序的主要内容,如果未能解决你的问题,请参考以下文章

VC6.0的程序结束后进程不自动结束,如何解决?

完全卸载和重新加载伪造查看器

使用Powershell实现自动化安装/卸载程序

安装软件出现缺少vcruntime140dll的解决方法

C#.Net 如何动态加载与卸载程序集(.dll或者.exe)3---- 动态加载Assembly应用程序

MFC如何调用DLL(VC++)