首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(C/Windows)无法卸载驱动程序

(C/Windows)无法卸载驱动程序
EN

Stack Overflow用户
提问于 2017-05-03 18:16:18
回答 1查看 413关注 0票数 1

我的操作系统是Windows 7 64位。我正在用DSEfix加载一个驱动程序(绕过Windows中的驱动程序签名强制执行),它工作得很好。IOCTL请求以它们应该执行的方式执行,但是每当我试图卸载驱动程序时,它就会失败:带有无效句柄的错误代码的ControlService(hService, SERVICE_CONTROL_STOP, &ss

这是我的司机入口:

代码语言:javascript
复制
NTSTATUS DriverEntry(PDRIVER_OBJECT Object, PUNICODE_STRING RegistryPath) {

UNICODE_STRING dNUS = { 0 };
RtlInitUnicodeString(&dNUS, L"\\Device\\testdriver");

UNICODE_STRING dSLU = { 0 };
RtlInitUnicodeString(&dSLU, L"\\DosDevices\\testdriver");

IoCreateDevice(Object, 0, &dNUS, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &deviceObj);
IoCreateSymbolicLink(&dSLU, &dNUS);

Object->MajorFunction[IRP_MJ_CREATE] = CCreate;
Object->MajorFunction[IRP_MJ_CLOSE] = CClose;
Object->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IOCTL;
Object->DriverUnload = Unload;

return(STATUS_SUCCESS);

以及卸载功能:

代码语言:javascript
复制
NTSTATUS Unload(PDRIVER_OBJECT Object) {
UNICODE_STRING symLink;
RtlInitUnicodeString(&symLink, L"\\DosDevices\\testdriver");

if (Object->DeviceObject != NULL)
{
    IoDeleteSymbolicLink(&symLink);
    IoDeleteDevice(Object->DeviceObject);
}

在用户模式方面,我在加载驱动程序时从OpenSCManagerA(NULL, NULL, SC_MANAGER_CREATE_SERVICE)获得OpenSCManagerA(NULL, NULL, SC_MANAGER_CREATE_SERVICE),从CreateServiceA加载hService。两者都是有效的,并工作加载驱动程序很好。

下面是我在here模式下的卸载驱动程序功能:

代码语言:javascript
复制
bool UnloadDriver()
{
if (!hSCManager) return false;
if (!hService) return false;

cout << "STOPPING DRIVER" << endl;

SERVICE_STATUS ss;
if (ControlService(hService, SERVICE_CONTROL_STOP, &ss))
{
    if (ss.dwCurrentState == SERVICE_STOPPED)
    {
        DeleteService(hService);
        CloseServiceHandle(hSCManager);
        CloseServiceHandle(hService);
        cout << "DRIVER UNLOADED" << endl;
        return true;
    }
    else
    {
        cout << "SERVICE NOT STOPPED IN TIME" << endl;
        CloseServiceHandle(hSCManager);
        CloseServiceHandle(hService);
        return false;
    }
}
else
{
    cout << "SERVICE_CONTROL_STOP FAILED" << endl;
    CloseServiceHandle(hSCManager);
    CloseServiceHandle(hService);
    return false;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-05 15:23:33

好吧,正如RbMm提到的,我忽略了注册表密钥的删除.但是在我移动了代码之后,我仍然无法卸载我的驱动程序。

因此,我发现由SC_HANDLE获得的CreateService是无效的。尽管它在MSDN上说这个句柄可以从CreateService中使用,但它对我不起作用(可能是DSE)。相反,您应该创建一个新的SCManager和一个新的SCService,您应该做得很好。现在,ControlService为我返回true :)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43767323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档