【发布时间】:2017-05-03 18:16:18
【问题描述】:
我的 OP 是 Windows 7 64bit。我正在加载一个带有 DSEfix 的驱动程序(绕过 Windows 的驱动程序签名强制),它工作得很好。 IOCTL 请求按应有的方式执行,但每当我尝试卸载驱动程序时,它都会失败:ControlService(hService, SERVICE_CONTROL_STOP, &ss,错误代码为 Invalid Handle。
这是我的驱动程序条目:
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;
}
【问题讨论】:
-
ControlService 失败,错误代码为 Invalid Handle - 所以
The specified handle was not obtained using CreateService or OpenService, or the handle is no longer valid.- 这里有什么不清楚的地方?您使用 hService 作为全局变量,这对于这段代码来说已经非常丑陋且不专业。您如何获得此句柄,它是否未更改或关闭-不可见-您未粘贴相关代码 -
@RbMm 正如我所写,我正在使用 CreateServiceA 获取句柄。它适用于使用驱动程序加载和 IOCTL。但是对于卸载它变得无效?我可以尝试使用 OpenService 再次获取它,但我不明白为什么句柄会有所不同。
-
但错误代码是自己说的。从另一边,您可以直接致电ZwUnloadDriver - 它返回哪个 NTSTATUS 以及什么结果?为什么你的 hService 是全局变量?!?
-
好吧,我有 2 个不同的 cpp,一个具有所有功能,加载驱动程序,卸载驱动程序,启用 DSE....然后我有 cpp,它调用正确的所有功能命令。我实际上不知道为什么将变量设置为全局变量会不利,但我想知道:)
-
我刚刚尝试了 ZmUnloadDriver,结果完全一样。再次无效句柄。让我困惑的是,如果我尝试 'OpenServiceA(hSCManager, Driver, SC_MANAGER_ALL_ACCESS);',返回的句柄无效.. 但我不知道为什么,因为我的驱动程序正在运行。