用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. 虚函数列表: 取出方法 // 虚函数工作原理和(虚)继承类的内存占用大小计算 32位机器上 sizeof(void *) // 4byte

    #include <iostream> using namespace std; class A { public: A(){} virtual void geta(){ cout < ...

  2. ios 后台播放音乐1条注意事项

    除了设置程序的后台模式,还需要几行代码 AVAudioSession *session = [AVAudioSession sharedInstance]; [session setCategory: ...

  3. uniq 重复行统计

    uniq 命令   文字 uniq 是LINUX命令 用途 报告或删除文件中重复的行. 语法 uniq [ -c | -d | -u ] [ -f Fields ] [ -s Characters ] ...

  4. delphi的取整函数round、trunc、ceil和floor

    delphi的取整函数round.trunc.ceil和floor 首先引入math单元 uses math; 1.Round(四舍六入五留双) 功能说明:对一个实数进行四舍五入.(按照银行家算法) ...

  5. percona-toolkit 之 【pt-slave-delay】说明

    摘要: 在主从复制的架构中,正常情况下主上操作的记录也会在从上进行操作,虽说是异步复制,但操作会“实时”的同步到从.比如在主上不小心误操作了,还没等反应过来从上也会马上执行误操作,后期只有通过二进制或 ...

  6. 20151130test->20160530

    过了6个月了,有些长进么?哈 go go go 开源镜像 http://mirrors.163.com/

  7. 【2016-08-21】Linux内核版本编号规则简介

    我们已经了解可以使用下面的几天命令来查看Linux内核版本及Ubuntu发行版本的信息: uname -r uname -a cat /proc/version lsb-release -a 等等 可 ...

  8. 数对的个数(cogs610)

    Description出题是一件痛苦的事情!题目看多了也有审美疲劳,于是我舍弃了大家所熟悉的A+B Problem,改用A-B了哈哈! 好吧,题目是这样的:给出一串数以及一个数字C,要求计算出所有A- ...

  9. db2 bind on luw

    https://www.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.apdv.embed.doc/doc/c000556 ...

  10. jQuery和JS原生方法对比