ReactOS 卸载驱动IopUnloadDriver
2021-07-13
256
0
内核卸载驱动调用的函数是NtUnloadDriver,这个函数只是对IopUnloadDriver的包装。
NTSTATUS NTAPI
NtUnloadDriver(IN PUNICODE_STRING DriverServiceName)
{
return IopUnloadDriver(DriverServiceName, FALSE);
}
驱动在卸载时是根据服务名来卸载的,这个服务名一般是sys文件的名称,在winobj中查看就是对应的名称。
IopUnloadDriver执行流程
IopUnloadDriver函数的执行比较简单:
首先是根据给定的驱动服务名构造驱动名象名,构告的方法比较简单,就是在其服务名上加上驱动路径名。如驱动服务名为pci的驱动象象,其对象名称为: \Driver\pci,其具体代码如下:
Start = wcsrchr(DriverServiceName->Buffer, L'\\'); if (Start == NULL) Start = DriverServiceName->Buffer; else Start++; RtlInitUnicodeString(&ServiceName, Start); /* * Construct the driver object name */ ObjectName.Length = ((USHORT)wcslen(Start) + 8) * sizeof(WCHAR); ObjectName.MaximumLength = ObjectName.Length + sizeof(WCHAR); ObjectName.Buffer = ExAllocatePool(PagedPool, ObjectName.MaximumLength); if (!ObjectName.Buffer) return STATUS_INSUFFICIENT_RESOURCES; wcscpy(ObjectName.Buffer, L"\\Driver\\"); memcpy(ObjectName.Buffer + 8, Start, ObjectName.Length - 8 * sizeof(WCHAR)); ObjectName.Buffer[ObjectName.Length/sizeof(WCHAR)] = 0;
构造成功驱动名称名称后,调用ObReferenceObjectByName获取驱动对象指针。
- 在注册表中查找该驱动的ImagePath键值,如获取到的为 System32\drivers\pci.sys,然后调用IopNormalizeImagePath函数标准化驱动名称,获取全路径。
- 对该驱动下的所有设备设置DOE_UNLOAD_PENDING标志。
- 调用驱动对象的DriverUnload例程(需要在PsInitialSystemProcess环境下,否则启动工作线程)
- 调了ObMakeTemporaryObject函数
- 对驱动对象引用计数减2,这样引用计数变为0后对象自动销毁