一、卸载驱动源代码
BOOL UnloadDriver(const char* 驱动名称)
{
BOOL 返回值 = FALSE;
SC_HANDLE 管理器句柄 = NULL;
SC_HANDLE 驱动服务句柄 = NULL;
SERVICE_STATUS 服务状态;
char 缓存[256] = { 0 };
管理器句柄 = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (管理器句柄 == NULL)
{
sprintf_s(缓存, "nxyn:管理器句柄获取失败:%d\n",GetLastError());
OutputDebugStringA(缓存);
返回值 = FALSE;
goto BeforeLeave;
}
else
{
sprintf_s(缓存, "nxyn:管理器句柄获取成功\n");
OutputDebugStringA(缓存);
}
驱动服务句柄 = OpenServiceA(管理器句柄, 驱动名称, SERVICE_ALL_ACCESS);
if (驱动服务句柄 == NULL)
{
sprintf_s(缓存, "nxyn:驱动服务句柄获取失败:%d\n", GetLastError());
OutputDebugStringA(缓存);
返回值 = FALSE;
goto BeforeLeave;
}
else
{
sprintf_s(缓存, "nxyn:驱动服务句柄获取成功\n");
OutputDebugStringA(缓存);
}
//停止驱动程序,如果停止失败,只有重新启动才能,再动态加载。
if (!ControlService(驱动服务句柄, SERVICE_CONTROL_STOP, &服务状态))
{
sprintf_s(缓存, "nxyn:停止驱动程序失败:%d\n", GetLastError());
OutputDebugStringA(缓存);
}
else
{
sprintf_s(缓存, "nxyn:停止驱动程序成功\n");
OutputDebugStringA(缓存);
}
//动态卸载驱动程序,删除服务
if (!DeleteService(驱动服务句柄))
{
//卸载失败
sprintf_s(缓存, "nxyn:动态卸载驱动程序失败:%d\n", GetLastError());
OutputDebugStringA(缓存);
}
else
{
//卸载成功
sprintf_s(缓存, "nxyn:动态卸载驱动程序成功\n");
OutputDebugStringA(缓存);
}
返回值 = TRUE;
BeforeLeave:
//离开前关闭打开的句柄
if (驱动服务句柄)
{
CloseServiceHandle(驱动服务句柄);
}
if (管理器句柄)
{
CloseServiceHandle(管理器句柄);
}
return 返回值;
}
二、添加头文件,申明函数
#pragma once
BOOL LoadDriver(const char* 驱动名称, const char* 驱动路径);
BOOL UnloadDriver(const char* 驱动名称);
三、通过卸载按钮,实现卸载驱动
UnloadDriver("123");
四、卸载效果