NT式驱动的基本结构3 - DriverUnload例程

本文详细描述了在NT式驱动中,DriverUnload例程如何在驱动卸载时删除设备对象及关联的符号链接,通过示例代码展示了IoDeleteDevice和IoDeleteSymbolicLink的使用方法。
摘要由CSDN通过智能技术生成

在驱动对象中会设置DriverUnload例程,此例程在驱动被卸载的时候调用。在NT式驱动中,DriverUnload一般负责删除在DriverEntry中创建的设备对象,并且将设备对象所关联的符号链接删除。另外DriverUnload还负责对一些资源进行回收。如:

#pragma PAGEDCODE
VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject) 
{
    PDEVICE_OBJECT    pNextObj;
    KdPrint(("Enter DriverUnload\n"));
    // 得到下一个设备对象
    pNextObj = pDriverObject->DeviceObject;
    
    // 枚举所有设备对象
    while (pNextObj != NULL) 
    {
        // 得到设备扩展
        PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pNextObj->DeviceExtension;

        //删除符号链接
        UNICODE_STRING pLinkName = pDevExt->ustrSymLinkName;
        IoDeleteSymbolicLink(&pLinkName);
        pNextObj = pNextObj->NextDevice;
        
        // 删除设备
        IoDeleteDevice( pDevExt->pDevice );
    }
}

在HelloDDKUnload中传进来驱动对象。前面讲过,根据驱动对象,就可以遍历所有由该驱动对象创建的设备对象。通过驱动对象的DeviceObject域,可以找到驱动对象的第一个设备对象,然后根据设备对象的NextDevice域,就可以找到随后的设备对象。在HelloDDK这个例子中,驱动对象起始只创建了一个设备对象。因此,在HelloDDKUnload的调用中,也只会删除一个设备对象。

删除设备对象的函数是IoDeleteDevice,函数原型是:

VOID IoDeleteDevice(
    IN PDEVICE_OBJECT DeviceObject
    );


    
其参数就是要删除的设备的对象指针。在DriverUnload中,除了要删除设备对象,同时,还要对设备对象关联的符号链接进行删除。删除符号链接的函数是IoDeleteSymbolicLink,其函数原型是:

NTSTATUS IoDeleteSymbolicLink(
    IN PUNICODE_STRING SymbolicLinkName
    );
//* SymbolicLinkName: 表示已经被注册了的符号链接
//* 返回值:表示删除符号链接是否成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WendyWJGu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值