我的操作系统是Windows 7 64位。我正在用DSEfix加载一个驱动程序(绕过Windows中的驱动程序签名强制执行),它工作得很好。IOCTL请求以它们应该执行的方式执行,但是每当我试图卸载驱动程序时,它就会失败:带有无效句柄的错误代码的ControlService(hService, SERVICE_CONTROL_STOP, &ss。
这是我的司机入口:
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);
}在用户模式方面,我在加载驱动程序时从OpenSCManagerA(NULL, NULL, SC_MANAGER_CREATE_SERVICE)获得OpenSCManagerA(NULL, NULL, SC_MANAGER_CREATE_SERVICE),从CreateServiceA加载hService。两者都是有效的,并工作加载驱动程序很好。
下面是我在here模式下的卸载驱动程序功能:
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;
}发布于 2017-05-05 15:23:33
好吧,正如RbMm提到的,我忽略了注册表密钥的删除.但是在我移动了代码之后,我仍然无法卸载我的驱动程序。
因此,我发现由SC_HANDLE获得的CreateService是无效的。尽管它在MSDN上说这个句柄可以从CreateService中使用,但它对我不起作用(可能是DSE)。相反,您应该创建一个新的SCManager和一个新的SCService,您应该做得很好。现在,ControlService为我返回true :)
https://stackoverflow.com/questions/43767323
复制相似问题