我的OP是Windows 7 64位。我正在使用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);
}
在用户模式方面,当从OpenSCManagerA(NULL, NULL, SC_MANAGER_CREATE_SERVICE)
加载驱动程序和hService时,我从CreateServiceA
获得hSCManager。两者都有效,并且可以正常加载驱动程序。
这是我在usermode中的卸载驱动程序函数:
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 :(得分:0)
好吧,正如RbMm提到的那样,我忽略了删除注册表项......好吧,但是在我移动代码之后,我仍然无法卸载我的驱动程序。
所以我发现CreateService获得的SC_HANDLE无效。虽然它在MSDN上说可以从CreateService使用句柄,但它对我不起作用(可能是DSE)。你应该只创建一个新的SCManager和一个新的SCService,你应该好好去。现在ControlService为我返回true:)