编写内核驱动加载工具

           编写内核驱动加载工具

一丶加载内核驱动的常用API介绍.

加载内核驱动,使用我们的ring3下的API即可完成.

API分别是:

OpenSCManager  打开设备(服务)管理器

CreateService  创建服务(或者设备,根据参数不同而不同)

OpenService     打开设备或者服务.

StartService           启动服务,启动设备.

ControlService       控制设备或者服务的状态.

CloseServiceHandle 关闭服务或者设备的句柄

DeleteService       卸载服务

参数介绍:

1.打开设备管理器
SC_HANDLE OpenSCManager(
  LPCTSTR lpMachineName,   // 机器名称.可以制定计算机,如不指定,给NULL则是打开自己.
  LPCTSTR lpDatabaseName,  // 打开设备管理器数据库的名称,如果为NULL则使用默认的.
  DWORD dwDesiredAccess    // 打开的权限.
);

返回值:

  成功: 返回设备管理器的句柄

  失败: 返回NULL

 

2.创建设备或者服务.
SC_HANDLE CreateService( 
SC_HANDLE hSCManager, //设备管理器句柄,通过OpenScManger返回 LPCTSTR lpServiceName, // 服务或者设备启动的名称 LPCTSTR lpDisplayName, // 服务或者的显示名称 DWORD dwDesiredAccess, // 访问服务或者设备的权限 DWORD dwServiceType, // 创建的服务或者设备的类型,如果是内核驱动,则通过这里给 DWORD dwStartType, // 服务或者设备何时启动 DWORD dwErrorControl, // 服务或者设备如果启动出错,则指定一下应用程序应该怎么做,(重启,或者重新长还是.) LPCTSTR lpBinaryPathName, // 服务或者设备的文件路径,必须给. LPCTSTR lpLoadOrderGroup, // 服务或者设备排租. LPDWORD lpdwTagId, // 可以通过注册表来启动服务. LPCTSTR lpDependencies, // array of dependency names LPCTSTR lpServiceStartName, // 服务的启动名称. LPCTSTR lpPassword // 密码;

返回值:

  成功: 返回创建服务或者设备的句柄.

  失败: 返回NULL

3.打开服务或者设备.
SC_HANDLE OpenService(
  SC_HANDLE hSCManager,  // 设备管理器的句柄,通过OpenScManger返回.
  LPCTSTR lpServiceName, // 服务或者设备的名称.
  DWORD dwDesiredAccess  // 打开服务或者设备的权限.
);

返回值:

  成功: 返回服务或者设备的句柄.

  失败: 返回NULL

4.启动服务或者设备.
BOOL StartService(
  SC_HANDLE hService,            // 服务或者设备句柄
  DWORD dwNumServiceArgs,        // 二维数组的个数.
  LPCTSTR* lpServiceArgVectors   // 二维数组.其中每组存储一个服务名称.如果是内核驱动则都给NULL即可.
);

返回值:

  成功: 返回非零值

  失败: 返回零值.

5.控制服务或者设备.
BOOL ControlService(
  SC_HANDLE hService,               // 服务或者设备句柄,通过OpenService或者CreateService返回.
  DWORD dwControl,                  //控制代码. 如果给SERVICE_CONTROL_PAUSE那么服务就会暂停
  LPSERVICE_STATUS lpServiceStatus  // 服务的状态.是一个结构体,操作系统帮你填好.

结构体:

typedef struct _SERVICE_STATUS { 
  DWORD dwServiceType;     //服务的类型
  DWORD dwCurrentState;    //服务的当前状态,暂停状态还是停止状态....
  DWORD dwControlsAccepted;    //服务的控制码.
  DWORD dwWin32ExitCode;    //服务错误或者停止返回的错误驮
  DWORD dwServiceSpecificExitCode; //服务启动的是否返回的错误代码.
  DWORD dwCheckPoint;      //服务开启的是否的用于统计的次数.到达100则启动完成.一般进度条使用
  DWORD dwWaitHint; 
} SERVICE_STATUS, *LPSERVICE_STATUS//给定一个期望值.时间.然后按照时间一点一点的启动.
6.关闭服务句柄.
BOOL CloseServiceHandle(
  SC_HANDLE hSCObject   // 服务或者设备的句柄
);

 7.卸载服务

BOOL DeleteService(  SC_HANDLE hService   // handle to service);

 

二丶详细代码

上面是简单的API介绍.下面则贴出完整的代码.

请注意我这里使用的是MFC编写的. 但是其每个函数不会互相依赖.如果你是拷贝代码.则之间诶拷贝过去就可以使用.

1.安装内核驱动代码

 m_CreateService = CreateService(
        m_ScHand, 
        服务或者设备名称,   //例如: MySystem.sys
        服务或者设备的名称,
        SC_MANAGER_ALL_ACCESS,
        SERVICE_KERNEL_DRIVER,//安装的属性,我这里给的是内核的.所以安装的是内核.
        SERVICE_DEMAND_START,
        SERVICE_ERROR_SEVERE,
        m_EdtPathName,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL);
    if (m_CreateService == NULL)
    {
        ::CloseServiceHandle(m_CreateService);
        ::CloseServiceHandle(m_ScHand);
        ::MessageBox(NULL, TEXT("Sorry Install Drive Fail"), TEXT("Error"), NULL);
        return;
    }
    ::CloseServiceHandle(m_CreateService);
    ::CloseServiceHandle(m_ScHand);
    ::MessageBox(NULL, TEXT("InStall Drive Sucess"), TEXT("Sucess"), NULL);

2.卸载代码

     m_ScHand = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if (m_ScHand == NULL)
    {
        ::MessageBox(NULL, TEXT("Sorry OpenScManger Fail\r\n"), TEXT("Error"), MB_ICONEXCLAMATION);
        return;
    }
    //open Service
    m_CreateService = OpenService(m_ScHand, m_ServiceName, SERVICE_STOP | DELETE);
    if (m_CreateService == NULL)
    {
        ::MessageBox(NULL, TEXT("Sorry Install Drive Fail"), TEXT("Error"), NULL);
        return;
    }
    BOOL bRet = FALSE;
          bRet = DeleteService(m_CreateService);
         if (!bRet)
         {
             ::CloseServiceHandle(m_CreateService);
             ::CloseServiceHandle(m_ScHand);
             ::MessageBox(NULL, TEXT("Sorry UnInstall Drive Fail"), TEXT("Error"), NULL);
             return;
         }
        

  
     DeleteService(m_CreateService);
    ::CloseServiceHandle(m_CreateService);
    ::CloseServiceHandle(m_ScHand);
    ::MessageBox(NULL, TEXT("UnInstall Drive Sucess"), TEXT("Sucess"), NULL);

3.启动内核驱动的代码

  m_ScHand = NULL;
    m_CreateService = NULL;
    m_ScHand = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if (m_ScHand == NULL)
    {
        ::MessageBox(NULL, TEXT("Sorry OpenScManger Fail\r\n"), TEXT("Error"), MB_ICONEXCLAMATION);
        return;
    }
    //open Service
    m_CreateService = OpenService(m_ScHand, m_ServiceName, SERVICE_START);
    if (m_CreateService == NULL)
    {
        ::MessageBox(NULL, TEXT("Sorry Start Drive Fail"), TEXT("Error"), NULL);
        return;
    }

    UpdateData(TRUE);
    BOOL bRet = StartService(m_CreateService,0,NULL); //重要的地方.

    if (bRet == NULL)
    {
        ::CloseServiceHandle(m_CreateService);
        ::CloseServiceHandle(m_ScHand);
        ::MessageBox(NULL, TEXT("Sorry Start Service Fail\r\n"), TEXT("Error"), IDOK);
        return;
    }

    ::CloseServiceHandle(m_CreateService);
    ::CloseServiceHandle(m_ScHand);
    ::MessageBox(NULL, TEXT(" Start Service Sucess\r\n"), TEXT("Sucess"), IDOK);

4..暂停内核驱动.

m_ScHand = NULL;
    m_CreateService = NULL;
    UpdateData(TRUE);
    m_ScHand = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);  
    SERVICE_STATUS svcsta = { 0 };  
    if (m_ScHand != NULL){  
        SC_HANDLE hService = OpenService(m_ScHand, m_ServiceName, SERVICE_STOP);  
        if (hService != NULL)
        {  
            if (ControlService(m_CreateService, SERVICE_CONTROL_STOP, &svcsta))  
            {  
                CloseServiceHandle(m_CreateService);  
                CloseServiceHandle(m_ScHand);  
                ::MessageBox(NULL, TEXT(" Stop Service Sucess\r\n"), TEXT("Sucess"), IDOK);
                return ;  
            }  
            CloseServiceHandle(m_CreateService);  
            CloseServiceHandle(m_ScHand);  
            ::MessageBox(NULL, TEXT(" Stop Service Fail\r\n"), TEXT("Error"), IDOK);
            return ;  
        }  
        CloseServiceHandle(m_ScHand);  
        return ;  
    }  
    else 
    {
        ::MessageBox(NULL, TEXT(" Stop Service Fail\r\n"), TEXT("Fail"), IDOK);
        return ;  
    }
    return;
    

 

完整的工程代码资料下载:

  链接:https://pan.baidu.com/s/1kWoHJZD 密码:osy7

 

原创不易,转载请注明出处.

转载于:https://www.cnblogs.com/iBinary/p/8280912.html

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>软件名称:驱动加载工具(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、付费专栏及课程。

余额充值