博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NT式驱动的安装
阅读量:6082 次
发布时间:2019-06-20

本文共 3380 字,大约阅读时间需要 11 分钟。

 NT式驱动的安装

  •       A、OpenSCManager
  •       B、CreateService
  •       C、OpenService
  •       D、StartService
  •       E、CloseServiceHandle
  •       F、集成到loadNTDriver函数

 

#include <winsvc.h> 

正常加载驱动的步骤如下:

 1、调用OpenSCManager,打开SCM管理器。如果返回NULL,则返回失败,否则继续下一步;

 2、调用CreateService创建服务,如果用GetLastError获取的返回值为ERROR_IO_PENDING,说明服务已经创建过,此时用OpenService打开此服务.

 3、调用StartService开启服务

SC_HANDLE OpenSCManager( LPCTSTR lpMachineName, // 指向计算机名称,此处为NULL表示指向本机   LPCTSTR lpDatabaseName, // SCM数据库名称,此用为NULL表示使用默认 DWORD dwDesiredAccess   // 使用权限 一般设置为SC_MANAGER_ALL_ACCESS表示有所有使用权限);
BOOL CloseServiceHandle(   SC_HANDLE hSCObject   // 要关闭的SCM句柄 );
//打开服务控制管理器hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
//创建驱动所对应的服务hServiceDDK = CreateService( hServiceMgr,//SCM管理器句柄     lpszDriverName, //驱动程序的在注册表中的名字      lpszDriverName, // 注册表驱动程序的 DisplayName 值      SERVICE_ALL_ACCESS, // 加载驱动程序的访问权限      SERVICE_KERNEL_DRIVER,// 表示加载的服务是驱动程序      SERVICE_DEMAND_START, // 注册表驱动程序的 Start 值      SERVICE_ERROR_IGNORE, // 注册表驱动程序的 ErrorControl 值      szDriverImagePath, // 注册表驱动程序的 ImagePath 值      NULL,              //要开启服务的 用户组    NULL,  //输出验证标签    NULL,   //所依赖的服务的名称    NULL,   //用户账户名称    NULL);  //用户口令
// 驱动程序已经加载,只需要打开  hServiceDDK = OpenService( hServiceMgr, lpszDriverName, SERVICE_ALL_ACCESS );
//开启此项服务bRet= StartService( hServiceDDK, NULL, NULL );

 

 集成到loadNTDriver函数

//装载NT驱动程序BOOL LoadNTDriver(char* lpDriverName,char* lpDriverPathName){   BOOL bRet = FALSE;  SC_HANDLE hServiceMgr=NULL;//SCM管理器的句柄  SC_HANDLE hServiceDDK=NULL;//NT驱动程序的服务句柄  //打开服务控制管理器  hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );  if( hServiceMgr == NULL )   {    //OpenSCManager失败    TRACE( "OpenSCManager() Faild %d ! \n", GetLastError() );    bRet = FALSE;    goto BExit;  }  else  {    //OpenSCManager成功    TRACE( "OpenSCManager() ok ! \n" );    }  //创建驱动所对应的服务  hServiceDDK = CreateService( hServiceMgr,      lpDriverName, //驱动程序的在注册表中的名字        lpDriverName, // 注册表驱动程序的 DisplayName 值        SERVICE_ALL_ACCESS, // 加载驱动程序的访问权限        SERVICE_KERNEL_DRIVER,// 表示加载的服务是驱动程序        SERVICE_DEMAND_START, // 注册表驱动程序的 Start 值        SERVICE_ERROR_IGNORE, // 注册表驱动程序的 ErrorControl 值        lpDriverPathName, // 注册表驱动程序的 ImagePath 值        NULL,        NULL,        NULL,        NULL,        NULL);    DWORD dwRtn;  //判断服务是否失败  if( hServiceDDK == NULL )    {      dwRtn = GetLastError();    if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_EXISTS )      {        //由于其他原因创建服务失败      TRACE( "CrateService() 失败 %d ! \n", dwRtn );        bRet = FALSE;      goto BExit;    }      else      {      //服务创建失败,是由于服务已经创立过      TRACE( "CrateService() 服务创建失败,是由于服务已经创立过 ERROR is ERROR_IO_PENDING or ERROR_SERVICE_EXISTS! \n" );      }    // 驱动程序已经加载,只需要打开      hServiceDDK = OpenService( hServiceMgr, lpDriverName, SERVICE_ALL_ACCESS );      if( hServiceDDK == NULL )      {      //如果打开服务也失败,则意味错误      dwRtn = GetLastError();        TRACE( "OpenService() 失败 %d ! \n", dwRtn );        bRet = FALSE;      goto BExit;    }      else     {     TRACE( "OpenService() 成功 ! \n" );    }  }    else    {    TRACE( "CrateService() 成功 ! \n" );  }  //开启此项服务  bRet= StartService( hServiceDDK, NULL, NULL );    if( !bRet )  //开启服务不成功  {      TRACE( "StartService() 失败 服务可能已经开启%d ! \n", dwRtn );    }  bRet = TRUE;//离开前关闭句柄 BExit:  if(hServiceDDK)  {    CloseServiceHandle(hServiceDDK);  }  if(hServiceMgr)  {    CloseServiceHandle(hServiceMgr);  }  return bRet;}

转载地址:http://oxzwa.baihongyu.com/

你可能感兴趣的文章
EGOTextView
查看>>
redis监控客户端redis-cli
查看>>
hibernate中拦截器与事件监听器的区别
查看>>
一个简单的电话本程序,支持添加和查找功能。
查看>>
使用堆栈实现括号的匹配
查看>>
超强壮的RSA加密Android短信
查看>>
MyEclipse中把选中的一部分代码变成全部大写或小写快捷键
查看>>
图片缩放
查看>>
自定义表单中计算控件的插件代码
查看>>
Java中的代理的使用
查看>>
springboot 下载文件
查看>>
使用C#创建SQL Server的存储过程
查看>>
一个鸡蛋的启示(传疯了)
查看>>
FreeMarker的优点和缺点
查看>>
ubuntu 安装tengine
查看>>
Java类到对象的创建过程
查看>>
eclipse下安装js插件-spket(支持Ext) 能格式化Js(JQuery自动提示)
查看>>
Scala之类、特质和抽象类
查看>>
/var/log目录下的20个Linux日志文件功能详解
查看>>
ThinkPad紧凑型蓝牙键盘(0B47189)鼠标滚轮用法,F1到F12功能键的功能切换以及其他技巧...
查看>>