32位/64位WINDOWS驱动开发之卸载驱动和常见问题解决
前面加载驱动时遇见的问题
注意:我遇到的问题StartServiceW返回2,我加了调试信息,通常表示系统找不到指定的文件。请确认以下几点:
1.确保传递给LoadDriver函数的sysFileName参数是正确的文件名,包括文件名后缀和文件路径(如果不在当前工作目录)。
2.确保sysFileName指定的驱动文件已经被正确地编译、链接和生成.sys文件。
3.确保您的驱动文件已经被正确地安装到系统中。可以在服务管理器中查看该服务是否存在。
如果以上三点都被确认无误,但是StartServiceW仍然返回2,则可能是权限问题。请尝试使用管理员权限运行您的程序。
我这边加载驱动的代码改了一下名字 原来的名字 是LoadDriver(“D011_012_NAME”,“D011_012.sys”);
修改后是LoadDriver(“D011_012_NAMEA”,“D011_012.sys”);就解决了,我猜测是注册表里面有了这个名字没删除所以出现了这个错误,后面加了卸载驱动才没出现。
一、卸载驱动过程
卸载驱动过程
1、获取服务控制管理器句柄 SC_HANDLE
2、OpenService 打开加载中的服务获取服务句柄 SC_HANDLE
3、ControlService 停止服务
4、DeleteService
二、使用步骤
1.卸载驱动代码c++MFC
//卸载驱动 输入驱动名
BOOL UnLoadDriver(const char* lpszDriverName/*D011_012*/)
{
BOOL bRet = FALSE;
SC_HANDLE hServiceMgr = NULL; //SCM管理器的句柄
SC_HANDLE hServiceDDK = NULL; //驱动程序的句柄
SERVICE_STATUS SvrSta;
char buf[2048] = { 0 };
//1.打开SCM服务管理器
hServiceMgr = OpenSCManagerA(NULL, NULL, SC_MANAGER_ALL_ACCESS); //使用所有权限打开
if (hServiceMgr == NULL)
{
sprintf_s(buf, "yjx: 打开SCM ERROR %p GetLastError=%d \n", hServiceMgr, GetLastError());
OutputDebugStringA(buf);
bRet = FALSE;
goto BeforeLeave; //返回前 关闭句柄
}
else
{
sprintf_s(buf, "yjx: 打开SCM SUCCESS %p GetLastError=%d \n", hServiceMgr, GetLastError());
OutputDebugStringA(buf);
}
//2.打开驱动服务
hServiceDDK = OpenServiceA(hServiceMgr, lpszDriverName, SERVICE_ALL_ACCESS);
if (hServiceDDK == NULL)
{
sprintf_s(buf, "yjx: 打开驱动服务 ERROR GetLastError=%d \n", GetLastError());
OutputDebugStringA(buf);
bRet = FALSE;
goto BeforeLeave; //返回前 关闭句柄
}
else
{
sprintf_s(buf, "yjx: 打开驱动服务 SUCCESS GetLastError=%d \n", GetLastError());
OutputDebugStringA(buf);
}
//3.停止驱动程序
if (!ControlService(hServiceDDK, SERVICE_CONTROL_STOP, &SvrSta))
{
sprintf_s(buf, "yjx: 停止驱动 ERROR GetLastError=%d \n", GetLastError());
OutputDebugStringA(buf);
}
else
{
sprintf_s(buf, "yjx: 停止驱动 SUCCESS GetLastError=%d \n", GetLastError());
OutputDebugStringA(buf);
}
//4.卸载驱动
if (!DeleteService(hServiceDDK))
{
sprintf_s(buf, "yjx: 卸载驱动 ERROR GetLastError=%d \n", GetLastError());
OutputDebugStringA(buf);
}
else
{
sprintf_s(buf, "yjx: 卸载驱动 SUCCESS GetLastError=%d \n", GetLastError());
OutputDebugStringA(buf);
}
bRet = TRUE;
BeforeLeave:
//5.关闭句柄
if (hServiceDDK)
{
CloseServiceHandle(hServiceDDK);
}
if (hServiceMgr)
{
CloseServiceHandle(hServiceMgr);
}
return bRet;
}
2.双击卸载驱动按钮
代码如下(示例):
#define 驱动名 "D011_012_NAMEA"
void CD001112MFCDlg::OnBnClickedButton1UnloadSys()
{
// TODO: 在此添加控件通知处理程序代码
UnLoadDriver(驱动名);
}
3.加载卸载驱动.h代码如下:
代码如下(示例):
#pragma once
BOOL LoadDriver(const char* lpszDriverName/*D011_012*/, const char* sysFileName/*驱动文件名 如123.sys*/);
BOOL UnLoadDriver(const char* lpszDriverName/*D011_012*/);
虚拟机调试结果如下:
提示:这里对文章进行总结: