2017-05-03 124 views
1

我的OP是Windows 7 64位。我正在用DSEfix加载一个驱动程序(从Windows旁边的驱动程序签名实施),并且工作得很好。 IOCTL请求按照他们应该的方式执行,但每当我尝试卸载我的驱动程序时,都会失败:ControlService(hService, SERVICE_CONTROL_STOP, &ss,错误代码为无效句柄。(C/Windows)无法卸载驱动程序

这里是我的驱动程序入口:

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); 

和卸载功能:

NTSTATUS Unload(PDRIVER_OBJECT Object) { 
UNICODE_STRING symLink; 
RtlInitUnicodeString(&symLink, L"\\DosDevices\\testdriver"); 

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

对事物的用户模式一侧从CreateServiceA加载驱动程序和hService当我从OpenSCManagerA(NULL, NULL, SC_MANAGER_CREATE_SERVICE)得到hSCManager。两者都是有效的,并且可以很好地加载驱动程序。

这里是在用户模式我卸载驱动程序功能:

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; 
} 
+0

* ControlService *失败,错误代码为无效句柄 - 因此'指定的句柄不是使用CreateService或OpenService获得的,或者句柄不再有效。“ - 什么在这里不清楚?你使用* hService *作为全局变量,这个代码已经非常丑陋而且不专业。你如何获得这个句柄,它不会被修改或关闭 - 不可见 - 你不会粘贴相关的代码 – RbMm

+0

@RbMm正如我写的,我得到了CreateServiceA的句柄。它适用于驱动程序加载和IOCTL。对于卸载,但它变得无效?我可以尝试使用OpenService再次获得它,但我不明白为什么句柄会有所不同。 –

+0

但错误代码说自己。从另一方面你可以直接调用[ZwUnloadDriver](https://msdn.microsoft.com/en-us/library/windows/hardware/ff567117(v = vs.85).aspx) - 哪个* NTSTATUS *它返回并什么结果?以及为什么你的* hService *是全局变量?!? – RbMm

回答

0

好吧,作为RbMm提到的,我忽略了清除注册表项的......好了,但之后我感动的是代码,我仍然无法卸载我的驱动程序。

所以我想通过CreateService获得的SC_HANDLE是无效的。尽管它在MSDN上表示可以从CreateService使用该句柄,但它对我无效(可能是DSE)。你应该改为创建一个新的SCManager和一个新的SCService,你应该很好。现在ControlService对我来说是正确的:)