驱动加载器

本文提供了一组使用Windows服务管理API的示例代码,包括创建、启动、停止及删除服务等功能。通过这些示例,读者可以了解如何利用OpenSCManager、CreateService等函数来实现对Windows服务的全生命周期管理。
摘要由CSDN通过智能技术生成

API

OpenSCManager
CreateService
OpenService
StartService
ControlService
DeleteService
CloseServiceHandle

代码示例

void CLoadDriverDlg::OnBtnLoad() 
{
    CString strPath;
    m_edtPath.GetWindowText(strPath);
    if (strPath.IsEmpty())
    {
        ::SetDlgItemText(GetSafeHwnd(), IDC_STC_STATE, "请选择驱动文件路径");
        return;
    }

    SC_HANDLE schSCManager = NULL;
    SC_HANDLE schService = NULL;

    schSCManager = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if (schSCManager == NULL)
    {
        goto SAFE_EXIT;
    }

    schService = ::CreateService( 
                                schSCManager,              // SCManager database 
                                SERVICENAME,               // name of service 
                                DISPLAYNAME,               // service name to display 
                                SERVICE_ALL_ACCESS,        // desired access 
                                SERVICE_KERNEL_DRIVER,     // service type 
                                SERVICE_DEMAND_START,      // start type 
                                SERVICE_ERROR_NORMAL,      // error control type 
                                strPath,                   // service's binary 
                                NULL,                      // no load ordering group 
                                NULL,                      // no tag identifier 
                                NULL,                      // no dependencies 
                                NULL,                      // LocalSystem account 
                                NULL);                     // no password 
    if (schService == NULL) 
    {
        goto SAFE_EXIT;
    }
    ::SetDlgItemText(GetSafeHwnd(), IDC_STC_STATE, "服务安装成功");
SAFE_EXIT:
    ShowState();
    SafeCloseService(schService);
    SafeCloseService(schSCManager);
}

void CLoadDriverDlg::ShowState()
{
    LPVOID lpMsgBuf;
    FormatMessage( 
        FORMAT_MESSAGE_ALLOCATE_BUFFER | 
        FORMAT_MESSAGE_FROM_SYSTEM | 
        FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        GetLastError(),
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
        (LPTSTR) &lpMsgBuf,
        0,
        NULL 
        );
    // Process any inserts in lpMsgBuf.
    // ...
    // Display the string.
    //MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
    ::SetDlgItemText(GetSafeHwnd(), IDC_STC_STATE, (LPCTSTR)lpMsgBuf);
    // Free the buffer.
    LocalFree( lpMsgBuf );
}

void CLoadDriverDlg::OnBtnUnload() 
{
    SC_HANDLE schSCManager = NULL;
    SC_HANDLE schService = NULL;

    schSCManager = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if (schSCManager == NULL)
    {
        goto SAFE_EXIT;
    }

    schService = ::OpenService( 
        schSCManager,          // SCM database 
        SERVICENAME,           // service name
        SERVICE_ALL_ACCESS); 
    if (schService == NULL) 
    {
        goto SAFE_EXIT;
    }

    if (!DeleteService(schService))
    {
        goto SAFE_EXIT;
    }

    ::SetDlgItemText(GetSafeHwnd(), IDC_STC_STATE, "服务卸载成功");
SAFE_EXIT:
    ShowState();
    SafeCloseService(schService);
    SafeCloseService(schSCManager);
}

void CLoadDriverDlg::OnBtnStart() 
{
    SC_HANDLE schSCManager = NULL;
    SC_HANDLE schService = NULL;

    schSCManager = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if (schSCManager == NULL)
    {
        goto SAFE_EXIT;
    }

    schService = ::OpenService( 
        schSCManager,          // SCM database 
        SERVICENAME,           // service name
        SERVICE_ALL_ACCESS); 
    if (schService == NULL) 
    {
        goto SAFE_EXIT;
    }

    if (!StartService(schService, 0 ,NULL))
    {
        goto SAFE_EXIT;
    }

    ::SetDlgItemText(GetSafeHwnd(), IDC_STC_STATE, "启动成功");
SAFE_EXIT:
    ShowState();
    SafeCloseService(schService);
    SafeCloseService(schSCManager);
}

void CLoadDriverDlg::OnBtnStop() 
{
    SC_HANDLE schSCManager = NULL;
    SC_HANDLE schService = NULL;
    SERVICE_STATUS serviceStatus;

    schSCManager = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if (schSCManager == NULL)
    {
        goto SAFE_EXIT;
    }

    schService = ::OpenService( 
        schSCManager,          // SCM database 
        SERVICENAME,           // service name
        SERVICE_ALL_ACCESS); 
    if (schService == NULL) 
    {
        goto SAFE_EXIT;
    }

    if (!ControlService(schService, SERVICE_CONTROL_STOP, &serviceStatus))
    {
        goto SAFE_EXIT;
    }

    ::SetDlgItemText(GetSafeHwnd(), IDC_STC_STATE, "停止成功");
SAFE_EXIT:
    ShowState();
    SafeCloseService(schService);
    SafeCloseService(schSCManager);
}
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>软件名称:驱动加载工具(InstDrv - 中文版)软件版本:V1.0版软件类型:个人免费版(无插件)运行环境:Windows操作系统开发作者:Coderui更新日期:2008年04月08日联系邮箱:coderui@163.com作者博客:http://hi.baidu.com/coderui>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-------------------------------------------------介绍:  该软件和网上大家常用的“InstDrv”程序功能几乎一样,只是新加入了详细的中文提示信息和拖拽打开文件等,这样可以方便用户的使用。“InstDrv”是一个比较好用的驱动安装、卸载工具。可以帮助您方便的把驱动程序安装上或卸载掉。本程序更多应用于动态调式驱动前的加载操作中。功能:1:执行加载、启动、停止、卸载驱动操作。2:支持文件拖拽打开。3:支持程序窗口总在最前显示。4:操作后有详细的中文提示信息。说明:压缩包中的“MySYS.sys”文件为测试驱动程序,支持加载、启动、停止、卸载驱动等功能,可以使用“Dbgview”工具查看驱动输出的提示信息。-------------------------------------------------详细的中文提示信息如下:状态:支持拖拽获取文件路径.状态:只能一次拖拽一个文件!状态:拖拽获取文件路径成功!状态:请输入驱动文件的路径名!状态:创建句柄失败!状态:因为不是一个有效文件,所以驱动服务安装失败!状态:因为驱动服务已经存在,所以驱动服务安装失败!状态:因为驱动服务已经启动,所以驱动服务安装失败!状态:驱动服务安装失败!状态:驱动服务安装成功!状态:打开驱动服务失败,可能该驱动服务不存在!状态:驱动服务启动成功!状态:因为驱动服务已经启动,所以驱动服务启动失败!状态:因为不是一个有效驱动,所以驱动服务启动失败!状态:因为驱动服务未被停止,所以驱动服务启动失败!状态:驱动服务启动失败!状态:驱动服务停止成功!状态:因为驱动服务没有启动,所以驱动服务停止失败!状态:驱动服务停止失败!状态:驱动服务卸栽成功!状态:因为驱动服务已经启动,所以驱动服务卸栽失败!状态:驱动服务卸栽失败!-------------------------------------------------下载说明:如果当前网页连接地址下载不了该软件,您可以发送邮件到coderui@163.com中,向程序作者所要该软件,谢谢您的支持!-------------------------------------------------解压后EXE程序全文MD5校验值为:591d784d24f5aead3a383535a4100733专用MD5校验程序下载地址为:http://hi.baidu.com/coderui/blog/item/e3a1282354c128519822ed24.html>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值