Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
(C/Windows)无法卸载驱动程序_C_Windows_Driver - Fatal编程技术网

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

(C/Windows)无法卸载驱动程序,c,windows,driver,C,Windows,Driver,我的OP是Windows 7 64位。我正在用DSEfix加载一个驱动程序(绕过Windows中的驱动程序标志强制),这很好。IOCTL请求按其应该的方式执行,但每当我尝试卸载驱动程序时,它都会失败:ControlService(hsservice,SERVICE\u CONTROL\u STOP,&ss,错误代码为无效句柄 这是我的驾驶记录: NTSTATUS DriverEntry(PDRIVER_OBJECT Object, PUNICODE_STRING RegistryPath) {

我的OP是Windows 7 64位。我正在用DSEfix加载一个驱动程序(绕过Windows中的驱动程序标志强制),这很好。IOCTL请求按其应该的方式执行,但每当我尝试卸载驱动程序时,它都会失败:
ControlService(hsservice,SERVICE\u CONTROL\u 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);
}
在用户模式方面,当从
CreateServiceA
加载驱动程序和hsservice时,我从
OpenSCManagerA(NULL,NULL,SC\u MANAGER\u CREATE\u 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;
}
bool UnloadDriver()
{
如果(!hSCManager)返回false;
如果(!hs服务)返回false;

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


所以我发现CreateService获得的SC_句柄无效。尽管MSDN上说可以从CreateService使用该句柄,但它对我不起作用(可能是DSE)。你应该只创建一个新的SCManager和一个新的SCService,你应该可以开始了。现在ControlService为我返回true:)

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


所以我发现CreateService获得的SC_句柄无效。尽管MSDN上说可以从CreateService使用该句柄,但它对我不起作用(可能是DSE)。您只需创建一个新的SCManager和一个新的SCService,就可以了。现在ControlService为我返回true:)

ControlService失败,错误代码为无效句柄-因此
指定的句柄不是使用CreateService或OpenService获得的,或者句柄不再有效。
-这里是什么ear?您使用hService作为全局变量,这已经非常难看了,对于这段代码来说并不专业。您是如何获得这个句柄的,它是否没有更改或关闭-不可见-您没有粘贴相关code@RbMm正如我所写的,我正在获得CreateServiceA的句柄。它用于加载和IOCTL驱动程序。用于卸载,但是mes未验证?我可以尝试使用OpenService再次获取它,但我不明白为什么句柄会有所不同。但错误代码自行说明。从另一个方面,您可以直接调用-返回哪个NTSTATUS和什么结果?以及为什么您的hService是全局变量?!嗯,我有两个不同的cpp,一个包含所有函数本身,加载驱动器r、 卸载驱动程序,启用DSE…然后我有一个cpp,它以正确的顺序调用所有函数。我不知道为什么变量是全局的是一个缺点,我想知道:)我只是尝试了zUnloaddRiver,结果完全一样。再一次无效的句柄。如果我尝试“OpenServiceA”(hSCManager、驱动程序、SC\u MANAGER\u ALL\u访问);,返回的句柄无效..但我不知道为什么,因为我的驱动程序正在运行。ControlService失败,错误代码为无效句柄-因此
指定的句柄不是使用CreateService或OpenService获得的,或者句柄不再有效。
-这里有什么不清楚的地方?您使用HSService作为全局变量,这已经非常复杂丑陋的和不专业的代码。你如何获得这个句柄,它是不是没有改变或关闭-不可见-你没有粘贴相关code@RbMm正如我所写的,我正在用CreateServiceA获取句柄。它用于加载和IOCTL驱动程序。对于卸载,但它变得无效?我可以尝试用OpenService再次获取它,但是我不明白为什么句柄会不同。但是错误代码是由self说的。从另一个方面,你可以直接调用-它返回哪个NTSTATUS和什么结果?为什么你的hService是全局变量?!好吧,我有两个不同的cpp,一个包含所有函数本身,加载驱动程序,卸载驱动程序,启用DSE…然后我有cpp w它以正确的顺序调用所有函数。我不知道为什么变量是全局变量是一个缺点,但我想知道:)我只是尝试了ZmUnloadDriver,字面上是相同的结果。再一次无效的句柄。如果我尝试“OpenServiceA”(hSCManager,Driver,SC_MANAGER_all_ACCESS),我会有什么困惑,返回的句柄无效..但我不知道为什么,因为我的驱动程序正在运行。