c++ 驱动【加载,启动,停止,卸载】

驱动代码参考:https://blog.csdn.net/Simon798/article/details/103308039

exe 代码:

#include <iostream>
#include <Windows.h>
using namespace std;

// 安装驱动
BOOL installDvr(CONST WCHAR drvPath[50], CONST WCHAR serviceName[20]) {
    
    // 打开服务控制管理器数据库
    SC_HANDLE schSCManager = OpenSCManager(
        NULL,                   // 目标计算机的名称,NULL:连接本地计算机上的服务控制管理器
        NULL,                   // 服务控制管理器数据库的名称,NULL:打开 SERVICES_ACTIVE_DATABASE 数据库
        SC_MANAGER_ALL_ACCESS   // 所有权限
    );
    if (schSCManager == NULL) {
        CloseServiceHandle(schSCManager);
        return FALSE;
    }

    // 创建服务对象,添加至服务控制管理器数据库
    SC_HANDLE schService = CreateService(
        schSCManager,               // 服务控件管理器数据库的句柄
        serviceName,                // 要安装的服务的名称
        serviceName,                // 用户界面程序用来标识服务的显示名称
        SERVICE_ALL_ACCESS,         // 对服务的访问权限:所有全权限
        SERVICE_KERNEL_DRIVER,      // 服务类型:驱动服务
        SERVICE_DEMAND_START,       // 服务启动选项:进程调用 StartService 时启动
        SERVICE_ERROR_IGNORE,       // 如果无法启动:忽略错误继续运行
        drvPath,                    // 驱动文件绝对路径,如果包含空格需要多加双引号
        NULL,                       // 服务所属的负载订购组:服务不属于某个组
        NULL,                       // 接收订购组唯一标记值:不接收
        NULL,                       // 服务加载顺序数组:服务没有依赖项
        NULL,                       // 运行服务的账户名:使用 LocalSystem 账户
        NULL                        // LocalSystem 账户密码
    );
    if (schService == NULL) {
        CloseServiceHandle(schService);
        CloseServiceHandle(schSCManager);
        return FALSE;
    }

    CloseServiceHandle(schService);
    CloseServiceHandle(schSCManager);
    return TRUE;
}

// 启动服务
BOOL startDvr(CONST WCHAR serviceName[20]) {

    // 打开服务控制管理器数据库
    SC_HANDLE schSCManager = OpenSCManager(
        NULL,                   // 目标计算机的名称,NULL:连接本地计算机上的服务控制管理器
        NULL,                   // 服务控制管理器数据库的名称,NULL:打开 SERVICES_ACTIVE_DATABASE 数据库
        SC_MANAGER_ALL_ACCESS   // 所有权限
    );
    if (schSCManager == NULL) {
        CloseServiceHandle(schSCManager);
        return FALSE;
    }

    // 打开服务
    SC_HANDLE hs = OpenService(
        schSCManager,           // 服务控件管理器数据库的句柄
        serviceName,            // 要打开的服务名
        SERVICE_ALL_ACCESS      // 服务访问权限:所有权限
    );
    if (hs == NULL) {
        CloseServiceHandle(hs);
        CloseServiceHandle(schSCManager);
        return FALSE;
    }
    if (StartService(hs, 0, 0) == 0) {
        CloseServiceHandle(hs);
        CloseServiceHandle(schSCManager);
        return FALSE;
    }

    
    CloseServiceHandle(hs);
    CloseServiceHandle(schSCManager);
    return TRUE;
}

// 停止服务
BOOL stopDvr(CONST WCHAR serviceName[20]) {

    // 打开服务控制管理器数据库
    SC_HANDLE schSCManager = OpenSCManager(
        NULL,                   // 目标计算机的名称,NULL:连接本地计算机上的服务控制管理器
        NULL,                   // 服务控制管理器数据库的名称,NULL:打开 SERVICES_ACTIVE_DATABASE 数据库
        SC_MANAGER_ALL_ACCESS   // 所有权限
    );
    if (schSCManager == NULL) {
        CloseServiceHandle(schSCManager);
        return FALSE;
    }

    // 打开服务
    SC_HANDLE hs = OpenService(
        schSCManager,           // 服务控件管理器数据库的句柄
        serviceName,            // 要打开的服务名
        SERVICE_ALL_ACCESS      // 服务访问权限:所有权限
    );
    if (hs == NULL) {
        CloseServiceHandle(hs);
        CloseServiceHandle(schSCManager);
        return FALSE;
    }

    // 如果服务正在运行
    SERVICE_STATUS status;
    if (QueryServiceStatus(hs, &status) == 0) {
        CloseServiceHandle(hs);
        CloseServiceHandle(schSCManager);
        return FALSE;
    }
    if (status.dwCurrentState != SERVICE_STOPPED &&     
        status.dwCurrentState != SERVICE_STOP_PENDING
        ) {
        // 发送关闭服务请求
        if (ControlService(
            hs,                         // 服务句柄
            SERVICE_CONTROL_STOP,       // 控制码:通知服务应该停止
            &status                     // 接收最新的服务状态信息
        ) == 0) {
            CloseServiceHandle(hs);
            CloseServiceHandle(schSCManager);
            return FALSE;
        }

        // 判断超时
        INT timeOut = 0;
        while(status.dwCurrentState != SERVICE_STOPPED){
            timeOut++;
            QueryServiceStatus(hs, &status);
            Sleep(50);
        }
        if (timeOut > 80) {
            CloseServiceHandle(hs);
            CloseServiceHandle(schSCManager);
            return FALSE;
        }
    }

    CloseServiceHandle(hs);
    CloseServiceHandle(schSCManager);
    return TRUE;
}

// 卸载驱动
BOOL unloadDvr(CONST WCHAR serviceName[20]) {

    // 打开服务控制管理器数据库
    SC_HANDLE schSCManager = OpenSCManager(
        NULL,                   // 目标计算机的名称,NULL:连接本地计算机上的服务控制管理器
        NULL,                   // 服务控制管理器数据库的名称,NULL:打开 SERVICES_ACTIVE_DATABASE 数据库
        SC_MANAGER_ALL_ACCESS   // 所有权限
    );
    if (schSCManager == NULL) {
        CloseServiceHandle(schSCManager);
        return FALSE;
    }

    // 打开服务
    SC_HANDLE hs = OpenService(
        schSCManager,           // 服务控件管理器数据库的句柄
        serviceName,            // 要打开的服务名
        SERVICE_ALL_ACCESS      // 服务访问权限:所有权限
    );
    if (hs == NULL) {
        CloseServiceHandle(hs);
        CloseServiceHandle(schSCManager);
        return FALSE;
    }

    // 删除服务
    if (DeleteService(hs) == 0) {
        CloseServiceHandle(hs);
        CloseServiceHandle(schSCManager);
        return FALSE;
    }

    CloseServiceHandle(hs);
    CloseServiceHandle(schSCManager);
    return TRUE;
}

int main()
{
    if (installDvr(L"C:\\Test_Driver_1.sys", L"LYSM_service") == TRUE) {
        cout << "installDvr success." << endl;
    }
    if (startDvr(L"LYSM_service") == TRUE) {
        cout << "startDvr success." << endl;
    }
    if (stopDvr(L"LYSM_service") == TRUE) {
        cout << "stopDvr success." << endl;
    }
    if (unloadDvr(L"LYSM_service") == TRUE) {
        cout << "unloadDvr success." << endl;
    }
	
	
    getchar();
    return 0;
}

打开 DbgView,设置过滤条件,运行编译好的 exe,看下效果:
注意要禁用驱动签名强制,否则 startDvr 会失败 !
在这里插入图片描述

  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
郁金香驱动教程\驱动学习笔记 ..............\............\0前言.doc ..............\............\1.1.1 安装VC++6.0 -(1课).doc ..............\............\1.1.2 安装VS2003-VC++7.0 -(2课).doc ..............\............\1.1.3 安装VS2008-VC++9.0 -(3课).doc ..............\............\1.1.4 安装VC助手 -(4课).doc ..............\............\1.1.5 安装DDK -(5课).doc ..............\............\1.2.1 VC6环境编译驱动 -(6课).doc ..............\............\1.2.2 VS2003环境编译驱动 -(7课).doc ..............\............\1.2.3 VS2008环境编译驱动 -(8课).doc ..............\............\1.3.1编写一个名为DDK_HelloWorld简单的驱动 -(9课).doc ..............\............\1.3.2为DDK_HelloWorld添加卸载驱动例程 -(10课).doc ..............\............\1.3.3 用工具过驱动保护(确定学习方向) -(11课).doc ..............\............\1.3.4为DDK_HelloWorld添加设备例程 -(12课).doc ..............\............\1.3.5VM+windbg安装 -(13课).doc ..............\............\1.3.6实战用windbg调试自己驱动DDK_HelloWorld -(14课).doc ..............\............\1.3.7DDK_HelloWorld卸载例程细化 -(15课).doc ..............\............\1.3.8为DDK_HelloWorld添加默认派遣例程 -(16课).doc ..............\............\1.4.1需要具备的理论知识 -(17课).doc ..............\............\1.4.2读出SSDT表当前函数地址 -(18课).doc ..............\............\1.4.3读出原函数地址 -(19课).doc ..............\............\1.4.4向指定地址写入代码 -(20课).doc ..............\............\1.4.5绕过SSDT驱动保护 -(21课).doc ..............\............\1.6 NT式驱动安装 -(22课).doc ..............\............\1.7 NT式驱动卸载 -(23课).doc ..............\............\1.8 驱动代码中C和C++代码区别 -(24课).doc ..............\............\1.9、再谈VC环境配置 -(25课).doc ..............\............\2.1手动加载NT式驱动(非工具) -(26课).doc ..............\............\2.2.2、实战EXE和SYS通信 -(28课).doc ..............\............\2.2、应用程序与驱动交互访问(缓冲模式) -(27课).doc ..............\............\2.3、应用程序与驱动交互访问(直接模式) -(29课).doc ..............\............\2.4、应用程序与驱动交互访问(其它模式) -(30课).doc ..............\............\2.5、再谈SSDT HOOK驱动保护原理 -(31课).doc ..............\............\2.6、自写驱动保护XX进程(HOOK SSDT) -(32课).doc

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值