互联网上有很多关于此事的内容,但没有一个是特定于我的。我使用以下代码从文件加载设备驱动程序:
hService = OpenService (hManager, TC_DRIVER_NAME, SERVICE_ALL_ACCESS);
if (hService != NULL)
{
// Now stop it
SERVICE_STATUS status;
if (::ControlService(hService, SERVICE_CONTROL_STOP, &status))
{
int nLoop = 0;
while (::QueryServiceStatus(hService, &status) && nLoop < 3)
{
if (status.dwCurrentState == SERVICE_STOP_PENDING)
{
Sleep(500);
nLoop++;
continue;
}
if (status.dwCurrentState == SERVICE_STOPPED)
break;
}
}
// Remove stale service (driver is not loaded but service exists)
DeleteService (hService);
int n = GetLastError();
CloseServiceHandle (hService);
Sleep(500);
}
hService = CreateService(....
我的问题是,如果我的应用程序崩溃 - 或者在Visual Studio中我停止调试而没有正确退出应用程序 - 那么DeleteService和CreateService将始终失败,错误为1072(ERROR_SERVICE_MARKED_FOR_DELETE)。我已经尝试了很多东西,比如更改currentControlSet中的注册表值,甚至删除所有注册表值,但只有重启才能使我能够正常进行。我猜有些句柄可能没有正确关闭,但有没有办法强制设备驱动程序正确删除而不重启?
作为预防措施,我已经添加了一个带有SetUnhandledExceptionFilter的异常处理程序来卸载驱动程序,这有点帮助,但如果我终止进程,它就不会被调用,当然,只有重启才能让我重新加载驱动程序。
由于