• 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
  • 相关阅读:
    springmvc配置全局日期转换器
    JSON反序列化没有真正数组,本质类型都是List<Object>
    优化.Net MVC 访问页面慢
    Log4j2过滤日志级别配置
    Springboot重新加载Bean
    CTFWeb:Oracle SQL 注入
    CTFWeb:SqlServer SQL 注入
    操作系统:文件系统
    操作系统:多级反馈队列和比例份额
    Android:利用系统服务设置系统音量
  • 原文地址:https://www.cnblogs.com/kuangke/p/5524396.html
Copyright © 2020-2023  润新知