用vc++加载自己的驱动程序主要分为以下几个步骤:

1、加载驱动服务

主要要用到以下几个函数

  1. SC_HANDLE
  2. WINAPI
  3. OpenSCManagerA(
  4. __in_opt        LPCSTR                lpMachineName,
  5. __in_opt        LPCSTR                lpDatabaseName,
  6. __in            DWORD                   dwDesiredAccess
  7. );
  8. //创建驱动服务
  9. SC_HANDLE
  10. WINAPI
  11. CreateServiceA(
  12. __in        SC_HANDLE    hSCManager,
  13. __in        LPCSTR     lpServiceName,
  14. __in_opt    LPCSTR     lpDisplayName,
  15. __in        DWORD        dwDesiredAccess,
  16. __in        DWORD        dwServiceType,
  17. __in        DWORD        dwStartType,
  18. __in        DWORD        dwErrorControl,
  19. __in_opt    LPCSTR     lpBinaryPathName,
  20. __in_opt    LPCSTR     lpLoadOrderGroup,
  21. __out_opt   LPDWORD      lpdwTagId,
  22. __in_opt    LPCSTR     lpDependencies,
  23. __in_opt    LPCSTR     lpServiceStartName,
  24. __in_opt    LPCSTR     lpPassword
  25. );
  26. //打开驱动服务
  27. SC_HANDLE
  28. WINAPI
  29. OpenServiceA(
  30. __in            SC_HANDLE               hSCManager,
  31. __in            LPCSTR                lpServiceName,
  32. __in            DWORD                   dwDesiredAccess
  33. );
  34. //启动驱动服务
  35. BOOL
  36. WINAPI
  37. StartServiceA(
  38. __in            SC_HANDLE            hService,
  39. __in            DWORD                dwNumServiceArgs,
  40. __in_ecount_opt(dwNumServiceArgs)
  41. LPCSTR             *lpServiceArgVectors
  42. );

首先调用OpenSCManager函数 建立一个连接到服务控制管理器,然后再调用CreateService创建服务最后调用OpenService和StartService分别打开服务和启动服务。

当服务启动后就可以用CreateFile函数访问驱动程序了代码如下:

1.启动驱动服务程序
  1. //启动驱动服务
  2. void  LoadDriver()
  3. {
  4. SC_HANDLE    hSCManager = NULL;
  5. SC_HANDLE    hService = NULL;
  6. SC_HANDLE    hService1 = NULL;
  7. hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
  8. hService = CreateService(hSCManager,
  9. MYWINRIN0,   //这是驱动服务名称 这里为"MyWinRing0" 可以自定义任意名称
  10. MYWINRIN0,   //这是驱动服务显示名称,可以自定义任意名称,这里我选择和上面一样
  11. SERVICE_ALL_ACCESS,
  12. SERVICE_KERNEL_DRIVER,
  13. SERVICE_DEMAND_START,
  14. SERVICE_ERROR_NORMAL,
  15. gDriverPath, //驱动存放的路径,这里和应用程序同目录
  16. NULL,
  17. NULL,
  18. NULL,
  19. NULL,
  20. NULL
  21. );
  22. CloseServiceHandle(hService); //上面创建成功后就关闭掉这个句柄
  23. hService1 = OpenService(hSCManager, MYWINRIN0, SERVICE_ALL_ACCESS); //打开上面创建的服务,名字为"MyWinRing0"
  24. , NULL); //启动服务
  25. CloseServiceHandle(hSCManager);
  26. CloseServiceHandle(hService1);
  27. }

2.打开驱动服务

  1. //驱动服务启动后,打开驱动
  2. BOOL OpenDriver()
  3. {
  4. ];
  5. gHandle = CreateFile(
  6. _T("\\\\.\\") OLS_DRIVER_ID, //这个地方的名字必须是驱动程序里面IoCreateDevice函数创建设备是 使用的名字
  7. GENERIC_READ | GENERIC_WRITE,
  8. 0,
  9. NULL,
  10. OPEN_EXISTING,
  11. FILE_ATTRIBUTE_NORMAL,
  12. NULL
  13. );
  14. int  code=GetLastError();
  15. if (gHandle == INVALID_HANDLE_VALUE)
  16. {
  17. return  FALSE;
  18. }
  19. return  TRUE;
  20. }

3.停止驱动

  1. //停止驱动
  2. BOOL  StopDriver(SC_HANDLE hSCManager,LPCTSTR DriverId)
  3. {
  4. SC_HANDLE        hService = NULL;
  5. BOOL            rCode = FALSE;
  6. SERVICE_STATUS    serviceStatus;
  7. DWORD        error = NO_ERROR;
  8. hService = OpenService(hSCManager, DriverId, SERVICE_ALL_ACCESS);
  9. if (hService != NULL)
  10. {
  11. rCode = ControlService(hService, SERVICE_CONTROL_STOP, &serviceStatus);
  12. error = GetLastError();
  13. CloseServiceHandle(hService);
  14. }
  15. return  rCode;
  16. }

4.卸载驱动

  1. //卸载驱动
  2. BOOL RemoveDriver(SC_HANDLE hSCManager, LPCTSTR DriverId)
  3. {
  4. SC_HANDLE   hService = NULL;
  5. BOOL        rCode = FALSE;
  6. hService = OpenService(hSCManager, DriverId, SERVICE_ALL_ACCESS);
  7. if (hService == NULL)
  8. {
  9. rCode = TRUE;
  10. }
  11. else
  12. {
  13. rCode = DeleteService(hService);
  14. CloseServiceHandle(hService);
  15. }
  16. return  rCode;
  17. }
  18. rar 改 jpg

vc++ 加载,卸载自己的驱动程序的更多相关文章

  1. Linux设备驱动程序加载/卸载方法 insmod和modprobe命令

    linux加载/卸载驱动有两种方法. 1.modprobe 注:在使用这个命令加载模块前先使用depmod -a命令生成modules.dep文件,该文件位于/lib/modules/$(uname ...

  2. c#动态加载卸载DLL的方法

    这篇文章介绍了c#动态加载卸载DLL的方法,有需要的朋友可以参考一下 c#中通过反射可以方便的动态加载dll程序集,但是如果你需要对dll进行更新,却发现.net类库没有提供卸载dll程序集的方法.在 ...

  3. [转][osg]关于PagedLOD 加载卸载机制

    你的PagedLOD 为什么没有卸载 转自:http://bbs.osgchina.org/forum.php?mod=viewthread&tid=7612&highlight=Pa ...

  4. 2018-2-13-C#-动态加载卸载-DLL

    title author date CreateTime categories C# 动态加载卸载 DLL lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17:2 ...

  5. CE驱动动态加载卸载

    加载: #define DEV_KEY TEXT("Drivers\\Builtin\\WCDMA") BOOL CGPRSCTRLDlg::Load() { //DWORD dw ...

  6. IDA 与VC 加载符号表

    将Windbg路径下的symsrv.yes 拷贝到ida 的安装目录,重新分析ntoskrnl.exe, 加载本地的符号表 添加环境变量  变量名:_NT_SYMBOL_PATH变量值:SRV*{$P ...

  7. C# 动态加载卸载 DLL

    我最近做的软件,需要检测dll或exe是否混淆,需要反射获得类名,这时发现,C#可以加载DLL,但不能卸载DLL.于是在网上找到一个方法,可以动态加载DLL,不使用时可以卸载. 我在写一个WPF 程序 ...

  8. c#动态加载卸载DLL

    前段时间工作的时候遇到一个问题.就是需要每次启动程序的时候动态替换掉某个dll,所以就百度了这方面的资料.这次记录下来让自己以后可以看. 根据自己的理解,动态卸载dll需要有以下条件: 1:dll在加 ...

  9. Unity5 AssetBundle系列——资源加载卸载以及AssetBundleManifest的使用

    下面代码列出了对于assetbundle资源的常用操作,其中有针对bundle.asset.gameobject三种类型对象的操作,实际使用中尽量保证成对使用. 这一块的操作比较繁琐,但只要使用正确, ...

随机推荐

  1. Google Code Jam 2015 R1C B

    题意:给出一个键盘,按键都是大写字母.给出一个目标单词和一个长度L.最大值或者最大长度都是100.现在随机按键盘,每个按键的概率相同. 敲击出一个长度为L的序列.求该序列中目标单词最多可能出现几次,期 ...

  2. 一个不错的定位API网站

    2015年5月2日 15:36:31 星期六 http://www.haoservice.com/

  3. java一维数组

    1.通过数组名进行赋值,其实质是引用 比如数组array1和数组array2 若执行array2=array1,实际上将array1的引用传递给array2,array1和array2 最后都指向同一 ...

  4. Maven 3.3.3 Win10环境下的使用实例(中)

    继上一篇文章介绍了Maven在Windows中的安装,本文将介绍 Maven 的核心概念. POM (Project Object Model) Maven 插件 Maven 生命周期 Maven 依 ...

  5. 【关于服务器端SQL Server 2008的设置】 使其他客户端机可通过ODBC数据源可访问

    服务器系统:Server 2003 数据库:SQL Server 2005 服务器配置:开启服务:server.workstation(这两个服务对于提供局域网共享有很大作用) 关闭防火墙 开启gue ...

  6. Effective C++ -----条款45:运用成员函数模板接受所有兼容类型

    请使用member function templates(成员函数模板)生成”可接受所有兼容类型“的函数. 如果你声明member templates 用于“泛化copy构造”或“泛化assignme ...

  7. Divide and conquer:Drying(POJ 3104)

    烘干衣服 题目大意:主人公有一个烘干机,但是一次只能烘干一件衣服,每分钟失水k个单位的水量,自然烘干每分钟失水1个单位的水量(在烘干机不算自然烘干的那一个单位的水量),问你最少需要多长时间烘干衣服? ...

  8. September 30th 2016 Week 40th Friday

    Elegance is the only beauty that never fades. 优雅是唯一不会褪色的美. Even the most beautiful apperance may los ...

  9. September 10th 2016 Week 37th Saturday

    An innovation that goes beyond imagination again raised the standard. 颠覆想象的创新,再一次刷新标准. An advertisem ...

  10. 你知道吗?Web的26项基本概念和技术

    这是我在网上看到一篇不错的文章,拿出来与大家分享一下:希望有所帮助 作者: 小鱼  来源: 前端里  发布时间: 2014-08-01 22:56  阅读: 10477 次  推荐: 51   原文链 ...