vc++ 加载,卸载自己的驱动程序
用vc++加载自己的驱动程序主要分为以下几个步骤:
1、加载驱动服务
主要要用到以下几个函数
- SC_HANDLE
- WINAPI
- OpenSCManagerA(
- __in_opt LPCSTR lpMachineName,
- __in_opt LPCSTR lpDatabaseName,
- __in DWORD dwDesiredAccess
- );
- //创建驱动服务
- SC_HANDLE
- WINAPI
- CreateServiceA(
- __in SC_HANDLE hSCManager,
- __in LPCSTR lpServiceName,
- __in_opt LPCSTR lpDisplayName,
- __in DWORD dwDesiredAccess,
- __in DWORD dwServiceType,
- __in DWORD dwStartType,
- __in DWORD dwErrorControl,
- __in_opt LPCSTR lpBinaryPathName,
- __in_opt LPCSTR lpLoadOrderGroup,
- __out_opt LPDWORD lpdwTagId,
- __in_opt LPCSTR lpDependencies,
- __in_opt LPCSTR lpServiceStartName,
- __in_opt LPCSTR lpPassword
- );
- //打开驱动服务
- SC_HANDLE
- WINAPI
- OpenServiceA(
- __in SC_HANDLE hSCManager,
- __in LPCSTR lpServiceName,
- __in DWORD dwDesiredAccess
- );
- //启动驱动服务
- BOOL
- WINAPI
- StartServiceA(
- __in SC_HANDLE hService,
- __in DWORD dwNumServiceArgs,
- __in_ecount_opt(dwNumServiceArgs)
- LPCSTR *lpServiceArgVectors
- );
首先调用OpenSCManager函数 建立一个连接到服务控制管理器,然后再调用CreateService创建服务最后调用OpenService和StartService分别打开服务和启动服务。
当服务启动后就可以用CreateFile函数访问驱动程序了代码如下:
- //启动驱动服务
- void LoadDriver()
- {
- SC_HANDLE hSCManager = NULL;
- SC_HANDLE hService = NULL;
- SC_HANDLE hService1 = NULL;
- hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
- hService = CreateService(hSCManager,
- MYWINRIN0, //这是驱动服务名称 这里为"MyWinRing0" 可以自定义任意名称
- MYWINRIN0, //这是驱动服务显示名称,可以自定义任意名称,这里我选择和上面一样
- SERVICE_ALL_ACCESS,
- SERVICE_KERNEL_DRIVER,
- SERVICE_DEMAND_START,
- SERVICE_ERROR_NORMAL,
- gDriverPath, //驱动存放的路径,这里和应用程序同目录
- NULL,
- NULL,
- NULL,
- NULL,
- NULL
- );
- CloseServiceHandle(hService); //上面创建成功后就关闭掉这个句柄
- hService1 = OpenService(hSCManager, MYWINRIN0, SERVICE_ALL_ACCESS); //打开上面创建的服务,名字为"MyWinRing0"
- , NULL); //启动服务
- CloseServiceHandle(hSCManager);
- CloseServiceHandle(hService1);
- }
2.打开驱动服务
- //驱动服务启动后,打开驱动
- BOOL OpenDriver()
- {
- ];
- gHandle = CreateFile(
- _T("\\\\.\\") OLS_DRIVER_ID, //这个地方的名字必须是驱动程序里面IoCreateDevice函数创建设备是 使用的名字
- GENERIC_READ | GENERIC_WRITE,
- 0,
- NULL,
- OPEN_EXISTING,
- FILE_ATTRIBUTE_NORMAL,
- NULL
- );
- int code=GetLastError();
- if (gHandle == INVALID_HANDLE_VALUE)
- {
- return FALSE;
- }
- return TRUE;
- }
3.停止驱动
- //停止驱动
- BOOL StopDriver(SC_HANDLE hSCManager,LPCTSTR DriverId)
- {
- SC_HANDLE hService = NULL;
- BOOL rCode = FALSE;
- SERVICE_STATUS serviceStatus;
- DWORD error = NO_ERROR;
- hService = OpenService(hSCManager, DriverId, SERVICE_ALL_ACCESS);
- if (hService != NULL)
- {
- rCode = ControlService(hService, SERVICE_CONTROL_STOP, &serviceStatus);
- error = GetLastError();
- CloseServiceHandle(hService);
- }
- return rCode;
- }
4.卸载驱动
- //卸载驱动
- BOOL RemoveDriver(SC_HANDLE hSCManager, LPCTSTR DriverId)
- {
- SC_HANDLE hService = NULL;
- BOOL rCode = FALSE;
- hService = OpenService(hSCManager, DriverId, SERVICE_ALL_ACCESS);
- if (hService == NULL)
- {
- rCode = TRUE;
- }
- else
- {
- rCode = DeleteService(hService);
- CloseServiceHandle(hService);
- }
- return rCode;
- }
rar 改 jpg
vc++ 加载,卸载自己的驱动程序的更多相关文章
- Linux设备驱动程序加载/卸载方法 insmod和modprobe命令
linux加载/卸载驱动有两种方法. 1.modprobe 注:在使用这个命令加载模块前先使用depmod -a命令生成modules.dep文件,该文件位于/lib/modules/$(uname ...
- c#动态加载卸载DLL的方法
这篇文章介绍了c#动态加载卸载DLL的方法,有需要的朋友可以参考一下 c#中通过反射可以方便的动态加载dll程序集,但是如果你需要对dll进行更新,却发现.net类库没有提供卸载dll程序集的方法.在 ...
- [转][osg]关于PagedLOD 加载卸载机制
你的PagedLOD 为什么没有卸载 转自:http://bbs.osgchina.org/forum.php?mod=viewthread&tid=7612&highlight=Pa ...
- 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 ...
- CE驱动动态加载卸载
加载: #define DEV_KEY TEXT("Drivers\\Builtin\\WCDMA") BOOL CGPRSCTRLDlg::Load() { //DWORD dw ...
- IDA 与VC 加载符号表
将Windbg路径下的symsrv.yes 拷贝到ida 的安装目录,重新分析ntoskrnl.exe, 加载本地的符号表 添加环境变量 变量名:_NT_SYMBOL_PATH变量值:SRV*{$P ...
- C# 动态加载卸载 DLL
我最近做的软件,需要检测dll或exe是否混淆,需要反射获得类名,这时发现,C#可以加载DLL,但不能卸载DLL.于是在网上找到一个方法,可以动态加载DLL,不使用时可以卸载. 我在写一个WPF 程序 ...
- c#动态加载卸载DLL
前段时间工作的时候遇到一个问题.就是需要每次启动程序的时候动态替换掉某个dll,所以就百度了这方面的资料.这次记录下来让自己以后可以看. 根据自己的理解,动态卸载dll需要有以下条件: 1:dll在加 ...
- Unity5 AssetBundle系列——资源加载卸载以及AssetBundleManifest的使用
下面代码列出了对于assetbundle资源的常用操作,其中有针对bundle.asset.gameobject三种类型对象的操作,实际使用中尽量保证成对使用. 这一块的操作比较繁琐,但只要使用正确, ...
随机推荐
- 为什么学习c++?该怎么学?
本人最近刚开始学习C++,准备记录下学习C++的历程.以下都是记录欢迎指教. 第一堂课,我们的老师告诉我们为什么学习C++,学习C++有啥用?这我也想了.但是我不了解C++,所以肯定是想不了多少的. ...
- VMware Workstation 下进行 桥连接
大家都知道进行桥连接的时候,需要我们的宿主机与虚拟机同处于一个网络段, 使得mask与默认网关相同即可进行连接 ; 本地的IP .掩码 . 网关: 虚拟机的Ip 掩码,网关: // 当然这里的DNS ...
- volley post非json格式数据并获取json数据
在使用JsonObjectRequest时无法post非json格式的数据,因而采用StringRequest获取到相应的数据后再转为json格式的数据. //这里的上下文需要讨论 private s ...
- lftp使用普通ftp模式登录
set ftp:use-feat no set ftp:passive-mode yes set ftp:ssl-protect-data no set ssl:verify-certificate ...
- ACM/ICPC 之 优先级队列+设置IO缓存区(TSH OJ-Schedule(任务调度))
一个裸的优先级队列(最大堆)题,但也有其他普通队列的做法.这道题我做了两天,结果发现是输入输出太过频繁,一直只能A掉55%的数据,其他都是TLE,如果将输入输出的数据放入缓存区,然后满区输出,可以将I ...
- java基础学习04(数组与方法)
数组与方法 一.完成的目标 1. 掌握数组的定义.使用方法.引用传递 2. 掌握方法及其方法的重载 3. 使用方法接收和返回一个数组 4. java新特性对数组的操作支持 二.数组的定义和使用 数组是 ...
- Android 开发技巧 - Android 6.0 以上权限大坑和权限检查基类封装
简单介绍 关于运行时权限的说法,早在Google发布android 6.0的时候,大家也听得蛮多的.从用户的角度来讲,用户是受益方,更好的保护用户的意思,而对于开发者来说,无疑增加了工作量. 对于6. ...
- POJ 1830 开关问题 (高斯消元)
题目链接 题意:中文题,和上篇博客POJ 1222是一类题. 题解:如果有解,解的个数便是2^(自由变元个数),因为每个变元都有两种选择. 代码: #include <iostream> ...
- 【2016-08-18】转载:总结C++中几种结构体初始化的方法
作者:Ac_Von 博客地址:http://www.cnblogs.com/vongang/ 文章地址:http://www.cnblogs.com/vongang/archive/2011/07/3 ...
- C# 类中索引器的使用二
索引器(Indexer)是C#引入的一个新型的类成员,它使得类中的对象可以像数组那样方便.直观的被引用.索引器非常类似于属性,但索引器可以有参数列表,且只能作用在实例对象上,而不能在类上直接作用.定义 ...