驱动学习笔记二:加载驱动

原创 2008年09月28日 20:59:00

下面的代码是使用的SCM加载的驱动,非是什么猥琐方法...思想委琐的人可以去蹲墙角去了。驱动名和驱动路径之前定义过了...如果想写个加载工具,是可以参考下InstDrv工具源代码的。方法都一样的,呵呵

  1. #include <windows.h>  
  2. #include <winsvc.h>  
  3. #include <conio.h>  
  4. #include <stdio.h>
  5. #define DRIVER_NAME "HelloDDK"
  6. #define DRIVER_PATH "..//MyDriver//MyDriver_Check//HelloDDK.sys"
  7. //装载NT驱动程序
  8. BOOL LoadNTDriver(char* lpszDriverName,char* lpszDriverPath)
  9. {
  10.     char szDriverImagePath[256];
  11.     //得到完整的驱动路径
  12.     GetFullPathName(lpszDriverPath, 256, szDriverImagePath, NULL);
  13.     BOOL bRet = FALSE;
  14.     SC_HANDLE hServiceMgr=NULL;//SCM管理器的句柄
  15.     SC_HANDLE hServiceDDK=NULL;//NT驱动程序的服务句柄
  16.     //打开服务控制管理器
  17.     hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
  18.     if( hServiceMgr == NULL )  
  19.     {
  20.         //OpenSCManager失败
  21.         printf( "OpenSCManager() Faild %d ! /n", GetLastError() );
  22.         bRet = FALSE;
  23.         goto BeforeLeave;
  24.     }
  25.     else
  26.     {
  27.         ////OpenSCManager成功
  28.         printf( "OpenSCManager() ok ! /n" );  
  29.     }
  30.     //创建驱动所对应的服务
  31.     hServiceDDK = CreateService( hServiceMgr,
  32.         lpszDriverName, //驱动程序的在注册表中的名字  
  33.         lpszDriverName, // 注册表驱动程序的 DisplayName 值  
  34.         SERVICE_ALL_ACCESS, // 加载驱动程序的访问权限  
  35.         SERVICE_KERNEL_DRIVER,// 表示加载的服务是驱动程序  
  36.         SERVICE_DEMAND_START, // 注册表驱动程序的 Start 值  
  37.         SERVICE_ERROR_IGNORE, // 注册表驱动程序的 ErrorControl 值  
  38.         szDriverImagePath, // 注册表驱动程序的 ImagePath 值  
  39.         NULL,  
  40.         NULL,  
  41.         NULL,  
  42.         NULL,  
  43.         NULL);  
  44.     DWORD dwRtn;
  45.     //判断服务是否失败
  46.     if( hServiceDDK == NULL )  
  47.     {  
  48.         dwRtn = GetLastError();
  49.         if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_EXISTS )  
  50.         {  
  51.             //由于其他原因创建服务失败
  52.             printf( "CrateService() Faild %d ! /n", dwRtn );  
  53.             bRet = FALSE;
  54.             goto BeforeLeave;
  55.         }  
  56.         else  
  57.         {
  58.             //服务创建失败,是由于服务已经创立过
  59.             printf( "CrateService() Faild Service is ERROR_IO_PENDING or ERROR_SERVICE_EXISTS! /n" );  
  60.         }
  61.         // 驱动程序已经加载,只需要打开  
  62.         hServiceDDK = OpenService( hServiceMgr, lpszDriverName, SERVICE_ALL_ACCESS );  
  63.         if( hServiceDDK == NULL )  
  64.         {
  65.             //如果打开服务也失败,则意味错误
  66.             dwRtn = GetLastError();  
  67.             printf( "OpenService() Faild %d ! /n", dwRtn );  
  68.             bRet = FALSE;
  69.             goto BeforeLeave;
  70.         }  
  71.         else 
  72.         {
  73.             printf( "OpenService() ok ! /n" );
  74.         }
  75.     }  
  76.     else  
  77.     {
  78.         printf( "CrateService() ok ! /n" );
  79.     }
  80.     //开启此项服务
  81.     bRet= StartService( hServiceDDK, NULL, NULL );  
  82.     if( !bRet )  
  83.     {  
  84.         DWORD dwRtn = GetLastError();  
  85.         if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_ALREADY_RUNNING )  
  86.         {  
  87.             printf( "StartService() Faild %d ! /n", dwRtn );  
  88.             bRet = FALSE;
  89.             goto BeforeLeave;
  90.         }  
  91.         else  
  92.         {  
  93.             if( dwRtn == ERROR_IO_PENDING )  
  94.             {  
  95.                 //设备被挂住
  96.                 printf( "StartService() Faild ERROR_IO_PENDING ! /n");
  97.                 bRet = FALSE;
  98.                 goto BeforeLeave;
  99.             }  
  100.             else  
  101.             {  
  102.                 //服务已经开启
  103.                 printf( "StartService() Faild ERROR_SERVICE_ALREADY_RUNNING ! /n");
  104.                 bRet = TRUE;
  105.                 goto BeforeLeave;
  106.             }  
  107.         }  
  108.     }
  109.     bRet = TRUE;
  110. //离开前关闭句柄
  111. BeforeLeave:
  112.     if(hServiceDDK)
  113.     {
  114.         CloseServiceHandle(hServiceDDK);
  115.     }
  116.     if(hServiceMgr)
  117.     {
  118.         CloseServiceHandle(hServiceMgr);
  119.     }
  120.     return bRet;
  121. }
  122. //卸载驱动程序  
  123. BOOL UnloadNTDriver( char * szSvrName )  
  124. {
  125.     BOOL bRet = FALSE;
  126.     SC_HANDLE hServiceMgr=NULL;//SCM管理器的句柄
  127.     SC_HANDLE hServiceDDK=NULL;//NT驱动程序的服务句柄
  128.     SERVICE_STATUS SvrSta;
  129.     //打开SCM管理器
  130.     hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );  
  131.     if( hServiceMgr == NULL )  
  132.     {
  133.         //带开SCM管理器失败
  134.         printf( "OpenSCManager() Faild %d ! /n", GetLastError() );  
  135.         bRet = FALSE;
  136.         goto BeforeLeave;
  137.     }  
  138.     else  
  139.     {
  140.         //带开SCM管理器失败成功
  141.         printf( "OpenSCManager() ok ! /n" );  
  142.     }
  143.     //打开驱动所对应的服务
  144.     hServiceDDK = OpenService( hServiceMgr, szSvrName, SERVICE_ALL_ACCESS );  
  145.     if( hServiceDDK == NULL )  
  146.     {
  147.         //打开驱动所对应的服务失败
  148.         printf( "OpenService() Faild %d ! /n", GetLastError() );  
  149.         bRet = FALSE;
  150.         goto BeforeLeave;
  151.     }  
  152.     else  
  153.     {  
  154.         printf( "OpenService() ok ! /n" );  
  155.     }  
  156.     //停止驱动程序,如果停止失败,只有重新启动才能,再动态加载。  
  157.     if( !ControlService( hServiceDDK, SERVICE_CONTROL_STOP , &SvrSta ) )  
  158.     {  
  159.         printf( "ControlService() Faild %d !/n", GetLastError() );  
  160.     }  
  161.     else  
  162.     {
  163.         //打开驱动所对应的失败
  164.         printf( "ControlService() ok !/n" );  
  165.     }  
  166.     //动态卸载驱动程序。  
  167.     if( !DeleteService( hServiceDDK ) )  
  168.     {
  169.         //卸载失败
  170.         printf( "DeleteSrevice() Faild %d !/n", GetLastError() );  
  171.     }  
  172.     else  
  173.     {  
  174.         //卸载成功
  175.         printf( "DelServer:eleteSrevice() ok !/n" );  
  176.     }  
  177.     bRet = TRUE;
  178. BeforeLeave:
  179. //离开前关闭打开的句柄
  180.     if(hServiceDDK)
  181.     {
  182.         CloseServiceHandle(hServiceDDK);
  183.     }
  184.     if(hServiceMgr)
  185.     {
  186.         CloseServiceHandle(hServiceMgr);
  187.     }
  188.     return bRet;    
  189. void TestDriver()
  190. {
  191.     //测试驱动程序  
  192.     HANDLE hDevice = CreateFile("////.//HelloDDK",  
  193.         GENERIC_WRITE | GENERIC_READ,  
  194.         0,  
  195.         NULL,  
  196.         OPEN_EXISTING,  
  197.         0,  
  198.         NULL);  
  199.     if( hDevice != INVALID_HANDLE_VALUE )  
  200.     {
  201.         printf( "Create Device ok ! /n" );  
  202.     }
  203.     else  
  204.     {
  205.         printf( "Create Device faild %d ! /n", GetLastError() );  
  206.     }
  207.     CloseHandle( hDevice );
  208. int main(int argc, char* argv[])  
  209. {
  210.     //加载驱动
  211.     BOOL bRet = LoadNTDriver(DRIVER_NAME,DRIVER_PATH);
  212.     if (!bRet)
  213.     {
  214.         printf("LoadNTDriver error/n");
  215.         return 0;
  216.     }
  217.     //加载成功
  218.     printf( "press any to create device!/n" );  
  219.     getch();  
  220.     TestDriver();
  221.     //这时候你可以通过注册表,或其他查看符号连接的软件验证。  
  222.     printf( "press any to unload the driver!/n" );  
  223.     getch();  
  224.     //卸载驱动
  225.     UnloadNTDriver(DRIVER_NAME);
  226.     if (!bRet)
  227.     {
  228.         printf("UnloadNTDriver error/n");
  229.         return 0;
  230.     }
  231.     return 0;  
  232. }  

Linux设备驱动程序学习笔记02:编写编译并运行驱动程序

学习一个新东西最好的方式就是去实践它。在实践的过程中会不断遇到问题、产生疑问。解决这些问题的过程就是我们进步成长的过程。 一、如何写驱动程序 在学习C语言的时候有一个著名的hello world程...
  • CheerMoon2009
  • CheerMoon2009
  • 2014年07月19日 22:10
  • 1369

windows驱动学习笔记

零零散散花了一个月的时间初步学习了windows驱动编程,接着开始要制定2013年的学习计划,即将步入另外一个学习战场,于是就将最近学习记录下来,也好将来再返回学习时有点基础。 一、windows驱...
  • liumangxiong
  • liumangxiong
  • 2013年01月13日 21:44
  • 3290

Android驱动入门系列(一)

Android驱动入门系列(一)   —— Android驱动简介及编写第一个Android驱动   以下文章参考网上搜到的《Android驱动开发全过程(有图有真相)》一文,其中根据自己的实际编...
  • brantyou
  • brantyou
  • 2013年03月08日 17:07
  • 10804

简要分析Windows驱动加载

一般windows下驱动加载一是通过inf文件或者命令行sc命令动态加载驱动,二是通过系统启动的时候加载。那么windows内核是如何加载驱动呢? 我通过简要分析 ReactOS 系统源码可以看到加载...
  • faithzzf
  • faithzzf
  • 2016年05月12日 22:27
  • 1864

驱动开发(3)使用SCM加载NT驱动(用应用程序加载驱动)

在上一篇中,我简单介绍编写了一个NT驱动空壳,这一篇中,将介绍如何自己编写一个驱动程序加载器,即使用编程的方法加载驱动,而不是使用工具。 我在上一篇中也提到了,驱动程序是通过服务加载的,我以前写过SC...
  • zuishikonghuan
  • zuishikonghuan
  • 2015年10月02日 11:02
  • 1670

驱动第一天(韦东山视频) 学习笔记

本次笔记是学习韦东山老师视频所做 首先介绍下整体思路: 嵌入式开发中一般是先移植U-BOOT,U-BOOT的主要任务是启动内核,U-BOOT的额外主要功能是烧写内核,根文件系统,通过USB,...
  • u010060375
  • u010060375
  • 2015年05月06日 13:35
  • 570

另类阻止驱动加载

标 题: 【分享】【原创】另类阻止驱动加载 作 者: czcqq 时 间: 2010-05-04,22:27:47 链 接: http://bbs.pediy.com/showthread.ph...
  • kingswb
  • kingswb
  • 2016年05月15日 21:53
  • 1108

NDIS网络驱动程序学习

NDIS网络驱动程序学习(一)    关于网络编程,大家用的比较多的就是SOCKET。其中呢,SOCKET分TCP,UDP,原始套接字。 当然,TCP,UDP套接字是大家用的最多的,也是最常见...
  • wangjichang1
  • wangjichang1
  • 2014年09月09日 16:01
  • 731

摄像头驱动笔记3---从零写虚拟驱动(仿照vivi.c)

static struct v4l2_format myvivi_format; /* 队列操作1: 定义 */ static struct videobuf_queue myvivi_vb_vi...
  • qingkongyeyue
  • qingkongyeyue
  • 2016年08月31日 11:14
  • 999

应用层 加载驱动 和 卸载驱动代码

BOOL LoadDriver(char* lpszDriverName,char* lpszDriverPath) {     char szDriverImagePath[256] = {0}...
  • haolipengzhanshen
  • haolipengzhanshen
  • 2015年10月08日 18:34
  • 1219
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:驱动学习笔记二:加载驱动
举报原因:
原因补充:

(最多只允许输入30个字)