2017-05-03 122 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對我來說是正確的:)