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三种类型对象的操作,实际使用中尽量保证成对使用. 这一块的操作比较繁琐,但只要使用正确, ...
随机推荐
- Linux下Apache配置SSL支持https
参考:http://www.thinksaas.cn/group/topic/280017/ 生成证书过程如下 Step :生成服务器密钥: mkdir -p /etc/pki/test cd /et ...
- 【转】.so兼容32位和64位
本文转自:http://blog.csdn.net/fwt336/article/details/51700300 安卓的兼容性是一个很令人头疼的问题,这几天又遇到了,还好还是解决了. 我遇到的问题是 ...
- ios UIWindow 错误使用导致无法接收motionEnded(摇一摇)函数
今天遇到一个问题,第一次运行程序时,- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event函数无法调用,第二次就好了 ...
- 16~25.spring+hibernate简单实例 .连接数据库并进行增删改查
1.概念 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQ ...
- ajax加载表格数据
一.html代码 <style type="text/css"> .table-taskinfo table tr { border-top: 2px solid #9 ...
- CSS颜色代码 颜色值 颜色名字大全(转载)
CSS颜色代码 颜色值 颜色名字大全 转载处http://flyjj.com/css-colour-code.html 颜色值 CSS 颜色使用组合了红绿蓝颜色值 (RGB) 的十六进制 (hex) ...
- Linux解决关闭终端后终止服务问题
可使用nohup. 具体使用方法,参见:http://zjking.blog.51cto.com/976858/1117828
- Mysql之performance Schema
Performance schema是用于监控Mysql执行,具有如下特征: 1.用于在运行时探查Mysql Server的执行过程,是由Performance_schema引擎和 Performan ...
- Codeforces Round #304 C(Div. 2)(模拟)
题目链接: http://codeforces.com/problemset/problem/546/C 题意: 总共有n张牌,1手中有k1张分别为:x1, x2, x3, ..xk1,2手中有k2张 ...
- CLR via C#(16)--泛型
泛型就像是一个模板,常常定义一些通用的算法,具体调用时再替换成实际的数据类型,提高了代码的可重用性. 一.初识泛型 1. 简单实例 以最常用的FCL中的泛型List<T >为例: stat ...