PnpMgr分析
+ -

ReactOS 卸载驱动IopUnloadDriver

2021-07-13 245 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后对象自动销毁

0 篇笔记 写笔记

ReactOS 卸载驱动IopUnloadDriver
内核卸载驱动调用的函数是NtUnloadDriver,这个函数只是对IopUnloadDriver的包装。NTSTATUS NTAPINtUnloadDriver(IN PUNICODE_STRING DriverServiceName){ return IopUnloadDriver(......
ReactOS 根据名称获取对象指针ObReferenceObjectByName
ObReferenceObjectByName在Windows中是一个未文档化的函数,其功能是通过名称获取对象指针。其函数原型为:NTKERNELAPINTSTATUSNTAPIObReferenceObjectByName ( _In_ PUNICODE_STRING Object......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!