我的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;
}
* ControlService *失敗,錯誤代碼爲無效句柄 - 因此'指定的句柄不是使用CreateService或OpenService獲得的,或者句柄不再有效。「 - 什麼在這裏不清楚?你使用* hService *作爲全局變量,這個代碼已經非常醜陋而且不專業。你如何獲得這個句柄,它不會被修改或關閉 - 不可見 - 你不會粘貼相關的代碼 – RbMm
@RbMm正如我寫的,我得到了CreateServiceA的句柄。它適用於驅動程序加載和IOCTL。對於卸載,但它變得無效?我可以嘗試使用OpenService再次獲得它,但我不明白爲什麼句柄會有所不同。 –
但錯誤代碼說自己。從另一方面你可以直接調用[ZwUnloadDriver](https://msdn.microsoft.com/en-us/library/windows/hardware/ff567117(v = vs.85).aspx) - 哪個* NTSTATUS *它返回並什麼結果?以及爲什麼你的* hService *是全局變量?!? – RbMm